915 _("don't strip old nodes after edit is complete")), |
915 _("don't strip old nodes after edit is complete")), |
916 ('', 'abort', False, _('abort an edit in progress')), |
916 ('', 'abort', False, _('abort an edit in progress')), |
917 ('o', 'outgoing', False, _('changesets not found in destination')), |
917 ('o', 'outgoing', False, _('changesets not found in destination')), |
918 ('f', 'force', False, |
918 ('f', 'force', False, |
919 _('force outgoing even for unrelated repositories')), |
919 _('force outgoing even for unrelated repositories')), |
920 ('r', 'rev', [], _('first revision to be edited'), _('REV'))], |
920 ('r', 'rev', [], _('first revision to be edited'), _('REV'))] + |
|
921 cmdutil.formatteropts, |
921 _("[OPTIONS] ([ANCESTOR] | --outgoing [URL])")) |
922 _("[OPTIONS] ([ANCESTOR] | --outgoing [URL])")) |
922 def histedit(ui, repo, *freeargs, **opts): |
923 def histedit(ui, repo, *freeargs, **opts): |
923 """interactively edit changeset history |
924 """interactively edit changeset history |
924 |
925 |
925 This command lets you edit a linear series of changesets (up to |
926 This command lets you edit a linear series of changesets (up to |
1093 raise error.Abort( |
1094 raise error.Abort( |
1094 _('histedit requires exactly one ancestor revision')) |
1095 _('histedit requires exactly one ancestor revision')) |
1095 |
1096 |
1096 def _histedit(ui, repo, state, *freeargs, **opts): |
1097 def _histedit(ui, repo, state, *freeargs, **opts): |
1097 opts = pycompat.byteskwargs(opts) |
1098 opts = pycompat.byteskwargs(opts) |
|
1099 fm = ui.formatter('histedit', opts) |
|
1100 fm.startitem() |
1098 goal = _getgoal(opts) |
1101 goal = _getgoal(opts) |
1099 revs = opts.get('rev', []) |
1102 revs = opts.get('rev', []) |
1100 rules = opts.get('commands', '') |
1103 rules = opts.get('commands', '') |
1101 state.keep = opts.get('keep', False) |
1104 state.keep = opts.get('keep', False) |
1102 |
1105 |
1115 else: |
1118 else: |
1116 # goal == goalnew |
1119 # goal == goalnew |
1117 _newhistedit(ui, repo, state, revs, freeargs, opts) |
1120 _newhistedit(ui, repo, state, revs, freeargs, opts) |
1118 |
1121 |
1119 _continuehistedit(ui, repo, state) |
1122 _continuehistedit(ui, repo, state) |
1120 _finishhistedit(ui, repo, state) |
1123 _finishhistedit(ui, repo, state, fm) |
|
1124 fm.end() |
1121 |
1125 |
1122 def _continuehistedit(ui, repo, state): |
1126 def _continuehistedit(ui, repo, state): |
1123 """This function runs after either: |
1127 """This function runs after either: |
1124 - bootstrapcontinue (if the goal is 'continue') |
1128 - bootstrapcontinue (if the goal is 'continue') |
1125 - _newhistedit (if the goal is 'new') |
1129 - _newhistedit (if the goal is 'new') |
1162 state.actions.pop(0) |
1166 state.actions.pop(0) |
1163 |
1167 |
1164 state.write() |
1168 state.write() |
1165 ui.progress(_("editing"), None) |
1169 ui.progress(_("editing"), None) |
1166 |
1170 |
1167 def _finishhistedit(ui, repo, state): |
1171 def _finishhistedit(ui, repo, state, fm): |
1168 """This action runs when histedit is finishing its session""" |
1172 """This action runs when histedit is finishing its session""" |
1169 repo.ui.pushbuffer() |
1173 repo.ui.pushbuffer() |
1170 hg.update(repo, state.parentctxnode, quietempty=True) |
1174 hg.update(repo, state.parentctxnode, quietempty=True) |
1171 repo.ui.popbuffer() |
1175 repo.ui.popbuffer() |
1172 |
1176 |
1196 # remove entries about unknown nodes |
1200 # remove entries about unknown nodes |
1197 nodemap = repo.unfiltered().changelog.nodemap |
1201 nodemap = repo.unfiltered().changelog.nodemap |
1198 mapping = {k: v for k, v in mapping.items() |
1202 mapping = {k: v for k, v in mapping.items() |
1199 if k in nodemap and all(n in nodemap for n in v)} |
1203 if k in nodemap and all(n in nodemap for n in v)} |
1200 scmutil.cleanupnodes(repo, mapping, 'histedit') |
1204 scmutil.cleanupnodes(repo, mapping, 'histedit') |
|
1205 hf = fm.hexfunc |
|
1206 fl = fm.formatlist |
|
1207 fd = fm.formatdict |
|
1208 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node') |
|
1209 for oldn, newn in mapping.iteritems()}, |
|
1210 key="oldnode", value="newnodes") |
|
1211 fm.data(nodechanges=nodechanges) |
1201 |
1212 |
1202 state.clear() |
1213 state.clear() |
1203 if os.path.exists(repo.sjoin('undo')): |
1214 if os.path.exists(repo.sjoin('undo')): |
1204 os.unlink(repo.sjoin('undo')) |
1215 os.unlink(repo.sjoin('undo')) |
1205 if repo.vfs.exists('histedit-last-edit.txt'): |
1216 if repo.vfs.exists('histedit-last-edit.txt'): |