comparison mercurial/merge.py @ 12369:6f0d9d79111f

merge: delay writing the mergestate during until commit is called This speeds up merges of lots of files considerably.
author Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
date Mon, 06 Sep 2010 17:35:49 +0200
parents 28e2e3804f2e
children 4f8067c94729
comparison
equal deleted inserted replaced
12368:9581d5efb6a5 12369:6f0d9d79111f
12 12
13 class mergestate(object): 13 class mergestate(object):
14 '''track 3-way merge state of individual files''' 14 '''track 3-way merge state of individual files'''
15 def __init__(self, repo): 15 def __init__(self, repo):
16 self._repo = repo 16 self._repo = repo
17 self._dirty = False
17 self._read() 18 self._read()
18 def reset(self, node=None): 19 def reset(self, node=None):
19 self._state = {} 20 self._state = {}
20 if node: 21 if node:
21 self._local = node 22 self._local = node
22 shutil.rmtree(self._repo.join("merge"), True) 23 shutil.rmtree(self._repo.join("merge"), True)
24 self._dirty = False
23 def _read(self): 25 def _read(self):
24 self._state = {} 26 self._state = {}
25 try: 27 try:
26 f = self._repo.opener("merge/state") 28 f = self._repo.opener("merge/state")
27 for i, l in enumerate(f): 29 for i, l in enumerate(f):
31 bits = l[:-1].split("\0") 33 bits = l[:-1].split("\0")
32 self._state[bits[0]] = bits[1:] 34 self._state[bits[0]] = bits[1:]
33 except IOError, err: 35 except IOError, err:
34 if err.errno != errno.ENOENT: 36 if err.errno != errno.ENOENT:
35 raise 37 raise
36 def _write(self): 38 self._dirty = False
37 f = self._repo.opener("merge/state", "w") 39 def commit(self):
38 f.write(hex(self._local) + "\n") 40 if self._dirty:
39 for d, v in self._state.iteritems(): 41 f = self._repo.opener("merge/state", "w")
40 f.write("\0".join([d] + v) + "\n") 42 f.write(hex(self._local) + "\n")
43 for d, v in self._state.iteritems():
44 f.write("\0".join([d] + v) + "\n")
45 self._dirty = False
41 def add(self, fcl, fco, fca, fd, flags): 46 def add(self, fcl, fco, fca, fd, flags):
42 hash = util.sha1(fcl.path()).hexdigest() 47 hash = util.sha1(fcl.path()).hexdigest()
43 self._repo.opener("merge/" + hash, "w").write(fcl.data()) 48 self._repo.opener("merge/" + hash, "w").write(fcl.data())
44 self._state[fd] = ['u', hash, fcl.path(), fca.path(), 49 self._state[fd] = ['u', hash, fcl.path(), fca.path(),
45 hex(fca.filenode()), fco.path(), flags] 50 hex(fca.filenode()), fco.path(), flags]
46 self._write() 51 self._dirty = True
47 def __contains__(self, dfile): 52 def __contains__(self, dfile):
48 return dfile in self._state 53 return dfile in self._state
49 def __getitem__(self, dfile): 54 def __getitem__(self, dfile):
50 return self._state[dfile][0] 55 return self._state[dfile][0]
51 def __iter__(self): 56 def __iter__(self):
53 l.sort() 58 l.sort()
54 for f in l: 59 for f in l:
55 yield f 60 yield f
56 def mark(self, dfile, state): 61 def mark(self, dfile, state):
57 self._state[dfile][0] = state 62 self._state[dfile][0] = state
58 self._write() 63 self._dirty = True
59 def resolve(self, dfile, wctx, octx): 64 def resolve(self, dfile, wctx, octx):
60 if self[dfile] == 'r': 65 if self[dfile] == 'r':
61 return 0 66 return 0
62 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile] 67 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
63 f = self._repo.opener("merge/" + hash) 68 f = self._repo.opener("merge/" + hash)
350 for nf in fl: 355 for nf in fl:
351 repo.ui.warn(" %s\n" % nf) 356 repo.ui.warn(" %s\n" % nf)
352 elif m == "e": # exec 357 elif m == "e": # exec
353 flags = a[2] 358 flags = a[2]
354 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags) 359 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags)
360 ms.commit()
355 u.progress(_('updating'), None, total=numupdates, unit='files') 361 u.progress(_('updating'), None, total=numupdates, unit='files')
356 362
357 return updated, merged, removed, unresolved 363 return updated, merged, removed, unresolved
358 364
359 def recordupdates(repo, action, branchmerge): 365 def recordupdates(repo, action, branchmerge):