You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by "C. Michael Pilato" <cm...@collab.net> on 2005/08/04 15:57:29 UTC

[PATCH] 'svn merge -rX' UI annoyance.

"Daniel L. Rall" <dl...@finemaltcoding.com> writes:

> On Thu, 2005-08-04 at 10:03 -0500, C. Michael Pilato wrote:
> > Mark Phippard <Ma...@softlanding.com> writes:
> > 
> > > cmpilato@localhost.localdomain wrote on 08/04/2005 10:51:10 AM:
> > > 
> > > > I'm constantly frustrated that passing -rX (instead of -rX:Y) as the
> > > > operative range for merge operations doesn't default to -rX:X-1
> > > > behavior.  Like, I wanna say "cherry pick a merge of revision 14" and
> > > > I run 'svn merge -r14 ...' only to get bounced for not having
> > > > specified a full revision range. 
> > > > 
> > > > What would others think about relaxing the 'svn merge' UI such that
> > > > passing a single revision means, "merge that one revision"?
> > > 
> > > I assume you meant does not default to -rX-1:X?
> > 
> > Oops!  Yeah, you're right.  Sorry.  -rX-1:X.
> 
> +1!!!!!

In the spirit of Open Source, I offer my hopefully welcome patch.  It
seems to work, but I haven't run it through regression tests yet.

===========================================================================

Teach 'svn merge' how to deal with -rN input (instead of -rN:M) by
treating -rN as -rN-1:N.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
      *                                                       *
      *   THIS PATCH HAS NOT UNDERGONE REGRESSION TESTING.    *
      *                                                       *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

* subversion/include/svn_opt.h
  (svn_opt_revision_range_prev): New revision specifier kind.

* subversion/libsvn_client/ra.c
  (svn_client__repos_locations): Learn to handle svn_opt_revision_range_prev.

* subversion/clients/cmdline/main.c
  (svn_cl__cmd_table): Update the 'merge' command usage message to
    reflect that the first revision range item is optional, and if
    omitted, is "second-range-revision minus one".

* subversion/clients/cmdline/merge-cmd.c
  (svn_cl__merge): If the end revision isn't specified, don't error --
    just turn (effectively) -rN into -rN-1:N under the hood.


Index: subversion/include/svn_opt.h
===================================================================
--- subversion/include/svn_opt.h	(revision 15561)
+++ subversion/include/svn_opt.h	(working copy)
@@ -198,7 +198,10 @@
   svn_opt_revision_working,
 
   /** repository youngest */
-  svn_opt_revision_head
+  svn_opt_revision_head,
+
+  /** (rev of "the other half of the operative range") - 1 */
+  svn_opt_revision_range_prev
 };
 
 
Index: subversion/libsvn_client/ra.c
===================================================================
--- subversion/libsvn_client/ra.c	(revision 15561)
+++ subversion/libsvn_client/ra.c	(working copy)
@@ -702,6 +702,14 @@
       || start->kind == svn_opt_revision_unspecified)
     return svn_error_create (SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL);
 
+  /* If one of the operative range revisions is relative to the other,
+     but the other isn't specified, we're heading toward trouble. */
+  if (((end->kind == svn_opt_revision_unspecified) 
+       && (start->kind == svn_opt_revision_range_prev))
+      || ((end->kind == svn_opt_revision_unspecified) 
+          && (start->kind == svn_opt_revision_range_prev)))
+    return svn_error_create (SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL);
+
   /* Check to see if this is schedule add with history working copy
      path.  If it is, then we need to use the URL and peg revision of
      the copyfrom information. */
@@ -749,14 +757,25 @@
     SVN_ERR (svn_client__get_revision_number (&peg_revnum,
                                               ra_session, revision, path,
                                               pool));
-  
-  SVN_ERR (svn_client__get_revision_number (&start_revnum,
-                                            ra_session, start, path, pool));
-  if (end->kind == svn_opt_revision_unspecified)
-    end_revnum = start_revnum;
+
+  /* If the start revision depends on the end, we've gotta fetch the
+     end first. */
+  if (start->kind == svn_opt_revision_range_prev)
+    {
+      SVN_ERR (svn_client__get_revision_number (&end_revnum, ra_session, 
+                                                end, path, pool));
+      start_revnum = end_revnum - 1;
+    }
   else
-    SVN_ERR (svn_client__get_revision_number (&end_revnum,
-                                              ra_session, end, path, pool));
+    {
+      SVN_ERR (svn_client__get_revision_number (&start_revnum, ra_session, 
+                                                start, path, pool));
+      if (end->kind == svn_opt_revision_unspecified)
+        end_revnum = start_revnum;
+      else
+        SVN_ERR (svn_client__get_revision_number (&end_revnum, ra_session, 
+                                                  end, path, pool));
+    }
 
   /* Set the output revision variables. */
   *start_revision = apr_pcalloc (pool, sizeof (**start_revision));
Index: subversion/clients/cmdline/merge-cmd.c
===================================================================
--- subversion/clients/cmdline/merge-cmd.c	(revision 15561)
+++ subversion/clients/cmdline/merge-cmd.c	(working copy)
@@ -55,10 +55,9 @@
       /* sanity check:  they better have given supplied a *range*.  */
       if (opt_state->end_revision.kind == svn_opt_revision_unspecified)
         {
-          svn_opt_subcommand_help ("merge", svn_cl__cmd_table,
-                                   svn_cl__options, pool);
-          return svn_error_create (SVN_ERR_CL_INSUFFICIENT_ARGS, 0,
-                                   _("Second revision required"));
+          opt_state->end_revision.kind = opt_state->start_revision.kind;
+          opt_state->end_revision.value = opt_state->start_revision.value;
+          opt_state->start_revision.kind = svn_opt_revision_range_prev;
         }
       using_alternate_syntax = TRUE;
     }
Index: subversion/clients/cmdline/main.c
===================================================================
--- subversion/clients/cmdline/main.c	(revision 15561)
+++ subversion/clients/cmdline/main.c	(working copy)
@@ -443,7 +443,7 @@
     N_("Apply the differences between two sources to a working copy path.\n"
        "usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]\n"
        "       2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]\n"
-       "       3. merge -r N:M SOURCE[@REV] [WCPATH]\n"
+       "       3. merge -r [N:]M SOURCE[@REV] [WCPATH]\n"
        "\n"
        "  1. In the first form, the source URLs are specified at revisions\n"
        "     N and M.  These are the two sources to be compared.  The "
@@ -459,7 +459,9 @@
        "  3. In the third form, SOURCE can be a URL, or working copy item\n"
        "     in which case the corresponding URL is used.  This URL in\n"
        "     revision REV is compared as it existed between revisions N and \n"
-       "     M.  If REV is not specified, HEAD is assumed.\n"
+       "     M.  If N is not specified, M-1 is assumed.  If REV is not\n"
+       "     specified, HEAD is assumed.\n"
+       "     \n"
        "\n"
        "  WCPATH is the working copy path that will receive the changes.\n"
        "  If WCPATH is omitted, a default value of '.' is assumed, unless\n"

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org