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 2013/02/01 01:23:54 UTC

svn commit: r1441276 - /subversion/trunk/subversion/libsvn_wc/diff_editor.c

Author: rhuijben
Date: Fri Feb  1 00:23:53 2013
New Revision: 1441276

URL: http://svn.apache.org/viewvc?rev=1441276&view=rev
Log:
Apply a few tweaks of the repos-repos diff to the repos-wc diff.

* subversion/libsvn_wc/diff_editor.c
  (dir_baton,
   file_baton): Add has_propchange boolean.

  (make_dir_baton,
   make_file_baton): Use a default of 8 changes, as we will at least
     receive the entry props for every node touched.

  (apply_propchanges): Remove local reimplementation of svn_prop__patch().
  (file_diff): Fetch original_repos_relpath for the node, not for the op-root.

  (close_directory,
   close_file): Use has propchange to decide whether to report property
     changes. Use svn_prop__patch.

  (change_file_prop,
   change_dir_prop): Filter dav props. Set has_propchange.

Modified:
    subversion/trunk/subversion/libsvn_wc/diff_editor.c

Modified: subversion/trunk/subversion/libsvn_wc/diff_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff_editor.c?rev=1441276&r1=1441275&r2=1441276&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/diff_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/diff_editor.c Fri Feb  1 00:23:53 2013
@@ -288,6 +288,9 @@ struct dir_baton {
   /* The list of incoming BASE->repos propchanges. */
   apr_array_header_t *propchanges;
 
+  /* Has a change on regular properties */
+  svn_boolean_t has_propchange;
+
   /* The overall crawler editor baton. */
   struct edit_baton *eb;
 
@@ -316,6 +319,9 @@ struct file_baton {
   /* The list of incoming BASE->repos propchanges. */
   apr_array_header_t *propchanges;
 
+  /* Has a change on regular properties */
+  svn_boolean_t has_propchange;
+
   /* The current checksum on disk */
   const svn_checksum_t *base_checksum;
 
@@ -413,7 +419,7 @@ make_dir_baton(const char *path,
   db->added = added;
   db->depth = depth;
   db->pool = dir_pool;
-  db->propchanges = apr_array_make(dir_pool, 1, sizeof(svn_prop_t));
+  db->propchanges = apr_array_make(dir_pool, 8, sizeof(svn_prop_t));
   db->compared = apr_hash_make(dir_pool);
   db->path = apr_pstrdup(dir_pool, path);
 
@@ -446,7 +452,7 @@ make_file_baton(const char *path,
   fb->eb = eb;
   fb->added = added;
   fb->pool = file_pool;
-  fb->propchanges  = apr_array_make(file_pool, 1, sizeof(svn_prop_t));
+  fb->propchanges  = apr_array_make(file_pool, 8, sizeof(svn_prop_t));
   fb->path = apr_pstrdup(file_pool, path);
 
   fb->name = svn_dirent_basename(fb->path, NULL);
@@ -487,32 +493,6 @@ get_prop_mimetype(apr_hash_t *props)
   return svn_prop_get_value(props, SVN_PROP_MIME_TYPE);
 }
 
-
-/* Return the property hash resulting from combining PROPS and PROPCHANGES.
- *
- * A note on pool usage: The returned hash and hash keys are allocated in
- * the same pool as PROPS, but the hash values will be taken directly from
- * either PROPS or PROPCHANGES, as appropriate.  Caller must therefore
- * ensure that the returned hash is only used for as long as PROPS and
- * PROPCHANGES remain valid.
- */
-static apr_hash_t *
-apply_propchanges(apr_hash_t *props,
-                  const apr_array_header_t *propchanges)
-{
-  apr_hash_t *newprops = apr_hash_copy(apr_hash_pool_get(props), props);
-  int i;
-
-  for (i = 0; i < propchanges->nelts; ++i)
-    {
-      const svn_prop_t *prop = &APR_ARRAY_IDX(propchanges, i, svn_prop_t);
-      apr_hash_set(newprops, prop->name, APR_HASH_KEY_STRING, prop->value);
-    }
-
-  return newprops;
-}
-
-
 /* Diff the file PATH against its text base.  At this
  * stage we are dealing with a file that does exist in the working copy.
  *
@@ -551,10 +531,10 @@ file_diff(struct edit_baton *eb,
     return SVN_NO_ERROR;
 
   SVN_ERR(svn_wc__db_read_info(&status, NULL, &revision, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                               NULL, NULL,
-                               &have_base, NULL, NULL,
+                               NULL, NULL, NULL, NULL, NULL, NULL,
+                               &original_repos_relpath, NULL, NULL, NULL,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                               NULL, &have_base, NULL, NULL,
                                db, local_abspath, scratch_pool, scratch_pool));
   if (have_base)
     SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &revert_base_revnum,
@@ -571,7 +551,7 @@ file_diff(struct edit_baton *eb,
      the latter two have corresponding pristine info to diff against.  */
   if (status == svn_wc__db_status_added)
     SVN_ERR(svn_wc__db_scan_addition(&status, NULL, NULL, NULL, NULL,
-                                     &original_repos_relpath, NULL, NULL,
+                                     NULL, NULL, NULL,
                                      NULL, NULL, NULL, db, local_abspath,
                                      scratch_pool, scratch_pool));
 
@@ -1342,7 +1322,7 @@ close_directory(void *dir_baton,
   apr_pool_t *scratch_pool = db->pool;
 
   /* Report the property changes on the directory itself, if necessary. */
-  if (db->propchanges->nelts > 0)
+  if (db->has_propchange)
     {
       /* The working copy properties at the base of the wc->repos comparison:
          either BASE or WORKING. */
@@ -1374,7 +1354,8 @@ close_directory(void *dir_baton,
                                                 eb->db, db->local_abspath,
                                                 scratch_pool, scratch_pool));
 
-              repos_props = apply_propchanges(base_props, db->propchanges);
+              repos_props = svn_prop__patch(base_props, db->propchanges,
+                                            scratch_pool);
 
               /* Recalculate b->propchanges as the change between WORKING
                  and repos. */
@@ -1671,7 +1652,7 @@ close_file(void *file_baton,
                                      fb->local_abspath,
                                      scratch_pool, scratch_pool));
 
-  repos_props = apply_propchanges(pristine_props, fb->propchanges);
+  repos_props = svn_prop__patch(pristine_props, fb->propchanges, scratch_pool);
   repos_mimetype = get_prop_mimetype(repos_props);
   repos_file = fb->temp_file_path ? fb->temp_file_path : pristine_file;
 
@@ -1766,7 +1747,7 @@ close_file(void *file_baton,
                              repos_props, originalprops, scratch_pool));
     }
 
-  if (localfile || fb->propchanges->nelts > 0)
+  if (localfile || fb->has_propchange)
     {
       const char *original_mimetype = get_prop_mimetype(originalprops);
 
@@ -1812,6 +1793,13 @@ change_file_prop(void *file_baton,
 {
   struct file_baton *fb = file_baton;
   svn_prop_t *propchange;
+  svn_prop_kind_t propkind;
+
+  propkind = svn_property_kind2(name);
+  if (propkind == svn_prop_wc_kind)
+    return SVN_NO_ERROR;
+  else if (propkind == svn_prop_regular_kind)
+    fb->has_propchange = TRUE;
 
   propchange = apr_array_push(fb->propchanges);
   propchange->name = apr_pstrdup(fb->pool, name);
@@ -1830,6 +1818,13 @@ change_dir_prop(void *dir_baton,
 {
   struct dir_baton *db = dir_baton;
   svn_prop_t *propchange;
+  svn_prop_kind_t propkind;
+
+  propkind = svn_property_kind2(name);
+  if (propkind == svn_prop_wc_kind)
+    return SVN_NO_ERROR;
+  else if (propkind == svn_prop_regular_kind)
+    db->has_propchange = TRUE;
 
   propchange = apr_array_push(db->propchanges);
   propchange->name = apr_pstrdup(db->pool, name);