Mercurial > public > mercurial-scm > hg
comparison mercurial/hg.py @ 90:ab9ebff09dcd
Fix manifest merge swap bug
Add more debug info to merge
author | mpm@selenic.com |
---|---|
date | Tue, 17 May 2005 13:38:21 -0800 |
parents | 58a1a0425c9b |
children | 7daef883134f |
comparison
equal
deleted
inserted
replaced
89:4cd9145d5b53 | 90:ab9ebff09dcd |
---|---|
99 self.addlist = None | 99 self.addlist = None |
100 revlog.__init__(self, opener, "00manifest.i", "00manifest.d") | 100 revlog.__init__(self, opener, "00manifest.i", "00manifest.d") |
101 | 101 |
102 def read(self, node): | 102 def read(self, node): |
103 if self.mapcache and self.mapcache[0] == node: | 103 if self.mapcache and self.mapcache[0] == node: |
104 return self.mapcache[1] | 104 return self.mapcache[1].copy() |
105 text = self.revision(node) | 105 text = self.revision(node) |
106 map = {} | 106 map = {} |
107 self.listcache = (text, text.splitlines(1)) | 107 self.listcache = (text, text.splitlines(1)) |
108 for l in self.listcache[1]: | 108 for l in self.listcache[1]: |
109 (f, n) = l.split('\0') | 109 (f, n) = l.split('\0') |
400 | 400 |
401 ma = self.manifest.ancestor(mm, mo) | 401 ma = self.manifest.ancestor(mm, mo) |
402 | 402 |
403 # resolve the manifest to point to all the merged files | 403 # resolve the manifest to point to all the merged files |
404 self.ui.status("resolving manifests\n") | 404 self.ui.status("resolving manifests\n") |
405 mmap = self.manifest.read(mm) # mine | |
406 omap = self.manifest.read(mo) # other | 405 omap = self.manifest.read(mo) # other |
407 amap = self.manifest.read(ma) # ancestor | 406 amap = self.manifest.read(ma) # ancestor |
407 mmap = self.manifest.read(mm) # mine | |
408 nmap = {} | 408 nmap = {} |
409 | 409 |
410 for f, mid in mmap.iteritems(): | 410 for f, mid in mmap.iteritems(): |
411 if f in omap: | 411 if f in omap: |
412 if mid != omap[f]: | 412 if mid != omap[f]: |
774 cn = self.changelog.addgroup(csg, lambda x: self.changelog.count(), tr) | 774 cn = self.changelog.addgroup(csg, lambda x: self.changelog.count(), tr) |
775 | 775 |
776 self.ui.status("merging manifests\n") | 776 self.ui.status("merging manifests\n") |
777 # pull off the manifest group | 777 # pull off the manifest group |
778 mfg = getchunk() | 778 mfg = getchunk() |
779 mo = self.manifest.tip() | 779 mm = self.manifest.tip() |
780 mm = self.manifest.addgroup(mfg, lambda x: self.changelog.rev(x), tr) | 780 mo = self.manifest.addgroup(mfg, lambda x: self.changelog.rev(x), tr) |
781 | 781 |
782 # do we need a resolve? | 782 # do we need a resolve? |
783 if self.changelog.ancestor(co, cn) != co: | 783 if self.changelog.ancestor(co, cn) != co: |
784 simple = False | 784 simple = False |
785 resolverev = self.changelog.count() | 785 resolverev = self.changelog.count() |
795 fl = self.file(f) | 795 fl = self.file(f) |
796 o = fl.tip() | 796 o = fl.tip() |
797 n = fl.addgroup(fg, lambda x: self.changelog.rev(x), tr) | 797 n = fl.addgroup(fg, lambda x: self.changelog.rev(x), tr) |
798 if not simple: | 798 if not simple: |
799 nn = fl.resolvedag(o, n, tr, resolverev) | 799 nn = fl.resolvedag(o, n, tr, resolverev) |
800 if nn: new[f] = nn | 800 if nn: |
801 self.ui.note("merged %s\n", f) | |
802 new[f] = nn | |
801 | 803 |
802 # For simple merges, we don't need to resolve manifests or changesets | 804 # For simple merges, we don't need to resolve manifests or changesets |
803 if simple: | 805 if simple: |
806 self.ui.debug("simple merge, skipping resolve\n") | |
804 tr.close() | 807 tr.close() |
805 return | 808 return |
806 | 809 |
807 # resolve the manifest to point to all the merged files | 810 # resolve the manifest to point to all the merged files |
808 self.ui.status("resolving manifests\n") | 811 self.ui.status("resolving manifests\n") |
809 ma = self.manifest.ancestor(mm, mo) | 812 ma = self.manifest.ancestor(mm, mo) |
810 mmap = self.manifest.read(mm) # mine | |
811 omap = self.manifest.read(mo) # other | 813 omap = self.manifest.read(mo) # other |
812 amap = self.manifest.read(ma) # ancestor | 814 amap = self.manifest.read(ma) # ancestor |
815 mmap = self.manifest.read(mm) # mine | |
816 self.ui.debug("ancestor %s local %s other %s\n" % | |
817 (short(ma), short(mm), short(mo))) | |
813 nmap = {} | 818 nmap = {} |
814 | 819 |
815 for f, mid in mmap.iteritems(): | 820 for f, mid in mmap.iteritems(): |
816 if f in omap: | 821 if f in omap: |
817 if mid != omap[f]: | 822 if mid != omap[f]: |
823 self.ui.debug("%s versions differ\n" % f) | |
824 if f in new: self.ui.note("%s updated in resolve\n" % f) | |
818 nmap[f] = new.get(f, mid) # use merged version | 825 nmap[f] = new.get(f, mid) # use merged version |
819 else: | 826 else: |
820 nmap[f] = new.get(f, mid) # they're the same | 827 nmap[f] = mid # keep ours |
821 del omap[f] | 828 del omap[f] |
822 elif f in amap: | 829 elif f in amap: |
823 if mid != amap[f]: | 830 if mid != amap[f]: |
831 self.ui.debug("local changed %s which other deleted\n" % f) | |
824 pass # we should prompt here | 832 pass # we should prompt here |
825 else: | 833 else: |
834 self.ui.debug("other deleted %s\n" % f) | |
826 pass # other deleted it | 835 pass # other deleted it |
827 else: | 836 else: |
828 nmap[f] = new.get(f, mid) # we created it | 837 self.ui.debug("local created %s\n" %f) |
838 nmap[f] = mid # we created it | |
829 | 839 |
830 del mmap | 840 del mmap |
831 | 841 |
832 for f, oid in omap.iteritems(): | 842 for f, oid in omap.iteritems(): |
833 if f in amap: | 843 if f in amap: |
834 if oid != amap[f]: | 844 if oid != amap[f]: |
845 self.ui.debug("other changed %s which we deleted\n" % f) | |
835 pass # this is the nasty case, we should prompt | 846 pass # this is the nasty case, we should prompt |
836 else: | 847 else: |
837 pass # probably safe | 848 pass # probably safe |
838 else: | 849 else: |
850 self.ui.debug("remote created %s\n" % f) | |
839 nmap[f] = new.get(f, oid) # remote created it | 851 nmap[f] = new.get(f, oid) # remote created it |
840 | 852 |
841 del omap | 853 del omap |
842 del amap | 854 del amap |
843 | 855 |