Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/hg.py @ 993:6f274afc05c7
Clean up some merge logic
- rename mode to branch_merge
- use explicit update mode
- use negative mtime for updates that set mtime
- expand some cryptic variable names
- elaborate merge dirstate comments
- remove redundant manifest lookup for non-merge case
- remove impossible merge case
- fix up test cases
author | mpm@selenic.com |
---|---|
date | Tue, 23 Aug 2005 02:19:38 -0700 |
parents | f859e9cba1b9 |
children | 88c15682d9b0 |
comparison
equal
deleted
inserted
replaced
992:f859e9cba1b9 | 993:6f274afc05c7 |
---|---|
1747 get[f] = merge[f][1] | 1747 get[f] = merge[f][1] |
1748 merge = {} | 1748 merge = {} |
1749 | 1749 |
1750 if linear_path or force: | 1750 if linear_path or force: |
1751 # we don't need to do any magic, just jump to the new rev | 1751 # we don't need to do any magic, just jump to the new rev |
1752 mode = 'n' | 1752 branch_merge = False |
1753 p1, p2 = p2, nullid | 1753 p1, p2 = p2, nullid |
1754 else: | 1754 else: |
1755 if not allow: | 1755 if not allow: |
1756 self.ui.status("this update spans a branch" + | 1756 self.ui.status("this update spans a branch" + |
1757 " affecting the following files:\n") | 1757 " affecting the following files:\n") |
1763 self.ui.status(" %s%s\n" % (f, cf)) | 1763 self.ui.status(" %s%s\n" % (f, cf)) |
1764 self.ui.warn("aborting update spanning branches!\n") | 1764 self.ui.warn("aborting update spanning branches!\n") |
1765 self.ui.status("(use update -m to merge across branches" + | 1765 self.ui.status("(use update -m to merge across branches" + |
1766 " or -C to lose changes)\n") | 1766 " or -C to lose changes)\n") |
1767 return 1 | 1767 return 1 |
1768 mode = 'm' | 1768 branch_merge = True |
1769 | 1769 |
1770 if moddirstate: | 1770 if moddirstate: |
1771 self.dirstate.setparents(p1, p2) | 1771 self.dirstate.setparents(p1, p2) |
1772 | 1772 |
1773 # get the files we don't need to change | 1773 # get the files we don't need to change |
1782 except IOError: | 1782 except IOError: |
1783 os.makedirs(os.path.dirname(self.wjoin(f))) | 1783 os.makedirs(os.path.dirname(self.wjoin(f))) |
1784 self.wfile(f, "w").write(t) | 1784 self.wfile(f, "w").write(t) |
1785 util.set_exec(self.wjoin(f), mf2[f]) | 1785 util.set_exec(self.wjoin(f), mf2[f]) |
1786 if moddirstate: | 1786 if moddirstate: |
1787 if mode == 'm': | 1787 if branch_merge: |
1788 self.dirstate.update([f], 'n', st_mtime=0) | 1788 self.dirstate.update([f], 'n', st_mtime=-1) |
1789 else: | 1789 else: |
1790 self.dirstate.update([f], 'n') | 1790 self.dirstate.update([f], 'n') |
1791 | 1791 |
1792 # merge the tricky bits | 1792 # merge the tricky bits |
1793 files = merge.keys() | 1793 files = merge.keys() |
1794 files.sort() | 1794 files.sort() |
1795 for f in files: | 1795 for f in files: |
1796 self.ui.status("merging %s\n" % f) | 1796 self.ui.status("merging %s\n" % f) |
1797 m, o, flag = merge[f] | 1797 my, other, flag = merge[f] |
1798 self.merge3(f, m, o) | 1798 self.merge3(f, my, other) |
1799 util.set_exec(self.wjoin(f), flag) | 1799 util.set_exec(self.wjoin(f), flag) |
1800 if moddirstate: | 1800 if moddirstate: |
1801 if mode == 'm': | 1801 if branch_merge: |
1802 # only update dirstate on branch merge, otherwise we | 1802 # We've done a branch merge, mark this file as merged |
1803 # could mark files with changes as unchanged | 1803 # so that we properly record the merger later |
1804 self.dirstate.update([f], mode) | 1804 self.dirstate.update([f], 'm') |
1805 elif p2 == nullid: | |
1806 # update dirstate from parent1's manifest | |
1807 m1n = self.changelog.read(p1)[0] | |
1808 m1 = self.manifest.read(m1n) | |
1809 f_len = len(self.file(f).read(m1[f])) | |
1810 self.dirstate.update([f], mode, st_size=f_len, st_mtime=0) | |
1811 else: | 1805 else: |
1812 self.ui.warn("Second parent without branch merge!?\n" | 1806 # We've update-merged a locally modified file, so |
1813 "Dirstate for file %s may be wrong.\n" % f) | 1807 # we set the dirstate to emulate a normal checkout |
1808 # of that file some time in the past. Thus our | |
1809 # merge will appear as a normal local file | |
1810 # modification. | |
1811 f_len = len(self.file(f).read(other)) | |
1812 self.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) | |
1814 | 1813 |
1815 remove.sort() | 1814 remove.sort() |
1816 for f in remove: | 1815 for f in remove: |
1817 self.ui.note("removing %s\n" % f) | 1816 self.ui.note("removing %s\n" % f) |
1818 try: | 1817 try: |
1821 self.ui.warn("update failed to remove %s: %s!\n" % (f, inst)) | 1820 self.ui.warn("update failed to remove %s: %s!\n" % (f, inst)) |
1822 # try removing directories that might now be empty | 1821 # try removing directories that might now be empty |
1823 try: os.removedirs(os.path.dirname(self.wjoin(f))) | 1822 try: os.removedirs(os.path.dirname(self.wjoin(f))) |
1824 except: pass | 1823 except: pass |
1825 if moddirstate: | 1824 if moddirstate: |
1826 if mode == 'n': | 1825 if branch_merge: |
1826 self.dirstate.update(remove, 'r') | |
1827 else: | |
1827 self.dirstate.forget(remove) | 1828 self.dirstate.forget(remove) |
1828 else: | |
1829 self.dirstate.update(remove, 'r') | |
1830 | 1829 |
1831 def merge3(self, fn, my, other): | 1830 def merge3(self, fn, my, other): |
1832 """perform a 3-way merge in the working directory""" | 1831 """perform a 3-way merge in the working directory""" |
1833 | 1832 |
1834 def temp(prefix, node): | 1833 def temp(prefix, node): |