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)


