Mercurial > hg
comparison hgext/histedit.py @ 26587:56b2bcea2529
error: get Abort from 'error' instead of 'util'
The home of 'Abort' is 'error' not 'util' however, a lot of code seems to be
confused about that and gives all the credit to 'util' instead of the
hardworking 'error'. In a spirit of equity, we break the cycle of injustice and
give back to 'error' the respect it deserves. And screw that 'util' poser.
For great justice.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 08 Oct 2015 12:55:45 -0700 |
parents | e28102403d1b |
children | 78aa4392c261 |
comparison
equal
deleted
inserted
replaced
26586:d51c658d3f04 | 26587:56b2bcea2529 |
---|---|
223 try: | 223 try: |
224 fp = self.repo.vfs('histedit-state', 'r') | 224 fp = self.repo.vfs('histedit-state', 'r') |
225 except IOError as err: | 225 except IOError as err: |
226 if err.errno != errno.ENOENT: | 226 if err.errno != errno.ENOENT: |
227 raise | 227 raise |
228 raise util.Abort(_('no histedit in progress')) | 228 raise error.Abort(_('no histedit in progress')) |
229 | 229 |
230 try: | 230 try: |
231 data = pickle.load(fp) | 231 data = pickle.load(fp) |
232 parentctxnode, rules, keep, topmost, replacements = data | 232 parentctxnode, rules, keep, topmost, replacements = data |
233 backupfile = None | 233 backupfile = None |
329 repo = state.repo | 329 repo = state.repo |
330 rulehash = rule.strip().split(' ', 1)[0] | 330 rulehash = rule.strip().split(' ', 1)[0] |
331 try: | 331 try: |
332 node = repo[rulehash].node() | 332 node = repo[rulehash].node() |
333 except error.RepoError: | 333 except error.RepoError: |
334 raise util.Abort(_('unknown changeset %s listed') % rulehash[:12]) | 334 raise error.Abort(_('unknown changeset %s listed') % rulehash[:12]) |
335 return cls(state, node) | 335 return cls(state, node) |
336 | 336 |
337 def run(self): | 337 def run(self): |
338 """Runs the action. The default behavior is simply apply the action's | 338 """Runs the action. The default behavior is simply apply the action's |
339 rulectx onto the current parentctx.""" | 339 rulectx onto the current parentctx.""" |
437 ctxs = list(repo.set('%d::%d', first, last)) | 437 ctxs = list(repo.set('%d::%d', first, last)) |
438 if not ctxs: | 438 if not ctxs: |
439 return None | 439 return None |
440 for c in ctxs: | 440 for c in ctxs: |
441 if not c.mutable(): | 441 if not c.mutable(): |
442 raise util.Abort( | 442 raise error.Abort( |
443 _("cannot fold into public change %s") % node.short(c.node())) | 443 _("cannot fold into public change %s") % node.short(c.node())) |
444 base = first.parents()[0] | 444 base = first.parents()[0] |
445 | 445 |
446 # commit a new version of the old changeset, including the update | 446 # commit a new version of the old changeset, including the update |
447 # collect all files which might be affected | 447 # collect all files which might be affected |
662 if revs: | 662 if revs: |
663 revs = [repo.lookup(rev) for rev in revs] | 663 revs = [repo.lookup(rev) for rev in revs] |
664 | 664 |
665 outgoing = discovery.findcommonoutgoing(repo, other, revs, force=force) | 665 outgoing = discovery.findcommonoutgoing(repo, other, revs, force=force) |
666 if not outgoing.missing: | 666 if not outgoing.missing: |
667 raise util.Abort(_('no outgoing ancestors')) | 667 raise error.Abort(_('no outgoing ancestors')) |
668 roots = list(repo.revs("roots(%ln)", outgoing.missing)) | 668 roots = list(repo.revs("roots(%ln)", outgoing.missing)) |
669 if 1 < len(roots): | 669 if 1 < len(roots): |
670 msg = _('there are ambiguous outgoing revisions') | 670 msg = _('there are ambiguous outgoing revisions') |
671 hint = _('see "hg help histedit" for more detail') | 671 hint = _('see "hg help histedit" for more detail') |
672 raise util.Abort(msg, hint=hint) | 672 raise error.Abort(msg, hint=hint) |
673 return repo.lookup(roots[0]) | 673 return repo.lookup(roots[0]) |
674 | 674 |
675 actiontable = {'p': pick, | 675 actiontable = {'p': pick, |
676 'pick': pick, | 676 'pick': pick, |
677 'e': edit, | 677 'e': edit, |
734 def _histedit(ui, repo, state, *freeargs, **opts): | 734 def _histedit(ui, repo, state, *freeargs, **opts): |
735 # TODO only abort if we try and histedit mq patches, not just | 735 # TODO only abort if we try and histedit mq patches, not just |
736 # blanket if mq patches are applied somewhere | 736 # blanket if mq patches are applied somewhere |
737 mq = getattr(repo, 'mq', None) | 737 mq = getattr(repo, 'mq', None) |
738 if mq and mq.applied: | 738 if mq and mq.applied: |
739 raise util.Abort(_('source has mq patches applied')) | 739 raise error.Abort(_('source has mq patches applied')) |
740 | 740 |
741 # basic argument incompatibility processing | 741 # basic argument incompatibility processing |
742 outg = opts.get('outgoing') | 742 outg = opts.get('outgoing') |
743 cont = opts.get('continue') | 743 cont = opts.get('continue') |
744 editplan = opts.get('edit_plan') | 744 editplan = opts.get('edit_plan') |
746 force = opts.get('force') | 746 force = opts.get('force') |
747 rules = opts.get('commands', '') | 747 rules = opts.get('commands', '') |
748 revs = opts.get('rev', []) | 748 revs = opts.get('rev', []) |
749 goal = 'new' # This invocation goal, in new, continue, abort | 749 goal = 'new' # This invocation goal, in new, continue, abort |
750 if force and not outg: | 750 if force and not outg: |
751 raise util.Abort(_('--force only allowed with --outgoing')) | 751 raise error.Abort(_('--force only allowed with --outgoing')) |
752 if cont: | 752 if cont: |
753 if any((outg, abort, revs, freeargs, rules, editplan)): | 753 if any((outg, abort, revs, freeargs, rules, editplan)): |
754 raise util.Abort(_('no arguments allowed with --continue')) | 754 raise error.Abort(_('no arguments allowed with --continue')) |
755 goal = 'continue' | 755 goal = 'continue' |
756 elif abort: | 756 elif abort: |
757 if any((outg, revs, freeargs, rules, editplan)): | 757 if any((outg, revs, freeargs, rules, editplan)): |
758 raise util.Abort(_('no arguments allowed with --abort')) | 758 raise error.Abort(_('no arguments allowed with --abort')) |
759 goal = 'abort' | 759 goal = 'abort' |
760 elif editplan: | 760 elif editplan: |
761 if any((outg, revs, freeargs)): | 761 if any((outg, revs, freeargs)): |
762 raise util.Abort(_('only --commands argument allowed with ' | 762 raise error.Abort(_('only --commands argument allowed with ' |
763 '--edit-plan')) | 763 '--edit-plan')) |
764 goal = 'edit-plan' | 764 goal = 'edit-plan' |
765 else: | 765 else: |
766 if os.path.exists(os.path.join(repo.path, 'histedit-state')): | 766 if os.path.exists(os.path.join(repo.path, 'histedit-state')): |
767 raise util.Abort(_('history edit already in progress, try ' | 767 raise error.Abort(_('history edit already in progress, try ' |
768 '--continue or --abort')) | 768 '--continue or --abort')) |
769 if outg: | 769 if outg: |
770 if revs: | 770 if revs: |
771 raise util.Abort(_('no revisions allowed with --outgoing')) | 771 raise error.Abort(_('no revisions allowed with --outgoing')) |
772 if len(freeargs) > 1: | 772 if len(freeargs) > 1: |
773 raise util.Abort( | 773 raise error.Abort( |
774 _('only one repo argument allowed with --outgoing')) | 774 _('only one repo argument allowed with --outgoing')) |
775 else: | 775 else: |
776 revs.extend(freeargs) | 776 revs.extend(freeargs) |
777 if len(revs) == 0: | 777 if len(revs) == 0: |
778 # experimental config: histedit.defaultrev | 778 # experimental config: histedit.defaultrev |
779 histeditdefault = ui.config('histedit', 'defaultrev') | 779 histeditdefault = ui.config('histedit', 'defaultrev') |
780 if histeditdefault: | 780 if histeditdefault: |
781 revs.append(histeditdefault) | 781 revs.append(histeditdefault) |
782 if len(revs) != 1: | 782 if len(revs) != 1: |
783 raise util.Abort( | 783 raise error.Abort( |
784 _('histedit requires exactly one ancestor revision')) | 784 _('histedit requires exactly one ancestor revision')) |
785 | 785 |
786 | 786 |
787 replacements = [] | 787 replacements = [] |
788 state.keep = opts.get('keep', False) | 788 state.keep = opts.get('keep', False) |
854 remote = None | 854 remote = None |
855 root = findoutgoing(ui, repo, remote, force, opts) | 855 root = findoutgoing(ui, repo, remote, force, opts) |
856 else: | 856 else: |
857 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs))) | 857 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs))) |
858 if len(rr) != 1: | 858 if len(rr) != 1: |
859 raise util.Abort(_('The specified revisions must have ' | 859 raise error.Abort(_('The specified revisions must have ' |
860 'exactly one common root')) | 860 'exactly one common root')) |
861 root = rr[0].node() | 861 root = rr[0].node() |
862 | 862 |
863 revs = between(repo, root, topmost, state.keep) | 863 revs = between(repo, root, topmost, state.keep) |
864 if not revs: | 864 if not revs: |
865 raise util.Abort(_('%s is not an ancestor of working directory') % | 865 raise error.Abort(_('%s is not an ancestor of working directory') % |
866 node.short(root)) | 866 node.short(root)) |
867 | 867 |
868 ctxs = [repo[r] for r in revs] | 868 ctxs = [repo[r] for r in revs] |
869 if not rules: | 869 if not rules: |
870 comment = editcomment % (node.short(root), node.short(topmost)) | 870 comment = editcomment % (node.short(root), node.short(topmost)) |
958 s = repo.status() | 958 s = repo.status() |
959 if s.modified or s.added or s.removed or s.deleted: | 959 if s.modified or s.added or s.removed or s.deleted: |
960 actobj.continuedirty() | 960 actobj.continuedirty() |
961 s = repo.status() | 961 s = repo.status() |
962 if s.modified or s.added or s.removed or s.deleted: | 962 if s.modified or s.added or s.removed or s.deleted: |
963 raise util.Abort(_("working copy still dirty")) | 963 raise error.Abort(_("working copy still dirty")) |
964 | 964 |
965 parentctx, replacements = actobj.continueclean() | 965 parentctx, replacements = actobj.continueclean() |
966 | 966 |
967 state.parentctxnode = parentctx.node() | 967 state.parentctxnode = parentctx.node() |
968 state.replacements.extend(replacements) | 968 state.replacements.extend(replacements) |
975 When keep is false, the specified set can't have children.""" | 975 When keep is false, the specified set can't have children.""" |
976 ctxs = list(repo.set('%n::%n', old, new)) | 976 ctxs = list(repo.set('%n::%n', old, new)) |
977 if ctxs and not keep: | 977 if ctxs and not keep: |
978 if (not obsolete.isenabled(repo, obsolete.allowunstableopt) and | 978 if (not obsolete.isenabled(repo, obsolete.allowunstableopt) and |
979 repo.revs('(%ld::) - (%ld)', ctxs, ctxs)): | 979 repo.revs('(%ld::) - (%ld)', ctxs, ctxs)): |
980 raise util.Abort(_('cannot edit history that would orphan nodes')) | 980 raise error.Abort(_('cannot edit history that would orphan nodes')) |
981 if repo.revs('(%ld) and merge()', ctxs): | 981 if repo.revs('(%ld) and merge()', ctxs): |
982 raise util.Abort(_('cannot edit history that contains merges')) | 982 raise error.Abort(_('cannot edit history that contains merges')) |
983 root = ctxs[0] # list is already sorted by repo.set | 983 root = ctxs[0] # list is already sorted by repo.set |
984 if not root.mutable(): | 984 if not root.mutable(): |
985 raise util.Abort(_('cannot edit public changeset: %s') % root, | 985 raise error.Abort(_('cannot edit public changeset: %s') % root, |
986 hint=_('see "hg help phases" for details')) | 986 hint=_('see "hg help phases" for details')) |
987 return [c.node() for c in ctxs] | 987 return [c.node() for c in ctxs] |
988 | 988 |
989 def makedesc(repo, action, rev): | 989 def makedesc(repo, action, rev): |
990 """build a initial action line for a ctx | 990 """build a initial action line for a ctx |
1031 parsed = [] | 1031 parsed = [] |
1032 expected = set(c.hex() for c in ctxs) | 1032 expected = set(c.hex() for c in ctxs) |
1033 seen = set() | 1033 seen = set() |
1034 for r in rules: | 1034 for r in rules: |
1035 if ' ' not in r: | 1035 if ' ' not in r: |
1036 raise util.Abort(_('malformed line "%s"') % r) | 1036 raise error.Abort(_('malformed line "%s"') % r) |
1037 action, rest = r.split(' ', 1) | 1037 action, rest = r.split(' ', 1) |
1038 ha = rest.strip().split(' ', 1)[0] | 1038 ha = rest.strip().split(' ', 1)[0] |
1039 try: | 1039 try: |
1040 ha = repo[ha].hex() | 1040 ha = repo[ha].hex() |
1041 except error.RepoError: | 1041 except error.RepoError: |
1042 raise util.Abort(_('unknown changeset %s listed') % ha[:12]) | 1042 raise error.Abort(_('unknown changeset %s listed') % ha[:12]) |
1043 if ha not in expected: | 1043 if ha not in expected: |
1044 raise util.Abort( | 1044 raise error.Abort( |
1045 _('may not use changesets other than the ones listed')) | 1045 _('may not use changesets other than the ones listed')) |
1046 if ha in seen: | 1046 if ha in seen: |
1047 raise util.Abort(_('duplicated command for changeset %s') % | 1047 raise error.Abort(_('duplicated command for changeset %s') % |
1048 ha[:12]) | 1048 ha[:12]) |
1049 seen.add(ha) | 1049 seen.add(ha) |
1050 if action not in actiontable or action.startswith('_'): | 1050 if action not in actiontable or action.startswith('_'): |
1051 raise util.Abort(_('unknown action "%s"') % action) | 1051 raise error.Abort(_('unknown action "%s"') % action) |
1052 parsed.append([action, ha]) | 1052 parsed.append([action, ha]) |
1053 missing = sorted(expected - seen) # sort to stabilize output | 1053 missing = sorted(expected - seen) # sort to stabilize output |
1054 if missing: | 1054 if missing: |
1055 raise util.Abort(_('missing rules for changeset %s') % | 1055 raise error.Abort(_('missing rules for changeset %s') % |
1056 missing[0][:12], | 1056 missing[0][:12], |
1057 hint=_('do you want to use the drop action?')) | 1057 hint=_('do you want to use the drop action?')) |
1058 return parsed | 1058 return parsed |
1059 | 1059 |
1060 def newnodestoabort(state): | 1060 def newnodestoabort(state): |
1206 histedit_nodes = set([repo[rulehash].node() for (action, rulehash) | 1206 histedit_nodes = set([repo[rulehash].node() for (action, rulehash) |
1207 in state.rules if rulehash in repo]) | 1207 in state.rules if rulehash in repo]) |
1208 strip_nodes = set([repo[n].node() for n in nodelist]) | 1208 strip_nodes = set([repo[n].node() for n in nodelist]) |
1209 common_nodes = histedit_nodes & strip_nodes | 1209 common_nodes = histedit_nodes & strip_nodes |
1210 if common_nodes: | 1210 if common_nodes: |
1211 raise util.Abort(_("histedit in progress, can't strip %s") | 1211 raise error.Abort(_("histedit in progress, can't strip %s") |
1212 % ', '.join(node.short(x) for x in common_nodes)) | 1212 % ', '.join(node.short(x) for x in common_nodes)) |
1213 return orig(ui, repo, nodelist, *args, **kwargs) | 1213 return orig(ui, repo, nodelist, *args, **kwargs) |
1214 | 1214 |
1215 extensions.wrapfunction(repair, 'strip', stripwrapper) | 1215 extensions.wrapfunction(repair, 'strip', stripwrapper) |
1216 | 1216 |