[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-dev
Subject:    Re: retrieving revision properties with svn log
From:       Steffen Pingel <steffenp () gmx ! de>
Date:       2005-03-23 2:48:06
Message-ID: 200503230348.06784.steffenp () gmx ! de
[Download RAW message or body]

Hi,

I have hacked a bit on the subversion code in the last few days and 
implemented a new switch for svn log called propname. The switch can be used 
to include a revision property for each revision in the log, e.g.:

# svn log --propname statcvs:loc --xml
[...]
<logentry
   revision="3">
<author>stp</author>
<date>2005-03-22T14:49:20.341602Z</date>
<msg>Message</msg>
<property
   name="statcvs:loc">+++ hosts.allow
@@ -15,3 +15,4 @@
+++ hosts.deny 
@@ -0,0 +1,15 @@
</property>
</logentry>

Currently the switch is limited to a single property and only has an effect 
when xml output is used. I don't know how to cleanly extend the non-xml 
output without breaking things. 

Retrieving a property through webdav is also not yet supported because I was 
not sure what to change in order to extend the webdav log request to pass the 
property name and how to test it.

As explained earlier in the thread, if the patch is applied, it will be 
possible to store an additional  property that tracks the changed lines of 
code for each revision and then to run statistical analysis based  the log.

Steffen

-- 
Steffen Pingel - steffenp@gmx.de - http://steffenpingel.de

["log-propname.diff" (text/x-diff)]

Index: subversion/libsvn_ra/wrapper_template.h
===================================================================
--- subversion/libsvn_ra/wrapper_template.h	(revision 13592)
+++ subversion/libsvn_ra/wrapper_template.h	(working copy)
@@ -311,7 +311,7 @@
 {
   return VTBL.get_log (session_baton, paths, start, end, 0, /* limit */
                        discover_changed_paths, strict_node_history,
-                       receiver, receiver_baton, pool);
+                       NULL /* propname */, receiver, receiver_baton, pool);
 }
 
 static svn_error_t *compat_check_path (void *session_baton,
Index: subversion/libsvn_ra/ra_loader.c
===================================================================
--- subversion/libsvn_ra/ra_loader.c	(revision 13592)
+++ subversion/libsvn_ra/ra_loader.c	(working copy)
@@ -427,13 +427,14 @@
                              int limit,
                              svn_boolean_t discover_changed_paths,
                              svn_boolean_t strict_node_history,
+                             const char *propname,
                              svn_log_message_receiver_t receiver,
                              void *receiver_baton,
                              apr_pool_t *pool)
 {
   return session->vtable->get_log (session, paths, start, end, limit,
                                    discover_changed_paths, strict_node_history,
-                                   receiver, receiver_baton, pool);
+                                   propname, receiver, receiver_baton, pool);
 }
 
 svn_error_t *svn_ra_check_path (svn_ra_session_t *session,
Index: subversion/libsvn_ra/ra_loader.h
===================================================================
--- subversion/libsvn_ra/ra_loader.h	(revision 13592)
+++ subversion/libsvn_ra/ra_loader.h	(working copy)
@@ -145,6 +145,7 @@
                            int limit,
                            svn_boolean_t discover_changed_paths,
                            svn_boolean_t strict_node_history,
+                           const char *propname,
                            svn_log_message_receiver_t receiver,
                            void *receiver_baton,
                            apr_pool_t *pool);
Index: subversion/include/svn_repos.h
===================================================================
--- subversion/include/svn_repos.h	(revision 13592)
+++ subversion/include/svn_repos.h	(working copy)
@@ -772,6 +772,9 @@
  * If @a strict_node_history is set, copy history (if any exists) will
  * not be traversed while harvesting revision logs for each path.
  *
+ * If @a propname is non-null, then for each revision the value of the 
+ * revision property @a propname will be passed to @a receiver.
+ *
  * If any invocation of @a receiver returns error, return that error
  * immediately and without wrapping it.
  *
@@ -798,6 +801,7 @@
                      int limit,
                      svn_boolean_t discover_changed_paths,
                      svn_boolean_t strict_node_history,
+                     const char *propname,
                      svn_repos_authz_func_t authz_read_func,
                      void *authz_read_baton,
                      svn_log_message_receiver_t receiver,
Index: subversion/include/svn_types.h
===================================================================
--- subversion/include/svn_types.h	(revision 13592)
+++ subversion/include/svn_types.h	(working copy)
@@ -308,8 +308,9 @@
  * This function is invoked once on each log message, in the order
  * determined by the caller (see above-mentioned functions).
  *
- * @a baton, @a revision, @a author, @a date, and @a message are what you 
- * think they are.  Any of @a author, @a date, or @a message may be @c NULL.
+ * @a baton, @a revision, @a author, @a date, @a message and
+ * @a propvalue are what you think they are.  Any of @a author, @a date,
+ * or @a message may be @c NULL.
  *
  * If @a date is neither null nor the empty string, it was generated by
  * @c svn_time_to_string() and can be converted to @c apr_time_t with
@@ -338,6 +339,7 @@
       const char *author,
       const char *date,  /* use svn_time_from_string() if need apr_time_t */
       const char *message,
+      const char *propvalue,
       apr_pool_t *pool);
 
 
Index: subversion/include/svn_client.h
===================================================================
--- subversion/include/svn_client.h	(revision 13592)
+++ subversion/include/svn_client.h	(working copy)
@@ -863,6 +863,9 @@
  * If @a strict_node_history is set, copy history (if any exists) will
  * not be traversed while harvesting revision logs for each target.
  *
+ * If @a propname is non-null, then for each revision the value of the 
+ * revision property @a propname will be passed to @a receiver.
+ *
  * If @a start->kind or @a end->kind is @c svn_opt_revision_unspecified,
  * return the error @c SVN_ERR_CLIENT_BAD_REVISION.
  *
@@ -884,6 +887,7 @@
                  int limit,
                  svn_boolean_t discover_changed_paths,
                  svn_boolean_t strict_node_history,
+                 const char *propname,
                  svn_log_message_receiver_t receiver,
                  void *receiver_baton,
                  svn_client_ctx_t *ctx,
Index: subversion/include/svn_ra.h
===================================================================
--- subversion/include/svn_ra.h	(revision 13592)
+++ subversion/include/svn_ra.h	(working copy)
@@ -783,6 +783,9 @@
  * If @a strict_node_history is set, copy history will not be traversed
  * (if any exists) when harvesting the revision logs for each path.
  *
+ * If @a propname is non-null, then for each revision the value of the 
+ * revision property @a propname will be passed to @a receiver.
+ *
  * If any invocation of @a receiver returns error, return that error
  * immediately and without wrapping it.
  *
@@ -803,6 +806,7 @@
                              int limit,
                              svn_boolean_t discover_changed_paths,
                              svn_boolean_t strict_node_history,
+                             const char *propname,
                              svn_log_message_receiver_t receiver,
                              void *receiver_baton,
                              apr_pool_t *pool);
Index: subversion/libsvn_ra_local/ra_plugin.c
===================================================================
--- subversion/libsvn_ra_local/ra_plugin.c	(revision 13592)
+++ subversion/libsvn_ra_local/ra_plugin.c	(working copy)
@@ -720,6 +720,7 @@
                        int limit,
                        svn_boolean_t discover_changed_paths,
                        svn_boolean_t strict_node_history,
+                       const char *propname,
                        svn_log_message_receiver_t receiver,
                        void *receiver_baton,
                        apr_pool_t *pool)
@@ -747,6 +748,7 @@
                               limit,
                               discover_changed_paths,
                               strict_node_history,
+                              propname,
                               NULL, NULL,
                               receiver,
                               receiver_baton,
Index: subversion/libsvn_client/ra.c
===================================================================
--- subversion/libsvn_client/ra.c	(revision 13592)
+++ subversion/libsvn_client/ra.c	(working copy)
@@ -506,6 +506,7 @@
               const char *author,
               const char *date,
               const char *message,
+              const char *propvalue,
               apr_pool_t *pool)
 {
   struct log_receiver_baton *lrb = baton;
@@ -632,7 +633,7 @@
      the work of finding the actual locations for our resource.
      Notice that we always run on the youngest rev of the 3 inputs. */
   SVN_ERR (svn_ra_get_log (ra_session, targets, youngest, 1, 0,
-                           TRUE, FALSE, log_receiver, &lrb, pool));
+                           TRUE, FALSE, NULL, log_receiver, &lrb, pool));
 
   /* Check that we got the peg path. */
   if (! lrb.peg_path)
Index: subversion/libsvn_client/blame.c
===================================================================
--- subversion/libsvn_client/blame.c	(revision 13592)
+++ subversion/libsvn_client/blame.c	(working copy)
@@ -274,6 +274,7 @@
                       const char *author,
                       const char *date,
                       const char *message,
+                      const char *propvalue,
                       apr_pool_t *pool)
 {
   struct log_message_baton *lmb = baton;
@@ -682,6 +683,7 @@
                            0, /* no limit */
                            TRUE,
                            FALSE,
+                           NULL,
                            log_message_receiver,
                            &lmb,
                            pool));
Index: subversion/libsvn_client/log.c
===================================================================
--- subversion/libsvn_client/log.c	(revision 13592)
+++ subversion/libsvn_client/log.c	(working copy)
@@ -51,6 +51,7 @@
                  int limit,
                  svn_boolean_t discover_changed_paths,
                  svn_boolean_t strict_node_history,
+                 const char *propname,
                  svn_log_message_receiver_t receiver,
                  void *receiver_baton,
                  svn_client_ctx_t *ctx,
@@ -244,6 +245,7 @@
                                   limit,
                                   discover_changed_paths,
                                   strict_node_history,
+                                  propname,
                                   receiver,
                                   receiver_baton,
                                   pool);
@@ -260,6 +262,7 @@
                               limit,
                               discover_changed_paths,
                               strict_node_history,
+                              propname,
                               receiver,
                               receiver_baton,
                               pool);
@@ -283,8 +286,8 @@
   svn_error_t *err = SVN_NO_ERROR;
 
   err = svn_client_log2 (targets, start, end, 0, discover_changed_paths,
-                         strict_node_history, receiver, receiver_baton, ctx,
-                         pool);
+                         strict_node_history, NULL, receiver, receiver_baton,
+                         ctx, pool);
     
   /* Special case: If there have been no commits, we'll get an error
    * for requesting log of a revision higher than 0.  But the
@@ -319,7 +322,7 @@
          just in case some don't, we make up a message here. */
       SVN_ERR (receiver (receiver_baton,
                          NULL, 0, "", "", _("No commits in repository."),
-                         pool));
+                         NULL, pool));
     }
 
   return err;
Index: subversion/mod_dav_svn/log.c
===================================================================
--- subversion/mod_dav_svn/log.c	(revision 13592)
+++ subversion/mod_dav_svn/log.c	(working copy)
@@ -72,6 +72,7 @@
                                   const char *author,
                                   const char *date,
                                   const char *msg,
+                                  const char *propvalue, /* FIXME */
                                   apr_pool_t *pool)
 {
   struct log_receiver_baton *lrb = baton;
@@ -306,6 +307,7 @@
                              limit,
                              discover_changed_paths,
                              strict_node_history,
+                             NULL, /* FIXME: propname */
                              dav_svn_authz_read,
                              &arb,
                              log_receiver,
Index: subversion/clients/cmdline/cl.h
===================================================================
--- subversion/clients/cmdline/cl.h	(revision 13592)
+++ subversion/clients/cmdline/cl.h	(working copy)
@@ -70,6 +70,7 @@
   svn_cl__non_interactive_opt,
   svn_cl__notice_ancestry_opt,
   svn_cl__old_cmd_opt,
+  svn_cl__propname_opt,
   svn_cl__relocate_opt,
   svn_cl__revprop_opt,
   svn_cl__stop_on_copy_opt,
@@ -122,6 +123,7 @@
   const char *extensions;        /* subprocess extension args */ /* UTF-8! */
   apr_array_header_t *targets;   /* target list from file */ /* UTF-8! */
   svn_boolean_t xml;             /* output in xml, e.g., "svn log --xml" */
+  const char *propname;          /* property to include svn log output */
   svn_boolean_t no_ignore;       /* disregard default ignores & svn:ignore's */
   svn_boolean_t no_auth_cache;   /* do not cache authentication information */
   svn_boolean_t no_diff_deleted; /* do not show diffs for deleted files */
Index: subversion/clients/cmdline/log-cmd.c
===================================================================
--- subversion/clients/cmdline/log-cmd.c	(revision 13592)
+++ subversion/clients/cmdline/log-cmd.c	(working copy)
@@ -50,6 +50,9 @@
 
   /* Don't print log message body nor its line count. */
   svn_boolean_t omit_log_message;
+
+  /* Name of the revision property. */
+  const char *propname;
 };
 
 
@@ -142,6 +145,7 @@
                       const char *author,
                       const char *date,
                       const char *msg,
+                      const char *propvalue,
                       apr_pool_t *pool)
 {
   struct log_receiver_baton *lb = baton;
@@ -278,6 +282,7 @@
                           const char *author,
                           const char *date,
                           const char *msg,
+                          const char *propvalue,
                           apr_pool_t *pool)
 {
   struct log_receiver_baton *lb = baton;
@@ -377,6 +382,15 @@
       svn_xml_make_close_tag (&sb, pool, "msg");
     }
 
+  if (propvalue)
+    {
+      /* <property>xxx</property> */
+      svn_xml_make_open_tag (&sb, pool, svn_xml_protect_pcdata, "property",
+                             "name", lb->propname, NULL);
+      svn_xml_escape_cdata_cstring (&sb, propvalue, pool);
+      svn_xml_make_close_tag (&sb, pool, "property");
+    }
+  
   /* </logentry> */
   svn_xml_make_close_tag (&sb, pool, "logentry");
 
@@ -463,7 +477,8 @@
   lb.cancel_func = ctx->cancel_func;
   lb.cancel_baton = ctx->cancel_baton;
   lb.omit_log_message = opt_state->quiet;
-  
+  lb.propname = opt_state->propname;
+
   if (! opt_state->quiet)
     svn_cl__get_notifier (&ctx->notify_func2, &ctx->notify_baton2, FALSE,
                           FALSE, FALSE, pool);
@@ -492,6 +507,7 @@
                                 opt_state->limit,
                                 opt_state->verbose,
                                 opt_state->stop_on_copy,
+                                opt_state->propname,
                                 log_message_receiver_xml,
                                 &lb,
                                 ctx,
@@ -522,6 +538,7 @@
                                 opt_state->limit,
                                 opt_state->verbose,
                                 opt_state->stop_on_copy,
+                                opt_state->propname,
                                 log_message_receiver,
                                 &lb,
                                 ctx,
Index: subversion/clients/cmdline/main.c
===================================================================
--- subversion/clients/cmdline/main.c	(revision 13592)
+++ subversion/clients/cmdline/main.c	(working copy)
@@ -99,6 +99,8 @@
     {"targets",       svn_cl__targets_opt, 1,
                       N_("pass contents of file ARG as additional args")},
     {"xml",           svn_cl__xml_opt, 0, N_("output in XML")},
+    {"propname",      svn_cl__propname_opt, 1,
+                      N_("include property in output")},
     {"strict",        svn_cl__strict_opt, 0, N_("use strict semantics")},
     {"stop-on-copy",  svn_cl__stop_on_copy_opt, 0, 
                       N_("do not cross copies while traversing history")},
@@ -419,7 +421,7 @@
        "    svn log http://www.example.com/repo/project foo.c bar.c\n"),
     {'r', 'q', 'v', svn_cl__targets_opt, svn_cl__stop_on_copy_opt,
      svn_cl__incremental_opt, svn_cl__xml_opt, SVN_CL__AUTH_OPTIONS, 
-     svn_cl__config_dir_opt, svn_cl__limit_opt} },
+     svn_cl__config_dir_opt, svn_cl__limit_opt, svn_cl__propname_opt} },
 
   { "merge", svn_cl__merge, {0},
     N_("Apply the differences between two sources to a working copy path.\n"
@@ -976,6 +978,11 @@
       case svn_cl__xml_opt:
         opt_state.xml = TRUE;
         break;
+      case svn_cl__propname_opt:
+        err = svn_utf_cstring_to_utf8 (&opt_state.propname, opt_arg, pool);
+        if (err)
+          return error_exit (err, stderr, FALSE, pool);
+        break;
       case svn_cl__stop_on_copy_opt:
         opt_state.stop_on_copy = TRUE;
         break;
Index: subversion/libsvn_repos/log.c
===================================================================
--- subversion/libsvn_repos/log.c	(revision 13592)
+++ subversion/libsvn_repos/log.c	(working copy)
@@ -212,6 +212,7 @@
                      int limit,
                      svn_boolean_t discover_changed_paths,
                      svn_boolean_t strict_node_history,
+                     const char *propname,
                      svn_repos_authz_func_t authz_read_func,
                      void *authz_read_baton,
                      svn_log_message_receiver_t receiver,
@@ -339,7 +340,7 @@
        ((start >= end) ? (this_rev >= end) : (this_rev <= end));
        ((start >= end) ? this_rev-- : this_rev++))
     {
-      svn_string_t *author, *date, *message;
+      svn_string_t *author, *date, *message, *propvalue;
       apr_hash_t *r_props, *changed_paths = NULL;
 
       svn_pool_clear (subpool);
@@ -366,6 +367,10 @@
                            APR_HASH_KEY_STRING);
       message = apr_hash_get (r_props, SVN_PROP_REVISION_LOG,
                               APR_HASH_KEY_STRING);
+      if (propname) 
+        propvalue = apr_hash_get (r_props, propname, APR_HASH_KEY_STRING);
+      else 
+        propvalue = NULL;
 
       /* ### Below, we discover changed paths if the user requested
          them (i.e., "svn log -v" means `discover_changed_paths' will
@@ -418,6 +423,7 @@
                             author ? author->data : NULL,
                             date ? date->data : NULL,
                             message ? message->data : NULL,
+                            propvalue ? propvalue->data : NULL,
                             subpool));
 
       if (++count == limit)
@@ -444,8 +450,8 @@
 {
   return svn_repos_get_logs3 (repos, paths, start, end, 0,
                               discover_changed_paths, strict_node_history,
-                              authz_read_func, authz_read_baton, receiver,
-                              receiver_baton, pool);
+                              NULL, authz_read_func, authz_read_baton, 
+                              receiver, receiver_baton, pool);
 }
 
 
@@ -463,6 +469,6 @@
 {
   return svn_repos_get_logs3 (repos, paths, start, end, 0,
                               discover_changed_paths, strict_node_history,
-                              NULL, NULL, /* no authz stuff */
+                              NULL, NULL, NULL, /* no authz stuff */
                               receiver, receiver_baton, pool);
 }
Index: subversion/libsvn_ra_svn/client.c
===================================================================
--- subversion/libsvn_ra_svn/client.c	(revision 13592)
+++ subversion/libsvn_ra_svn/client.c	(working copy)
@@ -1082,6 +1082,7 @@
                                int limit,
                                svn_boolean_t discover_changed_paths,
                                svn_boolean_t strict_node_history,
+                               const char *propname,
                                svn_log_message_receiver_t receiver,
                                void *receiver_baton, apr_pool_t *pool)
 {
@@ -1089,7 +1090,8 @@
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   apr_pool_t *subpool;
   int i;
-  const char *path, *author, *date, *message, *cpath, *action, *copy_path;
+  const char *path, *author, *date, *message, *propvalue, *cpath, *action, 
+    *copy_path;
   svn_ra_svn_item_t *item, *elt;
   apr_array_header_t *cplist;
   apr_hash_t *cphash;
@@ -1106,9 +1108,9 @@
           SVN_ERR(svn_ra_svn_write_cstring(conn, pool, path));
         }
     }
-  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)(?r)(?r)bbn)", start, end,
+  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)(?r)(?r)bbn(?c))", start, end,
                                  discover_changed_paths, strict_node_history,
-                                 (apr_uint64_t) limit));
+                                 (apr_uint64_t) limit, propname));
   SVN_ERR(handle_auth_request(sess_baton, pool));
 
   /* Read the log messages. */
@@ -1121,9 +1123,10 @@
       if (item->kind != SVN_RA_SVN_LIST)
         return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                 _("Log entry not a list"));
-      SVN_ERR(svn_ra_svn_parse_tuple(item->u.list, subpool, "lr(?c)(?c)(?c)",
+      SVN_ERR(svn_ra_svn_parse_tuple(item->u.list, subpool, 
+                                     "lr(?c)(?c)(?c)?(?c)",
                                      &cplist, &rev, &author, &date,
-                                     &message));
+                                     &message, &propvalue));
       if (cplist->nelts > 0)
         {
           /* Interpret the changed-paths list. */
@@ -1152,7 +1155,7 @@
 
       if (! (limit && ++nreceived > limit))
         SVN_ERR(receiver(receiver_baton, cphash, rev, author, date, message,
-                         subpool));
+                         propvalue, subpool));
 
       apr_pool_clear(subpool);
     }
Index: subversion/libsvn_ra_dav/log.c
===================================================================
--- subversion/libsvn_ra_dav/log.c	(revision 13592)
+++ subversion/libsvn_ra_dav/log.c	(working copy)
@@ -222,6 +222,7 @@
                                              lb->author,
                                              lb->date,
                                              lb->msg,
+                                             NULL, /* FIXME: propvalue */
                                              lb->subpool);
 
         reset_log_item (lb);
@@ -300,6 +301,7 @@
                                   int limit,
                                   svn_boolean_t discover_changed_paths,
                                   svn_boolean_t strict_node_history,
+                                  const char *propname, /* FIXME */
                                   svn_log_message_receiver_t receiver,
                                   void *receiver_baton,
                                   apr_pool_t *pool)
Index: subversion/libsvn_ra_dav/ra_dav.h
===================================================================
--- subversion/libsvn_ra_dav/ra_dav.h	(revision 13592)
+++ subversion/libsvn_ra_dav/ra_dav.h	(working copy)
@@ -264,6 +264,7 @@
   int limit,
   svn_boolean_t discover_changed_paths,
   svn_boolean_t strict_node_history,
+  const char *propname,
   svn_log_message_receiver_t receiver,
   void *receiver_baton,
   apr_pool_t *pool);
Index: subversion/svnserve/serve.c
===================================================================
--- subversion/svnserve/serve.c	(revision 13592)
+++ subversion/svnserve/serve.c	(working copy)
@@ -1050,7 +1050,7 @@
 static svn_error_t *log_receiver(void *baton, apr_hash_t *changed_paths,
                                  svn_revnum_t rev, const char *author,
                                  const char *date, const char *message,
-                                 apr_pool_t *pool)
+                                 const char *propvalue, apr_pool_t *pool)
 {
   log_baton_t *b = baton;
   svn_ra_svn_conn_t *conn = b->conn;
@@ -1076,8 +1076,8 @@
                                          change->copyfrom_rev));
         }
     }
-  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)r(?c)(?c)(?c)", rev, author,
-                                 date, message));
+  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)r(?c)(?c)(?c)(?c)", rev, 
+                                 author, date, message, propvalue));
   return SVN_NO_ERROR;
 }
 
@@ -1089,6 +1089,7 @@
   svn_revnum_t start_rev, end_rev;
   const char *full_path;
   svn_boolean_t changed_paths, strict_node;
+  char *propname;
   apr_array_header_t *paths, *full_paths;
   svn_ra_svn_item_t *elt;
   int i;
@@ -1096,9 +1097,9 @@
   log_baton_t lb;
 
   /* Parse the arguments. */
-  SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "l(?r)(?r)bb?n", &paths,
+  SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "l(?r)(?r)bb?n(?c)", &paths,
                                  &start_rev, &end_rev, &changed_paths,
-                                 &strict_node, &limit));
+                                 &strict_node, &limit, &propname));
 
   /* If we got an unspecified number then the user didn't send us anything,
      so we assume no limit.  If it's larger than INT_MAX then someone is 
@@ -1127,7 +1128,7 @@
   lb.conn = conn;
   err = svn_repos_get_logs3(b->repos, full_paths, start_rev, end_rev,
                             (int) limit, changed_paths, strict_node,
-                            NULL, NULL, log_receiver, &lb, pool);
+                            NULL, NULL, propname, log_receiver, &lb, pool);
 
   write_err = svn_ra_svn_write_word(conn, pool, "done");
   if (write_err)



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic