You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2014/05/01 21:29:37 UTC

svn commit: r1591750 - in /subversion/trunk: subversion/include/svn_diff.h tools/diff/diff3.c

Author: philip
Date: Thu May  1 19:29:37 2014
New Revision: 1591750

URL: http://svn.apache.org/r1591750
Log:
Add --conflict-style to standalone tools/diff/diff3.

* tools/diff/diff3.c
  (do_diff3): Add conflict style parameter.
  (main): Make argv const, add option parsing, add token map, clear error,
   pass conflict style, extend usage text.

* subversion/include/svn_diff.h
  (enum svn_diff_conflict_display_style_t): Add maintenance comment.

Modified:
    subversion/trunk/subversion/include/svn_diff.h
    subversion/trunk/tools/diff/diff3.c

Modified: subversion/trunk/subversion/include/svn_diff.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_diff.h?rev=1591750&r1=1591749&r2=1591750&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_diff.h (original)
+++ subversion/trunk/subversion/include/svn_diff.h Thu May  1 19:29:37 2014
@@ -402,6 +402,9 @@ typedef enum svn_diff_conflict_display_s
   /** Like svn_diff_conflict_display_modified_original_latest, but
       *only* showing conflicts. */
   svn_diff_conflict_display_only_conflicts
+
+  /* IMPORTANT: If you extend this enum note that it is mapped in
+     tools/diff/diff3.c. */
 } svn_diff_conflict_display_style_t;
 
 

Modified: subversion/trunk/tools/diff/diff3.c
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/diff/diff3.c?rev=1591750&r1=1591749&r2=1591750&view=diff
==============================================================================
--- subversion/trunk/tools/diff/diff3.c (original)
+++ subversion/trunk/tools/diff/diff3.c Thu May  1 19:29:37 2014
@@ -28,11 +28,14 @@
 #include "svn_pools.h"
 #include "svn_diff.h"
 #include "svn_io.h"
+#include "svn_opt.h"
+#include "private/svn_token.h"
 
 
 static svn_error_t *
 do_diff3(svn_stream_t *ostream,
          const char *original, const char *modified, const char *latest,
+         svn_diff_conflict_display_style_t conflict_style,
          svn_boolean_t *has_changes,
          apr_pool_t *pool)
 {
@@ -46,35 +49,89 @@ do_diff3(svn_stream_t *ostream,
   SVN_ERR(svn_diff_file_output_merge2(ostream, diff,
                                       original, modified, latest,
                                       NULL, NULL, NULL, NULL,
-                                      svn_diff_conflict_display_modified_latest,
+                                      conflict_style,
                                       pool));
 
   return NULL;
 }
 
-int main(int argc, char *argv[])
+int main(int argc, const char *argv[])
 {
   apr_pool_t *pool;
   svn_stream_t *ostream;
   int rc;
-  svn_error_t *svn_err;
+  svn_error_t *svn_err = SVN_NO_ERROR;
+  apr_getopt_t *opts;
+  enum {
+    conflict_style_opt = SVN_OPT_FIRST_LONGOPT_ID
+  };
+  static const apr_getopt_option_t options[] = {
+    {"conflict-style", conflict_style_opt, 1, ""},
+    {NULL, 0, 0, NULL}
+  };
+  svn_diff_conflict_display_style_t conflict_style
+    = svn_diff_conflict_display_modified_latest;
+  const svn_token_map_t style_map[] = {
+    { "modified-latest",
+      svn_diff_conflict_display_modified_latest },
+    { "resolved-modified-latest",
+      svn_diff_conflict_display_resolved_modified_latest },
+    { "modified-original-latest",
+      svn_diff_conflict_display_modified_original_latest },
+    { "modified",
+      svn_diff_conflict_display_modified },
+    { "latest",
+      svn_diff_conflict_display_latest },
+    { "only-conflicts",
+      svn_diff_conflict_display_only_conflicts },
+    {NULL, 0}
+  };
 
   apr_initialize();
 
   pool = svn_pool_create(NULL);
 
-  svn_err = svn_stream_for_stdout(&ostream, pool);
+  apr_getopt_init(&opts, pool, argc, argv);
+  opts->interleave = 1;
+  while (!svn_err)
+    {
+      int opt;
+      const char *arg;
+      apr_status_t status = apr_getopt_long(opts, options, &opt, &arg);
+
+      if (APR_STATUS_IS_EOF(status))
+        break;
+      if (status != APR_SUCCESS)
+        {
+          svn_err = svn_error_wrap_apr(status, "getopt failure");
+          break;
+        }
+      switch (opt)
+        {
+        case conflict_style_opt:
+          {
+            int val;
+            svn_err = svn_token__from_word_err(&val, style_map, arg);
+            conflict_style = val;
+            break;
+          }
+        }
+    }
+
+  if (!svn_err)
+    svn_err = svn_stream_for_stdout(&ostream, pool);
   if (svn_err)
     {
       svn_handle_error2(svn_err, stdout, FALSE, "diff3: ");
+      svn_error_clear(svn_err);
       rc = 2;
     }
-  else if (argc == 4)
+  else if (argc - opts->ind == 3)
     {
       svn_boolean_t has_changes;
 
-      svn_err = do_diff3(ostream, argv[2], argv[1], argv[3],
-                         &has_changes, pool);
+      svn_err = do_diff3(ostream, argv[argc-2], argv[argc-3], argv[argc-1],
+                         conflict_style, &has_changes, pool);
       if (svn_err == NULL)
         {
           rc = has_changes ? 1 : 0;
@@ -88,8 +145,29 @@ int main(int argc, char *argv[])
   else
     {
       svn_error_clear(svn_stream_printf(ostream, pool,
-                                        "Usage: %s <mine> <older> <yours>\n",
-                                        argv[0]));
+        "Usage: %s [options] <mine> <older> <yours>\n"
+        "Options:\n"
+        "  --conflict-style STYLE\n"
+        "  where STYLE can be:\n"
+        "    %s\n"
+        "    %s\n"
+        "    %s\n"
+        "    %s\n"
+        "    %s\n"
+        "    %s\n",
+        argv[0],
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_modified_latest),
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_resolved_modified_latest),
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_modified_original_latest),
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_modified),
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_latest),
+        svn_token__to_word(style_map,
+                           svn_diff_conflict_display_only_conflicts)));
       rc = 2;
     }