Mercurial > public > mercurial-scm > hg
comparison mercurial/merge.py @ 6518:92ccccb55ba3
resolve: new command
- add basic resolve command functionality
- point failed update and merge at resolve
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 11 Apr 2008 12:52:56 -0500 |
parents | fcfb6a0a0a84 |
children | 4b92591c69a7 |
comparison
equal
deleted
inserted
replaced
6517:fcfb6a0a0a84 | 6518:92ccccb55ba3 |
---|---|
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> | 3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> |
4 # | 4 # |
5 # This software may be used and distributed according to the terms | 5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. | 6 # of the GNU General Public License, incorporated herein by reference. |
7 | 7 |
8 from node import nullid, nullrev, hex | 8 from node import nullid, nullrev, hex, bin |
9 from i18n import _ | 9 from i18n import _ |
10 import errno, util, os, filemerge, copies, shutil | 10 import errno, util, os, filemerge, copies, shutil |
11 | 11 |
12 class mergestate(object): | 12 class mergestate(object): |
13 '''track 3-way merge state of individual files''' | 13 '''track 3-way merge state of individual files''' |
14 def __init__(self, repo): | 14 def __init__(self, repo): |
15 self._repo = repo | 15 self._repo = repo |
16 self._read() | |
17 def reset(self, node): | |
16 self._state = {} | 18 self._state = {} |
17 self._data = {} | |
18 def reset(self, node): | |
19 self._local = node | 19 self._local = node |
20 shutil.rmtree(self._repo.join("merge"), True) | 20 shutil.rmtree(self._repo.join("merge"), True) |
21 def _read(self): | |
22 self._state = {} | |
23 try: | |
24 f = self._repo.opener("merge/state") | |
25 self._local = bin(f.readline()[:-1]) | |
26 for l in f: | |
27 bits = l[:-1].split("\0") | |
28 self._state[bits[0]] = bits[1:] | |
29 except IOError, err: | |
30 if err.errno != errno.ENOENT: | |
31 raise | |
32 def _write(self): | |
33 f = self._repo.opener("merge/state", "w") | |
34 f.write(hex(self._local) + "\n") | |
35 for d, v in self._state.items(): | |
36 f.write("\0".join([d] + v) + "\n") | |
21 def add(self, fcl, fco, fca, fd, flags): | 37 def add(self, fcl, fco, fca, fd, flags): |
22 hash = util.sha1(fcl.path()).hexdigest() | 38 hash = util.sha1(fcl.path()).hexdigest() |
23 self._repo.opener("merge/" + hash, "w").write(fcl.data()) | 39 self._repo.opener("merge/" + hash, "w").write(fcl.data()) |
24 self._state[fd] = 'u' | 40 self._state[fd] = ['u', hash, fcl.path(), fca.path(), |
25 self._data[fd] = (hash, fcl.path(), fca.path(), hex(fca.filenode()), | 41 hex(fca.filenode()), fco.path(), flags] |
26 fco.path(), flags) | 42 self._write() |
27 def __contains__(self, dfile): | 43 def __contains__(self, dfile): |
28 return dfile in self._state | 44 return dfile in self._state |
29 def __getitem__(self, dfile): | 45 def __getitem__(self, dfile): |
30 return self._state[dfile] | 46 return self._state[dfile][0] |
47 def __iter__(self): | |
48 l = self._state.keys() | |
49 l.sort() | |
50 for f in l: | |
51 yield f | |
31 def mark(self, dfile, state): | 52 def mark(self, dfile, state): |
32 self._state[dfile] = state | 53 self._state[dfile][0] = state |
54 self._write() | |
33 def resolve(self, dfile, wctx, octx): | 55 def resolve(self, dfile, wctx, octx): |
34 if self[dfile] == 'r': | 56 if self[dfile] == 'r': |
35 return 0 | 57 return 0 |
36 hash, lfile, afile, anode, ofile, flags = self._data[dfile] | 58 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile] |
37 f = self._repo.opener("merge/" + hash) | 59 f = self._repo.opener("merge/" + hash) |
38 self._repo.wwrite(dfile, f.read(), flags) | 60 self._repo.wwrite(dfile, f.read(), flags) |
39 fcd = wctx[dfile] | 61 fcd = wctx[dfile] |
40 fco = octx[ofile] | 62 fco = octx[ofile] |
41 fca = self._repo.filectx(afile, fileid=anode) | 63 fca = self._repo.filectx(afile, fileid=anode) |
42 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca) | 64 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca) |
43 if not r: | 65 if not r: |
44 util.set_flags(self._repo.wjoin(dfile), flags) | |
45 self.mark(dfile, 'r') | 66 self.mark(dfile, 'r') |
46 return r | 67 return r |
47 | 68 |
48 def _checkunknown(wctx, mctx): | 69 def _checkunknown(wctx, mctx): |
49 "check for collisions between unknown files and files in mctx" | 70 "check for collisions between unknown files and files in mctx" |