Patchwork [5,of,7,v2] rebase: improve error message for --base being empty or causing emptiness

login
register
mail settings
Submitter Mads Kiilerich
Date Jan. 15, 2014, 2:24 a.m.
Message ID <dc5157841361044c84d8.1389752684@localhost.localdomain>
Download mbox | patch
Permalink /patch/3328/
State Accepted
Headers show

Comments

Mads Kiilerich - Jan. 15, 2014, 2:24 a.m.
# HG changeset patch
# User Mads Kiilerich <madski@unity3d.com>
# Date 1384730518 18000
#      Sun Nov 17 18:21:58 2013 -0500
# Node ID dc5157841361044c84d8c3c987a186e2ac4d4510
# Parent  3bff26f6716934d0c5257784e857af9c6dfb153c
rebase: improve error message for --base being empty or causing emptiness

Before it just said 'nothing to rebase'.

Now 'if "base" is an empty set:
  abort: empty "base" revision set - can't compute rebase set

If the set of changesets to rebase can't be found from "base", it will fail as
before but with more explanation of what the problem was.

The name of the "base" option is not obvious - it is more like "samples
identifying the branch to rebase". The error messages for problems with the
specified "base" value will use that term and might thus also not be obvious,
but at least they are consistent with the option name. The name "base" will not
be used if the base only was specified implicitly as the working directory
parent.

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -233,9 +233,35 @@  def rebase(ui, repo, **opts):
                 assert rebaseset
             else:
                 base = scmutil.revrange(repo, [basef or '.'])
+                if not base:
+                    raise util.Abort(_('empty "base" revision set - '
+                                       "can't compute rebase set"))
                 rebaseset = repo.revs(
                     '(children(ancestor(%ld, %d)) and ::(%ld))::',
                     base, dest, base)
+                if not rebaseset:
+                    if base == [dest.rev()]:
+                        if basef:
+                            ui.status(_('nothing to rebase - %s is both "base"'
+                                        ' and destination\n') % dest)
+                        else:
+                            ui.status(_('nothing to rebase - working directory '
+                                        'parent is also destination\n'))
+                    elif not repo.revs('%ld - ::%d', base, dest):
+                        if basef:
+                            ui.status(_('nothing to rebase - "base" %s is '
+                                        'already an ancestor of destination '
+                                        '%s\n') %
+                                      ('+'.join(str(repo[r]) for r in base),
+                                       dest))
+                        else:
+                            ui.status(_('nothing to rebase - working '
+                                        'directory parent is already an '
+                                        'ancestor of destination %s\n') % dest)
+                    else: # can it happen?
+                        ui.status(_('nothing to rebase from %s to %s\n') %
+                                  ('+'.join(str(repo[r]) for r in base), dest))
+                    return 1
             if rebaseset:
                 root = min(rebaseset)
             else:
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
--- a/tests/test-largefiles.t
+++ b/tests/test-largefiles.t
@@ -977,7 +977,7 @@  rebased or not.
   M sub2/large6
   saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
   0 largefiles cached
-  nothing to rebase
+  nothing to rebase - working directory parent is also destination
   $ [ -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
   $ hg log --template '{rev}:{node|short}  {desc|firstline}\n'
   9:598410d3eb9a  modify normal file largefile in repo d
diff --git a/tests/test-rebase-parameters.t b/tests/test-rebase-parameters.t
--- a/tests/test-rebase-parameters.t
+++ b/tests/test-rebase-parameters.t
@@ -87,14 +87,26 @@  These fail:
   abort: empty "source" revision set - nothing to rebase
   [255]
 
+  $ hg rebase --base '1 & !1'
+  abort: empty "base" revision set - can't compute rebase set
+  [255]
+
   $ hg rebase
-  nothing to rebase
+  nothing to rebase - working directory parent is also destination
+  [1]
+
+  $ hg rebase -b.
+  nothing to rebase - e7ec4e813ba6 is both "base" and destination
   [1]
 
   $ hg up -q 7
 
   $ hg rebase --traceback
-  nothing to rebase
+  nothing to rebase - working directory parent is already an ancestor of destination e7ec4e813ba6
+  [1]
+
+  $ hg rebase -b.
+  nothing to rebase - "base" 02de42196ebe is already an ancestor of destination e7ec4e813ba6
   [1]
 
   $ hg rebase --dest '1 & !1'
@@ -137,7 +149,6 @@  Try to rollback after a rebase (fail):
 
   $ cd ..
 
-
 Rebase with base == '.' => same as no arguments (from 3 onto 8):
 
   $ hg clone -q -u 3 a a2
diff --git a/tests/test-rebase-pull.t b/tests/test-rebase-pull.t
--- a/tests/test-rebase-pull.t
+++ b/tests/test-rebase-pull.t
@@ -84,7 +84,7 @@  Invoke pull --rebase and nothing to reba
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  nothing to rebase
+  nothing to rebase - working directory parent is already an ancestor of destination 77ae9631bcca
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   updating bookmark norebase
 
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -235,7 +235,7 @@  These will abort gracefully (using --bas
 G onto G - rebase onto same changeset:
 
   $ hg rebase -b 6 -d 6
-  nothing to rebase
+  nothing to rebase - eea13746799a is both "base" and destination
   [1]
 
 G onto F - rebase onto an ancestor:
@@ -247,7 +247,7 @@  G onto F - rebase onto an ancestor:
 F onto G - rebase onto a descendant:
 
   $ hg rebase -b 5 -d 6
-  nothing to rebase
+  nothing to rebase - "base" 24b6387c8c8c is already an ancestor of destination eea13746799a
   [1]
 
 C onto A - rebase onto an ancestor: