You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pe...@apache.org on 2010/10/05 19:28:19 UTC

svn commit: r1004727 - in /subversion/trunk/subversion: svn/log-cmd.c svn/main.c tests/cmdline/log_tests.py

Author: peters
Date: Tue Oct  5 17:28:18 2010
New Revision: 1004727

URL: http://svn.apache.org/viewvc?rev=1004727&view=rev
Log:
Add range support to 'svn -c'.  Note that I use '-' instead of ':' as
the range operator.  This is for consistency with the syntax of the
svn:mergeinfo property, and to allow cutting and pasting from 'svn
diff' display of mergeinfo.

* subversion/svn/main.c
  (main): Parse "M-N" in each -c range.  Account for forward and
   reverse ranges, but disallow M < 0, as it is too confusing and I
   can't think of a valid use case.

* subversion/svn/log-cmd.c
  (svn_cl__log): Don't assume '-c' implies singleton changesets.

* subversion/tests/cmdline/log_tests.py
  (log_changes_range): Fix test to use '-' instead of ':'.
  (log_changes_complex): New test.
  (): Remove XFail from log_changes_range, add log_changes_complex.

Modified:
    subversion/trunk/subversion/svn/log-cmd.c
    subversion/trunk/subversion/svn/main.c
    subversion/trunk/subversion/tests/cmdline/log_tests.py

Modified: subversion/trunk/subversion/svn/log-cmd.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/log-cmd.c?rev=1004727&r1=1004726&r2=1004727&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/log-cmd.c (original)
+++ subversion/trunk/subversion/svn/log-cmd.c Tue Oct  5 17:28:18 2010
@@ -630,9 +630,9 @@ svn_cl__log(apr_getopt_t *os,
           range = APR_ARRAY_IDX(opt_state->revision_ranges, i,
                                 svn_opt_revision_range_t *);
           if (range->start.value.number < range->end.value.number)
-            range->start = range->end;
+            range->start.value.number++;
           else
-            range->end = range->start;
+            range->end.value.number++;
         }
     }
 

Modified: subversion/trunk/subversion/svn/main.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/main.c?rev=1004727&r1=1004726&r2=1004727&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/main.c (original)
+++ subversion/trunk/subversion/svn/main.c Tue Oct  5 17:28:18 2010
@@ -1410,7 +1410,7 @@ main(int argc, const char *argv[])
           for (i = 0; i < change_revs->nelts; i++)
             {
               char *end;
-              svn_revnum_t changeno;
+              svn_revnum_t changeno, changeno_end;
               svn_opt_revision_range_t *range;
               const char *change_str =
                 APR_ARRAY_IDX(change_revs, i, const char *);
@@ -1421,7 +1421,22 @@ main(int argc, const char *argv[])
                  ### "{DATE}" and the special words. */
               while (*change_str == 'r')
                 change_str++;
-              changeno = strtol(change_str, &end, 10);
+              changeno = changeno_end = strtol(change_str, &end, 10);
+              if (end != change_str && *end == '-')
+                {
+                  if (changeno < 0)
+                    {
+                      err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                              _("Negative number in range (%s)"
+                                                " not supported with -c"),
+                                              change_str);
+                      return svn_cmdline_handle_exit_error(err, pool, "svn: ");
+                    }
+                  change_str = end+1;
+                  while (*change_str == 'r')
+                    change_str++;
+                  changeno_end = strtol(change_str, &end, 10);
+                }
               if (end == change_str || *end != '\0')
                 {
                   err = svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -1439,19 +1454,28 @@ main(int argc, const char *argv[])
 
               /* Figure out the range:
                     -c N  -> -r N-1:N
-                    -c -N -> -r N:N-1 */
-              range = apr_palloc(pool, sizeof(*range));
+                    -c -N -> -r N:N-1
+                    -c M-N -> -r M-1:N for M < N
+                    -c M-N -> -r M:N-1 for M > N
+                    -c -M-N -> error (too confusing/no valid use case)
+              */
               if (changeno > 0)
                 {
-                  range->start.value.number = changeno - 1;
-                  range->end.value.number = changeno;
+                  if (changeno < changeno_end)
+                    changeno--;
+                  else
+                    changeno_end--;
                 }
               else
                 {
                   changeno = -changeno;
-                  range->start.value.number = changeno;
-                  range->end.value.number = changeno - 1;
+                  changeno_end = changeno - 1;
                 }
+
+              range = apr_palloc(pool, sizeof(*range));
+              range->start.value.number = changeno;
+              range->end.value.number = changeno_end;
+
               opt_state.used_change_arg = TRUE;
               range->start.kind = svn_opt_revision_number;
               range->end.kind = svn_opt_revision_number;

Modified: subversion/trunk/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/log_tests.py?rev=1004727&r1=1004726&r2=1004727&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/log_tests.py Tue Oct  5 17:28:18 2010
@@ -1297,7 +1297,7 @@ def log_changes_range(sbox):
 
   exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
                                                               'log', '-c',
-                                                              '2:5', repo_url)
+                                                              '2-5', repo_url)
 
   log_chain = parse_log_output(output)
   check_log_chain(log_chain, [2, 3, 4, 5])
@@ -1316,6 +1316,19 @@ def log_changes_list(sbox):
   log_chain = parse_log_output(output)
   check_log_chain(log_chain, [2, 5, 7])
 
+def log_changes_complex(sbox):
+  "test log -c on complex set of ranges"
+
+  guarantee_repos_and_wc(sbox)
+  repo_url = sbox.repo_url
+
+  exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+                                                              'log', '-c',
+                                                              '2,5-3,-8,6-7', repo_url)
+
+  log_chain = parse_log_output(output)
+  check_log_chain(log_chain, [2, 5, 4, 3, 8, 6, 7])
+
 #----------------------------------------------------------------------
 def only_one_wc_path(sbox):
   "svn log of two wc paths is disallowed"
@@ -1760,8 +1773,9 @@ test_list = [ None,
               SkipUnless(merge_sensitive_log_added_path,
                          server_has_mergeinfo),
               log_single_change,
-              XFail(log_changes_range),
+              log_changes_range,
               log_changes_list,
+              log_changes_complex,
               only_one_wc_path,
               retrieve_revprops,
               log_xml_with_bad_data,