Teach 'svnadmin hotcopy' (both incremental and non-incremental) to report
progress when copying revisions and packed shards.  Currently, this is only
supported for FSFS repositories.  A sample output may look like this...

  * Copied revision 0.
  * Copied revision 1.
  * Copied revision 2.
  * Copied revision 3.

...or like this (for packed repositories):

  * Copied revisions from 0 to 999.
  * Copied revisions from 1000 to 1999.
  * Copied revision 2000.
  * Copied revision 2001.
  * Copied revision 2002.
  * Copied revision 2003.

In short, if and only if we created or updated something in the hotcopy
destination, the caller is notified about this.  These notifications (hence,
the 'svnadmin' output) are guaranteed to arrive in ascending order, but may
contain gaps in the incremental mode.  The reason for this is that sometimes
we need to re-copy data that was modified in the hotcopy source, e.g. due
to revision property changes.

As it is with other similar operations, 'svnadmin hotcopy' now accepts the
--quiet option, but the progress output is enabled by default.

* subversion/include/svn_repos.h
  (svn_repos_notify_action_t): Add 'svn_repos_notify_hotcopy_rev_range'.
    This new notification type allows us to track the hotcopy progress.
  (svn_repos_notify_t): Support start and end revisions coming with the
    new notification type.
  (svn_repos_hotcopy3): New version of svn_repos_hotcopy2() accepting a
    notify func and the corresponding baton.
  (svn_repos_hotcopy2): Deprecate.

* subversion/libsvn_repos/repos.c
  (fs_hotcopy_notify_baton_t, fs_hotcopy_notify): New.
  (svn_repos_hotcopy3): Marshal notifications from the FS layer in this
    newly added replacement for svn_repos_hotcopy2().
  (svn_repos_hotcopy2): Preserve the original behavior by calling
    svn_repos_hotcopy3() without the notification support.

* subversion/include/svn_fs.h
  (svn_fs_hotcopy_notify_t): New.
  (svn_fs_hotcopy3): New version of svn_fs_hotcopy2() accepting a
    notify func and the corresponding baton.
  (svn_fs_hotcopy2): Deprecate.

* subversion/libsvn_fs/fs-loader.h
  (fs_library_vtable_t.hotcopy): Now accepts a notify func and a baton.

* subversion/libsvn_fs/fs-loader.c
  (svn_fs_hotcopy3): Call the corresponding vtable member and pass the
    notify func and baton arguments this newly added replacement for
    svn_fs_hotcopy2().
  (svn_fs_hotcopy2): Preserve the original behavior by calling
    svn_fs_hotcopy3() without the notification support.

* subversion/libsvn_fs_fs/fs.c
  (fs_hotcopy): Add the notify func and baton arguments.  Pass them when
    invoking the hotcopy.

* subversion/libsvn_fs_base/fs.c
  (base_hotcopy): Now accepts a notify func and a baton.

* subversion/libsvn_fs_x/fs.c
  (x_hotcopy): Now accepts a notify func and a baton.

* subversion/libsvn_fs_fs/hotcopy.h
  (svn_fs_fs__hotcopy): Now accepts a notify func and a baton.

* subversion/libsvn_fs_fs/hotcopy.c
  (hotcopy_io_dir_file_copy): Add an optional flag and unset it whenever we
    did copy the file.  Hotcopy skips files that do not differ in terms of
    kind, size, and mtime and we want to be able to distinguish situations
    where the file was actually copied.
  (hotcopy_io_copy_dir_recursively, hotcopy_copy_shard_file): Add the same
    optional flag argument and push it down the stack.  These functions
    eventually end up with calling hotcopy_io_dir_file_copy() and we want
    them to unset the corresponding flag whenever at least one file was
    copied.
  (hotcopy_revisions, hotcopy_revisions_old): Initialize the 'skipped' flag
    and notify the caller in case it was unset by the corresponding copy
    routines (for revisions and packed shards).
  (hotcopy_body_baton): Add the notify func and baton fields.
  (hotcopy_body): Pass the notify func and baton to the revision copying
    functions.  Do not ask whether we actually copied something during
    the part when we copy the 'db/node-origins/' cache, because we are
    not interested.
  (svn_fs_fs__hotcopy): Push the notify func and baton fields down to
    hotcopy_body() via the corresponding 'hotcopy_body_baton'.

* subversion/svnadmin/svnadmin.c
  (cmd_table."hotcopy"): Enable the '--quiet' option.
  (repos_notify_handler): Handle the new 'svn_repos_notify_hotcopy_rev_range'
    notification.  Tweak the docstring.
  (subcommand_hotcopy): Create the feedback stream iff running in non-quiet
    mode.  Call svn_repos_hotcopy3() instead of svn_repos_hotcopy2(); pass
    the appropriate notify handler.

* subversion/tests/cmdline/svnadmin_tests.py
  (fsfs_hotcopy_progress, fsfs_hotcopy_progress_with_revprop_changes,
   fsfs_hotcopy_progress_old): New.
  (test_list): Add references to new tests.


git-svn-id: https://svn.apache.org/repos/asf/subversion/trunk@1613339 13f79535-47bb-0310-9956-ffa450edef68