Added:
- Class AMRecursiveDirectoryCompare ~ Created by David Chevrier,
essentially recursively checks for differences between two directories
and returns states:
FullyMatchingResult = All files in directories match
Side1ModifiedResult = Side1 contains files not in Side2
Side2ModifiedResult = Side2 contains files not in Side1
BothSidesModifiedResult = Both Sides contain files not in the other

-  Class AMDirectorySynchronizer ~ Takes two directory paths (source and
destination), validates that (ensures that exist, attempts to create if
they don't), runs a AMRecursiveDirectoryCompare on them, and if the
result is a full match, then copies the source into the destination
using cp -u -r
Added:
- AMRecursiveDirectoryCompare::uniqueSide1Files(),
uniqueSide1Directories(), uniqueSide2Files() and
uniqueSide2Directories() ~ to obtain the list results of the compare

- Changed the logic of AMDirectorySynchronizer::start() to copy based on
the results of AMRecursiveDirectoryCompare results
Added:
- AMDirectorySynchronizer::progressMessages and errorMessages ~
QStringLists containing output relating to the sync
- AMDirectorySynchronizer::percentageProgress ~ value representing the
percent progress of the copy process
- AMDirectorySynchronizerDialog ~ Modal dialog which controls and shows
results of the sync (eventually this will become the message dialog
shown to the user)
Altered:
- The AMDirectorySynchronizerDialog is now actually a modal dialog
- AMDirectorySynchronizerDialog now contains a progress bar
- AMDirectorySynchronizerDialog is now designed to show and close
automatically depending on the running of the copy (call
AMDirectorySynchronizerDialog::start() to start the copy)
Altered:
- Rsync args used by AMDirectorySynchronizer
- AMRecursiveDirectoryCompare::compareOneLevel to also build list of
files which are newer on one side over the other
Added:
- Class AMDirectorySynchronizationAction to wrap an
AMDirectorySynchronizer in an AMAction3 so it can be added to a workflow

Altered:
- AMDirectorySynchronizer::start now returns true indicating started
success if, when starting, it find that no copying is necessary. It then
uses a timer to wait for five seconds before emitting copyCompleted

-AMDirectorySynchronizer::errorMessagesChanged and
progressMessagesChanged to now emit a single QString rather than the
whole list
Modified:
- AMUserSettings::remoteDataFolder ~ stores value from ini file (if no
value in found in the ini file for this key, then it will be blank)
- Altered the AMDirectorySynchronizer and
AMDirectorySynchronizationAction to load remote and local directories
from the ini settings
- AMSettings window to show the remoteDataFolder
Initial changes to attempt to develop a locking mechanism for db files
during copy
Removed:

- Initial tests from AMDatabase relating to locking and unlocking using
PRAGMA (was unstable)
- Registering of AMDirectorySynchronizationAction in AMAppController

Added:
- More documentation to class AMDirectorySynchronizationAction
- AMDatamanAppController::startupBackupDataDirectory() ~ function to run
modal dialog if AM is started with remote directory in ini file

Altered:
- AMDirectorySynchronizerDialog::start() now runs exec instead of show,
in order to ensure that the AMDatamanAppController startup is blocked
till the dialog is complete.
- AMDatamanAppController::startup() now includes a call to
startBackupDataDirectory
Altered:
- AMDirectorySynchronizerDialog::start() ~ Now returns a boolean value
depending on whether the sync was successful
- AMDatamanAppController::startup() ~ Now sets an AMErrorMon error if
the sync was not performed successfully (if a sync is necessary)
Altered:

- AMDatamanAppController::shutdown() ~ Now includes call to
startupBackupDataDirectory in order to ensure that data is synchronized
on closing AM
Altered:
- AMRecursiveDirectoryCompare now also checks to see if a more recent
file is smaller than the older file. Catches the corner case where AM
has created files for a new user, but the ones that we want to use are
on the remote. Stops loss of remote data

- AMDirectorySynchronizer now checks for the above mentioned state
before continuing
Altered:

- Order in which startup actions are performed in
AMDatamanAppController::startup() ~ Now checks if a backup is needed
before initializing for first time use. This means that if local
versions of files have been deleted, running AM will replace them,
instead of creating files as if it was a first time use, and then
writing over the remote files with the new blank ones.
- AMDirectorySynchronizerDialog::start() now displays a nice message to
the user if it encountered an error with the copy process before
starting.
- AMDirectorySynchronizer::start() now sets the percentage complete to
100% if it finds the files are already the same.
Altered:
AMDirectorySynchronizerDialog::start() ~ Now returns false if there was
an issue starting the sync
Starting to work on deployable stand alone directory synchronizer. Just reorganized some files and made a method public.
Fixed minor merge conflicts bringing branch Issue620 up to date with master.
Start on standalone version of the directory synchronizer.
Changed names in AMDirectorySynchronizer to be side1 and side2 rather than source and destintation. Added controls to allow (or disallow) creation of side1/side2 directories if they don't exist. Added an optional side1Name and side2Name to AMRecursiveDirectoryCompare for nicer debugging.
Making progress towards generic AMDirectorySynchronizer and Dialog class.
Removed unnecessary debugs and commented out code. Added feature to show the current file that's being copied.