Mercurial > hg-stable
changeset 862:d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
The dirstate has to match what is in the repository (what would be
checked out with 'hg update -C'), because the resulting file may be
identical to the new parent, or it may be completely different.
Previously the dirstate wasn't updated, so if you changed the file to
look like the original parent, it might be considered unmodified
relative to the new parent.
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Wed, 10 Aug 2005 06:47:46 +0100 |
parents | cbe5c4d016b7 |
children | a7e95e3606c7 |
files | mercurial/hg.py tests/test-merge-revert.out tests/test-merge-revert2.out |
diffstat | 3 files changed, 20 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/hg.py Tue Aug 09 11:32:30 2005 +0100 +++ b/mercurial/hg.py Wed Aug 10 06:47:46 2005 +0100 @@ -392,7 +392,7 @@ def copied(self, file): return self.copies.get(file, None) - def update(self, files, state): + def update(self, files, state, **kw): ''' current states: n normal m needs merging @@ -407,7 +407,10 @@ self.map[f] = ('r', 0, 0, 0) else: s = os.stat(os.path.join(self.root, f)) - self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime) + st_mode = kw.get('st_mode', s.st_mode) + st_size = kw.get('st_size', s.st_size) + st_mtime = kw.get('st_mtime', s.st_mtime) + self.map[f] = (state, st_mode, st_size, st_mtime) def forget(self, files): if not files: return @@ -1571,10 +1574,21 @@ m, o, flag = merge[f] self.merge3(f, m, o) util.set_exec(self.wjoin(f), flag) - if moddirstate and mode == 'm': - # only update dirstate on branch merge, otherwise we - # could mark files with changes as unchanged - self.dirstate.update([f], mode) + if moddirstate: + if mode == 'm': + # only update dirstate on branch merge, otherwise we + # could mark files with changes as unchanged + self.dirstate.update([f], mode) + elif p2 == nullid: + # update dirstate from parent1's manifest + m1n = self.changelog.read(p1)[0] + m1 = self.manifest.read(m1n) + file_ = self.file(f) + f_len = file_.length(file_.rev(m1[f])) + self.dirstate.update([f], mode, st_size=f_len, st_mtime=0) + else: + self.ui.warn("Second parent without branch merge!?\n" + "Dirstate for file %s may be wrong.\n" % f) remove.sort() for f in remove: