You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/06/08 10:22:55 UTC

svn commit: r952567 - /subversion/trunk/subversion/libsvn_client/diff.c

Author: dannas
Date: Tue Jun  8 08:22:54 2010
New Revision: 952567

URL: http://svn.apache.org/viewvc?rev=952567&view=rev
Log:
Use an operation code instead of boolean flags for identifying what type
of diff we're dealing with. And pass that op code as a parameter instead
of having it in a baton and set-reset it for different paths.

* subversion/libsvn_client/diff.c
  (diff_operation): New enum. 
  (diff_cmd_baton): Remove fields 'added' and 'deleted', used for keeping track
    of operations on individual files.
  (diff_content_changed): Add new svn_diff__operation_t parameter.
  (diff_file_changed): Track caller of diff_content_changed().
  (diff_file_added,
   diff_file_deleted_with_diff): Don't call diff_file_changed() but 
    duplicate it's contents inside here instead, to avoid having to 
    change the svn_wc_diff_callbacks4_t that are used in the merge 
    code too.
  (svn_client_diff5,
   svn_client_diff_peg5): Remove initialization of removed fields in 
    diff_cmd_baton.

Suggested by: gstein

Modified:
    subversion/trunk/subversion/libsvn_client/diff.c

Modified: subversion/trunk/subversion/libsvn_client/diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff.c?rev=952567&r1=952566&r2=952567&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/diff.c Tue Jun  8 08:22:54 2010
@@ -393,6 +393,16 @@ print_git_diff_header_modified(svn_strea
 }
 #endif
 
+enum diff_operation
+{
+  diff_op_added,
+  diff_op_deleted,
+  diff_op_copied,
+  diff_op_moved,
+  /* There's no tree changes, just text modifications. */
+  diff_op_modified
+}; 
+
 
 /*-----------------------------------------------------------------*/
 
@@ -452,14 +462,6 @@ struct diff_cmd_baton {
   /* The directory that diff target paths should be considered as
      relative to for output generation (see issue #2723). */
   const char *relative_to_dir;
-
-  /* ### Add moved and copied fields when we can detect those
-   * ### properly. 
-   *
-   * ### Should we pass these fields as parameters to the affected funcs
-   * ### instead of in the baton? */
-  svn_boolean_t added;
-  svn_boolean_t deleted;
 };
 
 /* Generate a label for the diff output for file PATH at revision REVNUM.
@@ -526,6 +528,7 @@ diff_content_changed(const char *path,
                      svn_revnum_t rev2,
                      const char *mimetype1,
                      const char *mimetype2,
+                     enum diff_operation operation,
                      void *diff_baton)
 {
   struct diff_cmd_baton *diff_cmd_baton = diff_baton;
@@ -707,7 +710,7 @@ diff_content_changed(const char *path,
           /* Add git headers and adjust the labels. 
            * ### Once we're using the git format everywhere, we can create
            * ### one func that sets the correct labels in one place. */
-          if (diff_cmd_baton->deleted)
+          if (operation == diff_op_deleted)
             {
               SVN_ERR(print_git_diff_header_deleted(
                                             os, 
@@ -718,7 +721,7 @@ diff_content_changed(const char *path,
                                   subpool);
               label2 = diff_label("/dev/null", rev2, subpool);
             }
-          else if (diff_cmd_baton->added)
+          else if (operation == diff_op_added)
             {
               SVN_ERR(print_git_diff_header_added(
                                             os, 
@@ -728,7 +731,7 @@ diff_content_changed(const char *path,
               label2 = diff_label(apr_psprintf(subpool, "b/%s", path2), rev2,
                                   subpool);
             }
-          else
+          else if (operation == diff_op_modified)
             {
               SVN_ERR(print_git_diff_header_modified(
                                             os, 
@@ -782,7 +785,8 @@ diff_file_changed(const char *local_dir_
   if (tmpfile1)
     SVN_ERR(diff_content_changed(path,
                                  tmpfile1, tmpfile2, rev1, rev2,
-                                 mimetype1, mimetype2, diff_baton));
+                                 mimetype1, mimetype2,
+                                 diff_op_modified, diff_baton));
   if (prop_changes->nelts > 0)
     SVN_ERR(diff_props_changed(local_dir_abspath, prop_state, tree_conflicted,
                                path, prop_changes,
@@ -822,8 +826,6 @@ diff_file_added(const char *local_dir_ab
 {
   struct diff_cmd_baton *diff_cmd_baton = diff_baton;
 
-  diff_cmd_baton->added = TRUE;
-
   /* We want diff_file_changed to unconditionally show diffs, even if
      the diff is empty (as would be the case if an empty file were
      added.)  It's important, because 'patch' would still see an empty
@@ -831,15 +833,22 @@ diff_file_added(const char *local_dir_ab
      user see that *something* happened. */
   diff_cmd_baton->force_empty = TRUE;
 
-  SVN_ERR(diff_file_changed(local_dir_abspath, content_state, prop_state,
-                            tree_conflicted, path,
-                            tmpfile1, tmpfile2,
-                            rev1, rev2,
-                            mimetype1, mimetype2,
-                            prop_changes, original_props, diff_baton,
-                            scratch_pool));
+  if (tmpfile1)
+    SVN_ERR(diff_content_changed(path,
+                                 tmpfile1, tmpfile2, rev1, rev2,
+                                 mimetype1, mimetype2,
+                                 diff_op_added, diff_baton));
+  if (prop_changes->nelts > 0)
+    SVN_ERR(diff_props_changed(local_dir_abspath, prop_state, tree_conflicted,
+                               path, prop_changes,
+                               original_props, diff_baton, scratch_pool));
+  if (content_state)
+    *content_state = svn_wc_notify_state_unknown;
+  if (prop_state)
+    *prop_state = svn_wc_notify_state_unknown;
+  if (tree_conflicted)
+    *tree_conflicted = FALSE;
 
-  diff_cmd_baton->added = FALSE;
   diff_cmd_baton->force_empty = FALSE;
 
   return SVN_NO_ERROR;
@@ -860,18 +869,20 @@ diff_file_deleted_with_diff(const char *
                             apr_pool_t *scratch_pool)
 {
   struct diff_cmd_baton *diff_cmd_baton = diff_baton;
-  diff_cmd_baton->deleted = TRUE;
+
+  if (tmpfile1)
+    SVN_ERR(diff_content_changed(path,
+                                 tmpfile1, tmpfile2, diff_cmd_baton->revnum1, 
+                                 diff_cmd_baton->revnum2,
+                                 mimetype1, mimetype2,
+                                 diff_op_deleted, diff_baton));
 
   /* We don't list all the deleted properties. */
-  SVN_ERR(diff_file_changed(local_dir_abspath, state, NULL, tree_conflicted,
-                            path, tmpfile1, tmpfile2,
-                            diff_cmd_baton->revnum1, diff_cmd_baton->revnum2,
-                            mimetype1, mimetype2,
-                            apr_array_make(diff_cmd_baton->pool, 1,
-                                           sizeof(svn_prop_t)),
-                            apr_hash_make(diff_cmd_baton->pool), diff_baton,
-                            scratch_pool));
-  diff_cmd_baton->deleted = FALSE;
+
+  if (state)
+    *state = svn_wc_notify_state_unknown;
+  if (tree_conflicted)
+    *tree_conflicted = FALSE;
 
   return SVN_NO_ERROR;
 }
@@ -1897,8 +1908,6 @@ svn_client_diff5(const apr_array_header_
   diff_cmd_baton.force_empty = FALSE;
   diff_cmd_baton.force_binary = ignore_content_type;
   diff_cmd_baton.relative_to_dir = relative_to_dir;
-  diff_cmd_baton.deleted = FALSE;
-  diff_cmd_baton.added = FALSE;
 
   return do_diff(&diff_params, &diff_callbacks, &diff_cmd_baton, ctx, pool);
 }
@@ -1965,8 +1974,6 @@ svn_client_diff_peg5(const apr_array_hea
   diff_cmd_baton.force_empty = FALSE;
   diff_cmd_baton.force_binary = ignore_content_type;
   diff_cmd_baton.relative_to_dir = relative_to_dir;
-  diff_cmd_baton.deleted = FALSE;
-  diff_cmd_baton.added = FALSE;
 
   return do_diff(&diff_params, &diff_callbacks, &diff_cmd_baton, ctx, pool);
 }