prev: extract the code computing the destination
This make the handling of the result simpler. The test agree as one return code
is fixed.
--- a/hgext3rd/evolve/__init__.py Fri Jul 14 01:32:34 2017 +0200
+++ b/hgext3rd/evolve/__init__.py Fri Jul 14 01:49:43 2017 +0200
@@ -2002,7 +2002,30 @@
lockmod.release(tr, lock)
displayer.show(target)
- return 0
+
+def _findprevtarget(repo, displayer, movebookmark=False, topic=True):
+ target = bookmark = None
+ wkctx = repo[None]
+ wparents = wkctx.parents()
+ parents = wparents[0].parents()
+ currenttopic = getattr(repo, 'currenttopic', '')
+ if currenttopic and topic:
+ parents = [ctx for ctx in parents if ctx.topic() == currenttopic]
+ if wparents[0].node() == node.nullid:
+ repo.ui.warn(_('already at repository root\n'))
+ elif not parents and currenttopic:
+ repo.ui.warn(_('no parent in topic "%s"\n') % currenttopic)
+ repo.ui.warn(_('(do you want --no-topic)\n'))
+ elif len(parents) == 1:
+ target = parents[0]
+ bookmark = None
+ if movebookmark:
+ bookmark = repo._activebookmark
+ else:
+ for p in parents:
+ displayer.show(p)
+ repo.ui.warn(_('multiple parents, explicitly update to one\n'))
+ return target, bookmark
@eh.command(
'^previous',
@@ -2033,27 +2056,15 @@
exc.hint = _('do you want --merge?')
raise
- parents = wparents[0].parents()
- topic = getattr(repo, 'currenttopic', '')
- if topic and not opts.get("no_topic", False):
- parents = [ctx for ctx in parents if ctx.topic() == topic]
displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
- if wparents[0].node() == node.nullid:
- ui.warn(_('already at repository root\n'))
- return 1
- elif not parents and topic:
- ui.warn(_('no parent in topic "%s"\n') % topic)
- ui.warn(_('(do you want --no-topic)\n'))
- elif len(parents) == 1:
- target = parents[0]
- bookmark = None
- if opts.get('move_bookmark'):
- bookmark = repo._activebookmark
- return _prevupdate(repo, displayer, target, bookmark, dryrunopt)
+
+ target, bookmark = _findprevtarget(repo, displayer,
+ opts.get('move_bookmark'),
+ not opts.get("no_topic", False))
+ if target is not None:
+ _prevupdate(repo, displayer, target, bookmark, dryrunopt)
+ return 0
else:
- for p in parents:
- displayer.show(p)
- ui.warn(_('multiple parents, explicitly update to one\n'))
return 1
finally:
lockmod.release(wlock)
--- a/tests/test-evolve-topic.t Fri Jul 14 01:32:34 2017 +0200
+++ b/tests/test-evolve-topic.t Fri Jul 14 01:49:43 2017 +0200
@@ -211,6 +211,7 @@
$ hg prev
no parent in topic "bar"
(do you want --no-topic)
+ [1]
$ hg prev --no-topic
switching to topic foo
0 files updated, 0 files merged, 1 files removed, 0 files unresolved