Mercurial > hg
comparison hgext/fix.py @ 44129:84a0102c05c7 stable 5.3rc0
merge to stable for 5.3 release freeze
author | Augie Fackler <augie@google.com> |
---|---|
date | Tue, 21 Jan 2020 13:14:51 -0500 |
parents | 61881b170140 833210fbd900 |
children | c791ed6a2154 |
comparison
equal
deleted
inserted
replaced
44048:61881b170140 | 44129:84a0102c05c7 |
---|---|
142 copies, | 142 copies, |
143 error, | 143 error, |
144 match as matchmod, | 144 match as matchmod, |
145 mdiff, | 145 mdiff, |
146 merge, | 146 merge, |
147 obsolete, | |
148 pycompat, | 147 pycompat, |
149 registrar, | 148 registrar, |
149 rewriteutil, | |
150 scmutil, | 150 scmutil, |
151 util, | 151 util, |
152 worker, | 152 worker, |
153 ) | 153 ) |
154 | 154 |
247 set of revisions being fixed is considered, so that fixes to earlier | 247 set of revisions being fixed is considered, so that fixes to earlier |
248 revisions are not forgotten in later ones. The --base flag can be used to | 248 revisions are not forgotten in later ones. The --base flag can be used to |
249 override this default behavior, though it is not usually desirable to do so. | 249 override this default behavior, though it is not usually desirable to do so. |
250 """ | 250 """ |
251 opts = pycompat.byteskwargs(opts) | 251 opts = pycompat.byteskwargs(opts) |
252 cmdutil.check_at_most_one_arg(opts, b'all', b'rev') | |
252 if opts[b'all']: | 253 if opts[b'all']: |
253 if opts[b'rev']: | |
254 raise error.Abort(_(b'cannot specify both "--rev" and "--all"')) | |
255 opts[b'rev'] = [b'not public() and not obsolete()'] | 254 opts[b'rev'] = [b'not public() and not obsolete()'] |
256 opts[b'working_dir'] = True | 255 opts[b'working_dir'] = True |
257 with repo.wlock(), repo.lock(), repo.transaction(b'fix'): | 256 with repo.wlock(), repo.lock(), repo.transaction(b'fix'): |
258 revstofix = getrevstofix(ui, repo, opts) | 257 revstofix = getrevstofix(ui, repo, opts) |
259 basectxs = getbasectxs(repo, opts, revstofix) | 258 basectxs = getbasectxs(repo, opts, revstofix) |
402 revs = set(scmutil.revrange(repo, opts[b'rev'])) | 401 revs = set(scmutil.revrange(repo, opts[b'rev'])) |
403 for rev in revs: | 402 for rev in revs: |
404 checkfixablectx(ui, repo, repo[rev]) | 403 checkfixablectx(ui, repo, repo[rev]) |
405 if revs: | 404 if revs: |
406 cmdutil.checkunfinished(repo) | 405 cmdutil.checkunfinished(repo) |
407 checknodescendants(repo, revs) | 406 rewriteutil.precheck(repo, revs, b'fix') |
408 if opts.get(b'working_dir'): | 407 if opts.get(b'working_dir'): |
409 revs.add(wdirrev) | 408 revs.add(wdirrev) |
410 if list(merge.mergestate.read(repo).unresolved()): | 409 if list(merge.mergestate.read(repo).unresolved()): |
411 raise error.Abort(b'unresolved conflicts', hint=b"use 'hg resolve'") | 410 raise error.Abort(b'unresolved conflicts', hint=b"use 'hg resolve'") |
412 if not revs: | 411 if not revs: |
414 b'no changesets specified', hint=b'use --rev or --working-dir' | 413 b'no changesets specified', hint=b'use --rev or --working-dir' |
415 ) | 414 ) |
416 return revs | 415 return revs |
417 | 416 |
418 | 417 |
419 def checknodescendants(repo, revs): | |
420 if not obsolete.isenabled(repo, obsolete.allowunstableopt) and repo.revs( | |
421 b'(%ld::) - (%ld)', revs, revs | |
422 ): | |
423 raise error.Abort( | |
424 _(b'can only fix a changeset together with all its descendants') | |
425 ) | |
426 | |
427 | |
428 def checkfixablectx(ui, repo, ctx): | 418 def checkfixablectx(ui, repo, ctx): |
429 """Aborts if the revision shouldn't be replaced with a fixed one.""" | 419 """Aborts if the revision shouldn't be replaced with a fixed one.""" |
430 if not ctx.mutable(): | |
431 raise error.Abort( | |
432 b'can\'t fix immutable changeset %s' | |
433 % (scmutil.formatchangeid(ctx),) | |
434 ) | |
435 if ctx.obsolete(): | 420 if ctx.obsolete(): |
436 # It would be better to actually check if the revision has a successor. | 421 # It would be better to actually check if the revision has a successor. |
437 allowdivergence = ui.configbool( | 422 allowdivergence = ui.configbool( |
438 b'experimental', b'evolution.allowdivergence' | 423 b'experimental', b'evolution.allowdivergence' |
439 ) | 424 ) |
679 if line: | 664 if line: |
680 ui.warn(b'[') | 665 ui.warn(b'[') |
681 if rev is None: | 666 if rev is None: |
682 ui.warn(_(b'wdir'), label=b'evolve.rev') | 667 ui.warn(_(b'wdir'), label=b'evolve.rev') |
683 else: | 668 else: |
684 ui.warn((str(rev)), label=b'evolve.rev') | 669 ui.warn(b'%d' % rev, label=b'evolve.rev') |
685 ui.warn(b'] %s: %s\n' % (fixername, line)) | 670 ui.warn(b'] %s: %s\n' % (fixername, line)) |
686 | 671 |
687 | 672 |
688 def writeworkingdir(repo, ctx, filedata, replacements): | 673 def writeworkingdir(repo, ctx, filedata, replacements): |
689 """Write new content to the working copy and check out the new p1 if any | 674 """Write new content to the working copy and check out the new p1 if any |
743 and p1ctx.node() not in replacements | 728 and p1ctx.node() not in replacements |
744 and p2ctx.node() not in replacements | 729 and p2ctx.node() not in replacements |
745 ): | 730 ): |
746 return | 731 return |
747 | 732 |
748 def filectxfn(repo, memctx, path): | 733 extra = ctx.extra().copy() |
749 if path not in ctx: | 734 extra[b'fix_source'] = ctx.hex() |
750 return None | 735 |
736 wctx = context.overlayworkingctx(repo) | |
737 wctx.setbase(repo[newp1node]) | |
738 merge.update( | |
739 repo, | |
740 ctx.rev(), | |
741 branchmerge=False, | |
742 force=True, | |
743 ancestor=p1rev, | |
744 mergeancestor=False, | |
745 wc=wctx, | |
746 ) | |
747 copies.graftcopies(wctx, ctx, ctx.p1()) | |
748 | |
749 for path in filedata.keys(): | |
751 fctx = ctx[path] | 750 fctx = ctx[path] |
752 copysource = fctx.copysource() | 751 copysource = fctx.copysource() |
753 return context.memfilectx( | 752 wctx.write(path, filedata[path], flags=fctx.flags()) |
754 repo, | 753 if copysource: |
755 memctx, | 754 wctx.markcopied(path, copysource) |
756 path=fctx.path(), | 755 |
757 data=filedata.get(path, fctx.data()), | 756 memctx = wctx.tomemctx( |
758 islink=fctx.islink(), | 757 text=ctx.description(), |
759 isexec=fctx.isexec(), | 758 branch=ctx.branch(), |
760 copysource=copysource, | 759 extra=extra, |
761 ) | 760 date=ctx.date(), |
762 | |
763 extra = ctx.extra().copy() | |
764 extra[b'fix_source'] = ctx.hex() | |
765 | |
766 memctx = context.memctx( | |
767 repo, | |
768 parents=(newp1node, newp2node), | 761 parents=(newp1node, newp2node), |
769 text=ctx.description(), | |
770 files=set(ctx.files()) | set(filedata.keys()), | |
771 filectxfn=filectxfn, | |
772 user=ctx.user(), | 762 user=ctx.user(), |
773 date=ctx.date(), | |
774 extra=extra, | |
775 branch=ctx.branch(), | |
776 editor=None, | |
777 ) | 763 ) |
764 | |
778 sucnode = memctx.commit() | 765 sucnode = memctx.commit() |
779 prenode = ctx.node() | 766 prenode = ctx.node() |
780 if prenode == sucnode: | 767 if prenode == sucnode: |
781 ui.debug(b'node %s already existed\n' % (ctx.hex())) | 768 ui.debug(b'node %s already existed\n' % (ctx.hex())) |
782 else: | 769 else: |