Index: subversion/include/svn_client.h
===================================================================
--- subversion/include/svn_client.h	(revision 7944)
+++ subversion/include/svn_client.h	(working copy)
@@ -1338,6 +1338,22 @@
                            svn_client_ctx_t *ctx,
                            apr_pool_t *pool);
 
+
+
+/* Log message creation. */
+
+/** Return a default log message constructed from @a commit_items, allocated
+ * in @a pool.  If @a base_dir is given then subtract it from the path of the
+ * commit items.  If @a prefix is given then use it at the start of the
+ * message.  Used by svn_client_get_commit_log_t functions.
+ */
+const char *
+svn_client_get_default_log_message (apr_array_header_t *commit_items,
+                                    const char *base_dir,
+                                    const char *prefix,
+                                    apr_pool_t *pool);
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
Index: subversion/libsvn_client/commit.c
===================================================================
--- subversion/libsvn_client/commit.c	(revision 7944)
+++ subversion/libsvn_client/commit.c	(working copy)
@@ -1335,3 +1335,56 @@
 
   return reconcile_errors (cmt_err, unlock_err, bump_err, cleanup_err, pool);
 }
+
+
+const char *
+svn_client_get_default_log_message (apr_array_header_t *commit_items,
+                                    const char *base_dir,
+                                    const char *prefix,
+                                    apr_pool_t *pool)
+{
+  int i;
+  svn_stringbuf_t *tmp_message =
+    svn_stringbuf_create ((prefix ? prefix : ""), pool);
+
+  for (i = 0; i < commit_items->nelts; i++)
+    {
+      svn_client_commit_item_t *item =
+        APR_ARRAY_IDX (commit_items, i, svn_client_commit_item_t *);
+      const char *path = item->path;
+      char text_mod = '_', prop_mod = ' ';
+
+      if (! path)
+        path = item->url;
+      else if (! *path)
+        path = ".";
+
+      if (path && base_dir)
+        path = svn_path_is_child (base_dir, path, pool);
+
+      /* If still no path, then just use current directory. */
+      if (! path)
+        path = ".";
+
+      if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
+          && (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD))
+        text_mod = 'R';
+      else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
+        text_mod = 'A';
+      else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
+        text_mod = 'D';
+      else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)
+        text_mod = 'M';
+
+      if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)
+        prop_mod = 'M';
+
+      svn_stringbuf_appendbytes (tmp_message, &text_mod, 1); 
+      svn_stringbuf_appendbytes (tmp_message, &prop_mod, 1); 
+      svn_stringbuf_appendcstr (tmp_message, "   ");
+      svn_stringbuf_appendcstr (tmp_message, path);
+      svn_stringbuf_appendcstr (tmp_message, APR_EOL_STR);
+    }
+
+  return tmp_message->data;
+}
Index: subversion/clients/cmdline/util.c
===================================================================
--- subversion/clients/cmdline/util.c	(revision 7944)
+++ subversion/clients/cmdline/util.c	(working copy)
@@ -417,8 +417,6 @@
                          void *baton,
                          apr_pool_t *pool)
 {
-  const char *default_msg =
-    APR_EOL_STR EDITOR_EOF_PREFIX APR_EOL_STR APR_EOL_STR;
   struct log_msg_baton *lmb = baton;
   svn_stringbuf_t *message = NULL;
   
@@ -453,54 +451,18 @@
       /* We still don't have a valid commit message.  Use $EDITOR to
          get one.  Note that svn_cl__edit_externally will still return
          a UTF-8'ized log message. */
-      int i;
-      svn_stringbuf_t *tmp_message = svn_stringbuf_create (default_msg, pool);
+      const char *default_prefix =
+        APR_EOL_STR EDITOR_EOF_PREFIX APR_EOL_STR APR_EOL_STR;
+      const char *default_msg =
+        svn_client_get_default_log_message (commit_items, lmb->base_dir,
+                                            default_prefix, pool);
       svn_error_t *err = SVN_NO_ERROR;
       const char *msg2 = NULL;  /* ### shim for svn_cl__edit_externally */
 
-      for (i = 0; i < commit_items->nelts; i++)
-        {
-          svn_client_commit_item_t *item
-            = ((svn_client_commit_item_t **) commit_items->elts)[i];
-          const char *path = item->path;
-          char text_mod = '_', prop_mod = ' ';
-
-          if (! path)
-            path = item->url;
-          else if (! *path)
-            path = ".";
-
-          if (path && lmb->base_dir)
-            path = svn_path_is_child (lmb->base_dir, path, pool);
-
-          /* If still no path, then just use current directory. */
-          if (! path)
-            path = ".";
-
-          if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
-              && (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD))
-            text_mod = 'R';
-          else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
-            text_mod = 'A';
-          else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
-            text_mod = 'D';
-          else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)
-            text_mod = 'M';
-
-          if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)
-            prop_mod = 'M';
-
-          svn_stringbuf_appendbytes (tmp_message, &text_mod, 1); 
-          svn_stringbuf_appendbytes (tmp_message, &prop_mod, 1); 
-          svn_stringbuf_appendcstr (tmp_message, "   ");
-          svn_stringbuf_appendcstr (tmp_message, path);
-          svn_stringbuf_appendcstr (tmp_message, APR_EOL_STR);
-        }
-
       /* Use the external edit to get a log message. */
       err = svn_cl__edit_externally (&msg2, &lmb->tmpfile_left,
                                      lmb->editor_cmd, lmb->base_dir,
-                                     tmp_message->data, "svn-commit",
+                                     default_msg, "svn-commit",
                                      lmb->config, pool);
 
       /* Clean up the log message into UTF8/LF before giving it to


