# HG changeset patch # User Pulkit Goyal <7895pulkit@gmail.com> # Date 2017-10-28 13:33:23 # Node ID a9cc233de5134cd2270903219d604422824a793a # Parent f56a30b844aa91eecd4e31b1fbc291d9d24973b3 histedit: add support to output nodechanges using formatter The JSON output of nodechanges will help in automation and to improve editor integrations such as for Nuclide. Differential Revision: https://phab.mercurial-scm.org/D1348 diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -917,7 +917,8 @@ def findoutgoing(ui, repo, remote=None, ('o', 'outgoing', False, _('changesets not found in destination')), ('f', 'force', False, _('force outgoing even for unrelated repositories')), - ('r', 'rev', [], _('first revision to be edited'), _('REV'))], + ('r', 'rev', [], _('first revision to be edited'), _('REV'))] + + cmdutil.formatteropts, _("[OPTIONS] ([ANCESTOR] | --outgoing [URL])")) def histedit(ui, repo, *freeargs, **opts): """interactively edit changeset history @@ -1095,6 +1096,8 @@ def _validateargs(ui, repo, state, freea def _histedit(ui, repo, state, *freeargs, **opts): opts = pycompat.byteskwargs(opts) + fm = ui.formatter('histedit', opts) + fm.startitem() goal = _getgoal(opts) revs = opts.get('rev', []) rules = opts.get('commands', '') @@ -1117,7 +1120,8 @@ def _histedit(ui, repo, state, *freeargs _newhistedit(ui, repo, state, revs, freeargs, opts) _continuehistedit(ui, repo, state) - _finishhistedit(ui, repo, state) + _finishhistedit(ui, repo, state, fm) + fm.end() def _continuehistedit(ui, repo, state): """This function runs after either: @@ -1164,7 +1168,7 @@ def _continuehistedit(ui, repo, state): state.write() ui.progress(_("editing"), None) -def _finishhistedit(ui, repo, state): +def _finishhistedit(ui, repo, state, fm): """This action runs when histedit is finishing its session""" repo.ui.pushbuffer() hg.update(repo, state.parentctxnode, quietempty=True) @@ -1198,6 +1202,13 @@ def _finishhistedit(ui, repo, state): mapping = {k: v for k, v in mapping.items() if k in nodemap and all(n in nodemap for n in v)} scmutil.cleanupnodes(repo, mapping, 'histedit') + hf = fm.hexfunc + fl = fm.formatlist + fd = fm.formatdict + nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node') + for oldn, newn in mapping.iteritems()}, + key="oldnode", value="newnodes") + fm.data(nodechanges=nodechanges) state.clear() if os.path.exists(repo.sjoin('undo')): diff --git a/tests/test-histedit-templates.t b/tests/test-histedit-templates.t new file mode 100644 --- /dev/null +++ b/tests/test-histedit-templates.t @@ -0,0 +1,54 @@ +Testing templating for histedit command + +Setup + + $ cat >> $HGRCPATH < [extensions] + > histedit= + > [experimental] + > evolution=createmarkers + > EOF + + $ hg init repo + $ cd repo + $ for ch in a b c d; do echo foo > $ch; hg commit -Aqm "Added "$ch; done + + $ hg log -G -T "{rev}:{node|short} {desc}" + @ 3:62615734edd5 Added d + | + o 2:28ad74487de9 Added c + | + o 1:29becc82797a Added b + | + o 0:18d04c59bb5d Added a + +Getting the JSON output for nodechanges + + $ hg histedit -Tjson --commands - 2>&1 < pick 28ad74487de9 Added c + > pick 62615734edd5 Added d + > pick 18d04c59bb5d Added a + > pick 29becc82797a Added b + > EOF + [ + { + "nodechanges": {"18d04c59bb5d2d4090ad9a5b59bd6274adb63add": ["109f8ec895447f81b380ba8d4d8b66539ccdcb94"], "28ad74487de9599d00d81085be739c61fc340652": ["bff9e07c1807942b161dab768aa793b48e9a7f9d"], "29becc82797a4bc11ec8880b58eaecd2ab3e7760": ["f5dcf3b4db23f31f1aacf46c33d1393de303d26f"], "62615734edd52f06b6fb9c2beb429e4fe30d57b8": ["201423b441c84d9e6858daed653e0d22485c1cfa"]} + } + ] + + $ hg log -G -T "{rev}:{node|short} {desc}" + @ 7:f5dcf3b4db23 Added b + | + o 6:109f8ec89544 Added a + | + o 5:201423b441c8 Added d + | + o 4:bff9e07c1807 Added c + + $ hg histedit -T "{nodechanges|json}" --commands - 2>&1 < pick bff9e07c1807 Added c + > pick 201423b441c8 Added d + > pick 109f8ec89544 Added a + > roll f5dcf3b4db23 Added b + > EOF + {"109f8ec895447f81b380ba8d4d8b66539ccdcb94": ["8d01470bfeab64d3de13c49adb79d88790d38396"], "f3ec56a374bdbdf1953cacca505161442c6f3a3e": [], "f5dcf3b4db23f31f1aacf46c33d1393de303d26f": ["8d01470bfeab64d3de13c49adb79d88790d38396"]} (no-eol)