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"