765 if len(old.parents()) > 1: #XXX remove this unecessary limitation. |
765 if len(old.parents()) > 1: #XXX remove this unecessary limitation. |
766 raise error.Abort(_('cannot amend merge changesets')) |
766 raise error.Abort(_('cannot amend merge changesets')) |
767 base = old.p1() |
767 base = old.p1() |
768 updatebookmarks = _bookmarksupdater(repo, old.node()) |
768 updatebookmarks = _bookmarksupdater(repo, old.node()) |
769 |
769 |
770 wlock = repo.wlock() |
770 # commit a new version of the old changeset, including the update |
771 try: |
771 # collect all files which might be affected |
772 |
772 files = set(old.files()) |
773 # commit a new version of the old changeset, including the update |
773 for u in updates: |
774 # collect all files which might be affected |
774 files.update(u.files()) |
775 files = set(old.files()) |
775 |
776 for u in updates: |
776 # Recompute copies (avoid recording a -> b -> a) |
777 files.update(u.files()) |
777 copied = copies.pathcopies(base, head) |
778 |
778 |
779 # Recompute copies (avoid recording a -> b -> a) |
779 |
780 copied = copies.pathcopies(base, head) |
780 # prune files which were reverted by the updates |
781 |
781 def samefile(f): |
782 |
782 if f in head.manifest(): |
783 # prune files which were reverted by the updates |
783 a = head.filectx(f) |
784 def samefile(f): |
784 if f in base.manifest(): |
785 if f in head.manifest(): |
785 b = base.filectx(f) |
786 a = head.filectx(f) |
786 return (a.data() == b.data() |
787 if f in base.manifest(): |
787 and a.flags() == b.flags()) |
788 b = base.filectx(f) |
|
789 return (a.data() == b.data() |
|
790 and a.flags() == b.flags()) |
|
791 else: |
|
792 return False |
|
793 else: |
788 else: |
794 return f not in base.manifest() |
789 return False |
795 files = [f for f in files if not samefile(f)] |
790 else: |
796 # commit version of these files as defined by head |
791 return f not in base.manifest() |
797 headmf = head.manifest() |
792 files = [f for f in files if not samefile(f)] |
798 def filectxfn(repo, ctx, path): |
793 # commit version of these files as defined by head |
799 if path in headmf: |
794 headmf = head.manifest() |
800 fctx = head[path] |
795 def filectxfn(repo, ctx, path): |
801 flags = fctx.flags() |
796 if path in headmf: |
802 mctx = memfilectx(repo, fctx.path(), fctx.data(), |
797 fctx = head[path] |
803 islink='l' in flags, |
798 flags = fctx.flags() |
804 isexec='x' in flags, |
799 mctx = memfilectx(repo, fctx.path(), fctx.data(), |
805 copied=copied.get(path)) |
800 islink='l' in flags, |
806 return mctx |
801 isexec='x' in flags, |
807 raise IOError() |
802 copied=copied.get(path)) |
808 |
803 return mctx |
809 message = cmdutil.logmessage(repo.ui, commitopts) |
804 raise IOError() |
810 if not message: |
805 |
811 message = old.description() |
806 message = cmdutil.logmessage(repo.ui, commitopts) |
812 |
807 if not message: |
813 user = commitopts.get('user') or old.user() |
808 message = old.description() |
814 date = commitopts.get('date') or None # old.date() |
809 |
815 extra = dict(commitopts.get('extra', {})) |
810 user = commitopts.get('user') or old.user() |
816 extra['branch'] = head.branch() |
811 date = commitopts.get('date') or None # old.date() |
817 |
812 extra = dict(commitopts.get('extra', {})) |
818 new = context.memctx(repo, |
813 extra['branch'] = head.branch() |
819 parents=newbases, |
814 |
820 text=message, |
815 new = context.memctx(repo, |
821 files=files, |
816 parents=newbases, |
822 filectxfn=filectxfn, |
817 text=message, |
823 user=user, |
818 files=files, |
824 date=date, |
819 filectxfn=filectxfn, |
825 extra=extra) |
820 user=user, |
826 |
821 date=date, |
827 if commitopts.get('edit'): |
822 extra=extra) |
828 new._text = cmdutil.commitforceeditor(repo, new, []) |
823 |
829 revcount = len(repo) |
824 if commitopts.get('edit'): |
830 newid = repo.commitctx(new) |
825 new._text = cmdutil.commitforceeditor(repo, new, []) |
831 new = repo[newid] |
826 revcount = len(repo) |
832 created = len(repo) != revcount |
827 newid = repo.commitctx(new) |
833 updatebookmarks(newid) |
828 new = repo[newid] |
834 finally: |
829 created = len(repo) != revcount |
835 wlock.release() |
830 updatebookmarks(newid) |
836 |
831 |
837 return newid, created |
832 return newid, created |
838 |
833 |
839 class MergeFailure(util.Abort): |
834 class MergeFailure(util.Abort): |
840 pass |
835 pass |