You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2010/04/09 12:17:58 UTC

svn commit: r932335 - in /subversion/trunk/subversion: include/svn_repos.h libsvn_repos/deprecated.c libsvn_repos/dump.c

Author: rhuijben
Date: Fri Apr  9 10:17:58 2010
New Revision: 932335

URL: http://svn.apache.org/viewvc?rev=932335&view=rev
Log:
Make it easier to use some of the common repository management functions
from a GUI by providing per revision progress via a callback instead
of a stream. This allows applications to provide better progress than
just showing a text window on these lengthy operations.

* subversion/include/svn_repos.h
  (svn_repos_progress_func_t): New typedef.
  (svn_repos_verify_fs2): New function.
  (svn_repos_verify_fs): Deprecate function.
  (svn_repos_dump_fs3): New function.
  (svn_repos_dump_fs2): Deprecate function.

* subversion/libsvn_repos/deprecated.c
  (progress_baton): New struct.
  (repos_progress_handler): New function.
  (svn_repos_dump_fs2): New function.
  (svn_repos_verify_fs): New function.

* subversion/libsvn_repos/dump.c
  (edit_baton): Store function and baton instead of stream.
  (dump_node): Call progress handler instead of writing to stream.
  (get_dump_editor): Accept progress handler instead of stream.
  (svn_repos_dump_fs2): Rename to ...
  (svn_repos_dump_fs3): ... this and accept progress function instead
    of a stream. Call handler instead of writing localized output.
  (svn_repos_verify_fs): Rename to ...
  (svn_repos_verify_fs2): ... this and accept progress function instead of
    of a stream. Call handler instead of writing localized output.

Modified:
    subversion/trunk/subversion/include/svn_repos.h
    subversion/trunk/subversion/libsvn_repos/deprecated.c
    subversion/trunk/subversion/libsvn_repos/dump.c

Modified: subversion/trunk/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_repos.h?rev=932335&r1=932334&r2=932335&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_repos.h (original)
+++ subversion/trunk/subversion/include/svn_repos.h Fri Apr  9 10:17:58 2010
@@ -2115,6 +2115,15 @@ enum svn_repos_load_uuid
   svn_repos_load_uuid_force
 };
 
+/** Callback for providing per revision progress while dumping or verifying
+ *  the repository.
+ *
+ * @since New in 1.7. */
+typedef svn_error_t *(*svn_repos_progress_func_t)(void *baton,
+                                                  svn_revnum_t rev,
+                                                  const char *warning_text,
+                                                  apr_pool_t *scratch_pool);
+
 
 /**
  * Verify the contents of the file system in @a repos.
@@ -2126,12 +2135,31 @@ enum svn_repos_load_uuid
  * revision 0.  If @a end_rev is #SVN_INVALID_REVNUM, then verify
  * through the @c HEAD revision.
  *
+ * For every verified revision call @a progress_func with @a rev set to
+ * the verified revision and @a warning_text @c NULL. For warnings call @a
+ * progress_func with @a warning_text set.
+ *
  * If @a cancel_func is not @c NULL, call it periodically with @a
  * cancel_baton as argument to see if the caller wishes to cancel the
  * verification.
+ */
+svn_error_t *
+svn_repos_verify_fs2(svn_repos_t *repos,
+                     svn_revnum_t start_rev,
+                     svn_revnum_t end_rev,
+                     svn_repos_progress_func_t progress,
+                     void *progress_baton,
+                     svn_cancel_func_t cancel,
+                     void *cancel_baton,
+                     apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_repos_verify_fs2(), but with a feedback_stream instead of
+ * handling feedback via the progress_func handler
  *
  * @since New in 1.5.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_repos_verify_fs(svn_repos_t *repos,
                     svn_stream_t *feedback_stream,
@@ -2141,7 +2169,6 @@ svn_repos_verify_fs(svn_repos_t *repos,
                     void *cancel_baton,
                     apr_pool_t *pool);
 
-
 /**
  * Dump the contents of the filesystem within already-open @a repos into
  * writable @a dumpstream.  Begin at revision @a start_rev, and dump every
@@ -2165,12 +2192,37 @@ svn_repos_verify_fs(svn_repos_t *repos,
  * be done with full plain text.  A dump with @a use_deltas set cannot
  * be loaded by Subversion 1.0.x.
  *
+ * For every dumped revision call @a progress_func with @a rev set to the
+ * dumped revision and @a warning_text @c NULL. For warnings call @a
+ * progress_func with @a warning_text.
+ *
  * If @a cancel_func is not @c NULL, it is called periodically with
  * @a cancel_baton as argument to see if the client wishes to cancel
  * the dump.
  *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_repos_dump_fs3(svn_repos_t *repos,
+                   svn_stream_t *dumpstream,
+                   svn_revnum_t start_rev,
+                   svn_revnum_t end_rev,
+                   svn_boolean_t incremental,
+                   svn_boolean_t use_deltas,
+                   svn_repos_progress_func_t progress_func,
+                   void *progress_baton,
+                   svn_cancel_func_t cancel_func,
+                   void *cancel_baton,
+                   apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_repos_dump_fs3(), but with a feedback_stream instead of
+ * handling feedback via the progress_func handler
+ *
  * @since New in 1.1.
+ * @deprecated Provided for backward compatibility with the 1.6 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_repos_dump_fs2(svn_repos_t *repos,
                    svn_stream_t *dumpstream,
@@ -2183,7 +2235,6 @@ svn_repos_dump_fs2(svn_repos_t *repos,
                    void *cancel_baton,
                    apr_pool_t *pool);
 
-
 /**
  * Similar to svn_repos_dump_fs2(), but with the @a use_deltas
  * parameter always set to @c FALSE.

Modified: subversion/trunk/subversion/libsvn_repos/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/deprecated.c?rev=932335&r1=932334&r2=932335&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/deprecated.c (original)
+++ subversion/trunk/subversion/libsvn_repos/deprecated.c Fri Apr  9 10:17:58 2010
@@ -428,6 +428,95 @@ svn_repos_dump_fs(svn_repos_t *repos,
                             cancel_baton, pool);
 }
 
+/* Baton for repos_progress_handler */
+struct progress_baton
+{
+  svn_boolean_t dumping;
+  svn_stream_t *feedback_stream;
+};
+
+/* Implementation of svn_repos_progress_func_t to wrap the output to a
+   response stream for svn_repos_dump_fs2() and svn_repos_verify_fs() */
+static svn_error_t *
+repos_progress_handler(void * baton,
+                       svn_revnum_t revision,
+                       const char *warning_text,
+                       apr_pool_t *scratch_pool)
+{
+  struct progress_baton *pb = baton;
+
+  if (warning_text != NULL)
+    {
+      apr_size_t len = strlen(warning_text);
+      SVN_ERR(svn_stream_write(pb->feedback_stream, warning_text, &len));
+    }
+  else
+    SVN_ERR(svn_stream_printf(pb->feedback_stream, scratch_pool,
+                              pb->dumping
+                              ? _("* Dumped revision %ld.\n")
+                              : _("* Verified revision %ld.\n"),
+                              revision));
+
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_repos_dump_fs2(svn_repos_t *repos,
+                   svn_stream_t *stream,
+                   svn_stream_t *feedback_stream,
+                   svn_revnum_t start_rev,
+                   svn_revnum_t end_rev,
+                   svn_boolean_t incremental,
+                   svn_boolean_t use_deltas,
+                   svn_cancel_func_t cancel_func,
+                   void *cancel_baton,
+                   apr_pool_t *pool)
+{
+  struct progress_baton pb;
+  pb.dumping = (stream != NULL); /* Show verify messages if stream is NULL */
+  pb.feedback_stream = feedback_stream;
+
+  return svn_error_return(svn_repos_dump_fs3(repos,
+                                             stream,
+                                             start_rev,
+                                             end_rev,
+                                             incremental,
+                                             use_deltas,
+                                             feedback_stream
+                                               ? repos_progress_handler
+                                               : NULL,
+                                             &pb,
+                                             cancel_func,
+                                             cancel_baton,
+                                             pool));
+}
+
+svn_error_t *
+svn_repos_verify_fs(svn_repos_t *repos,
+                    svn_stream_t *feedback_stream,
+                    svn_revnum_t start_rev,
+                    svn_revnum_t end_rev,
+                    svn_cancel_func_t cancel_func,
+                    void *cancel_baton,
+                    apr_pool_t *pool)
+{
+  struct progress_baton pb;
+  pb.dumping = FALSE;
+  pb.feedback_stream = feedback_stream;
+
+  return svn_error_return(svn_repos_verify_fs2(repos,
+                                               start_rev,
+                                               end_rev,
+                                               feedback_stream
+                                                 ? repos_progress_handler
+                                                 : NULL,
+                                               &pb,
+                                               cancel_func,
+                                               cancel_baton,
+                                               pool));
+}
+
 /*** From load.c ***/
 static svn_repos_parser_fns_t *
 fns_from_fns2(const svn_repos_parse_fns2_t *fns2,

Modified: subversion/trunk/subversion/libsvn_repos/dump.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump.c?rev=932335&r1=932334&r2=932335&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/dump.c (original)
+++ subversion/trunk/subversion/libsvn_repos/dump.c Fri Apr  9 10:17:58 2010
@@ -180,7 +180,8 @@ struct edit_baton
   svn_stream_t *stream;
 
   /* Send feedback here, if non-NULL */
-  svn_stream_t *feedback_stream;
+  svn_repos_progress_func_t progress_func;
+  void *progress_baton;
 
   /* The fs revision root, so we can read the contents of paths. */
   svn_fs_root_t *fs_root;
@@ -416,15 +417,21 @@ dump_node(struct edit_baton *eb,
         }
       else
         {
-          if (!eb->verify && cmp_rev < eb->oldest_dumped_rev)
-            SVN_ERR(svn_stream_printf
-                    (eb->feedback_stream, pool,
+          if (!eb->verify && cmp_rev < eb->oldest_dumped_rev
+              && eb->progress_func)
+            {
+              const char *warning = apr_psprintf(
+                     pool,
                      _("WARNING: Referencing data in revision %ld,"
                        " which is older than the oldest\n"
                        "WARNING: dumped revision (%ld).  Loading this dump"
                        " into an empty repository\n"
                        "WARNING: will fail.\n"),
-                     cmp_rev, eb->oldest_dumped_rev));
+                     cmp_rev, eb->oldest_dumped_rev);
+
+              SVN_ERR(eb->progress_func(eb->progress_baton,
+                                        eb->oldest_dumped_rev, warning, pool));
+            }
 
           SVN_ERR(svn_stream_printf(eb->stream, pool,
                                     SVN_REPOS_DUMPFILE_NODE_COPYFROM_REV
@@ -845,7 +852,8 @@ get_dump_editor(const svn_delta_editor_t
                 svn_revnum_t to_rev,
                 const char *root_path,
                 svn_stream_t *stream,
-                svn_stream_t *feedback_stream,
+                svn_repos_progress_func_t progress_func,
+                void *progress_baton,
                 svn_revnum_t oldest_dumped_rev,
                 svn_boolean_t use_deltas,
                 svn_boolean_t verify,
@@ -859,7 +867,8 @@ get_dump_editor(const svn_delta_editor_t
 
   /* Set up the edit baton. */
   eb->stream = stream;
-  eb->feedback_stream = feedback_stream;
+  eb->progress_func = progress_func;
+  eb->progress_baton = progress_baton;
   eb->oldest_dumped_rev = oldest_dumped_rev;
   eb->bufsize = sizeof(eb->buffer);
   eb->path = apr_pstrdup(pool, root_path);
@@ -953,13 +962,14 @@ write_revision_record(svn_stream_t *stre
 
 /* The main dumper. */
 svn_error_t *
-svn_repos_dump_fs2(svn_repos_t *repos,
+svn_repos_dump_fs3(svn_repos_t *repos,
                    svn_stream_t *stream,
-                   svn_stream_t *feedback_stream,
                    svn_revnum_t start_rev,
                    svn_revnum_t end_rev,
                    svn_boolean_t incremental,
                    svn_boolean_t use_deltas,
+                   svn_repos_progress_func_t progress_func,
+                   void *progress_baton,
                    svn_cancel_func_t cancel_func,
                    void *cancel_baton,
                    apr_pool_t *pool)
@@ -972,7 +982,6 @@ svn_repos_dump_fs2(svn_repos_t *repos,
   svn_revnum_t youngest;
   const char *uuid;
   int version;
-  svn_boolean_t dumping = (stream != NULL);
 
   /* Determine the current youngest revision of the filesystem. */
   SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool));
@@ -984,8 +993,6 @@ svn_repos_dump_fs2(svn_repos_t *repos,
     end_rev = youngest;
   if (! stream)
     stream = svn_stream_empty(pool);
-  if (! feedback_stream)
-    feedback_stream = svn_stream_empty(pool);
 
   /* Validate the revisions. */
   if (start_rev > end_rev)
@@ -1068,8 +1075,8 @@ svn_repos_dump_fs2(svn_repos_t *repos,
          non-incremental dump. */
       use_deltas_for_rev = use_deltas && (incremental || i != start_rev);
       SVN_ERR(get_dump_editor(&dump_editor, &dump_edit_baton, fs, to_rev,
-                              "/", stream, feedback_stream, start_rev,
-                              use_deltas_for_rev, FALSE, subpool));
+                              "/", stream, progress_func, progress_baton,
+                              start_rev, use_deltas_for_rev, FALSE, subpool));
 
       /* Drive the editor in one way or another. */
       SVN_ERR(svn_fs_revision_root(&to_root, fs, to_rev, subpool));
@@ -1100,11 +1107,8 @@ svn_repos_dump_fs2(svn_repos_t *repos,
         }
 
     loop_end:
-      SVN_ERR(svn_stream_printf(feedback_stream, pool,
-                                dumping
-                                ? _("* Dumped revision %ld.\n")
-                                : _("* Verified revision %ld.\n"),
-                                to_rev));
+      if (progress_func)
+        SVN_ERR(progress_func(progress_baton, to_rev, NULL, subpool));
     }
 
   svn_pool_destroy(subpool);
@@ -1176,13 +1180,14 @@ verify_close_directory(void *dir_baton,
 }
 
 svn_error_t *
-svn_repos_verify_fs(svn_repos_t *repos,
-                    svn_stream_t *feedback_stream,
-                    svn_revnum_t start_rev,
-                    svn_revnum_t end_rev,
-                    svn_cancel_func_t cancel_func,
-                    void *cancel_baton,
-                    apr_pool_t *pool)
+svn_repos_verify_fs2(svn_repos_t *repos,
+                     svn_revnum_t start_rev,
+                     svn_revnum_t end_rev,
+                     svn_repos_progress_func_t progress_func,
+                     void *progress_baton,
+                     svn_cancel_func_t cancel_func,
+                     void *cancel_baton,
+                     apr_pool_t *pool)
 {
   svn_fs_t *fs = svn_repos_fs(repos);
   svn_revnum_t youngest;
@@ -1197,8 +1202,6 @@ svn_repos_verify_fs(svn_repos_t *repos,
     start_rev = 0;
   if (! SVN_IS_VALID_REVNUM(end_rev))
     end_rev = youngest;
-  if (! feedback_stream)
-    feedback_stream = svn_stream_empty(pool);
 
   /* Validate the revisions. */
   if (start_rev > end_rev)
@@ -1226,7 +1229,8 @@ svn_repos_verify_fs(svn_repos_t *repos,
       /* Get cancellable dump editor, but with our close_directory handler. */
       SVN_ERR(get_dump_editor((const svn_delta_editor_t **)&dump_editor,
                               &dump_edit_baton, fs, rev, "",
-                              svn_stream_empty(pool), feedback_stream,
+                              svn_stream_empty(pool), 
+                              progress_func, progress_baton,
                               start_rev,
                               FALSE, TRUE, /* use_deltas, verify */
                               iterpool));
@@ -1242,9 +1246,9 @@ svn_repos_verify_fs(svn_repos_t *repos,
                                 cancel_editor, cancel_edit_baton,
                                 NULL, NULL, iterpool));
       SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, iterpool));
-      SVN_ERR(svn_stream_printf(feedback_stream, iterpool,
-                                _("* Verified revision %ld.\n"),
-                                rev));
+
+      if (progress_func)
+        SVN_ERR(progress_func(progress_baton, rev, NULL, iterpool));
     }
 
   svn_pool_destroy(iterpool);