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: