Mercurial > public > mercurial-scm > hg
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): |