Mercurial > hg
comparison hgext/fetch.py @ 4917:126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 21 Jul 2007 16:02:10 -0500 |
parents | 97b734fb9c6f |
children | c80af96943aa |
comparison
equal
deleted
inserted
replaced
4916:5c5d23d93447 | 4917:126f527b3ba3 |
---|---|
17 | 17 |
18 If the pulled changes add a new head, the head is automatically | 18 If the pulled changes add a new head, the head is automatically |
19 merged, and the result of the merge is committed. Otherwise, the | 19 merged, and the result of the merge is committed. Otherwise, the |
20 working directory is updated.''' | 20 working directory is updated.''' |
21 | 21 |
22 def postincoming(other, modheads, lock, wlock): | 22 def postincoming(other, modheads): |
23 if modheads == 0: | 23 if modheads == 0: |
24 return 0 | 24 return 0 |
25 if modheads == 1: | 25 if modheads == 1: |
26 return hg.clean(repo, repo.changelog.tip(), wlock=wlock) | 26 return hg.clean(repo, repo.changelog.tip()) |
27 newheads = repo.heads(parent) | 27 newheads = repo.heads(parent) |
28 newchildren = [n for n in repo.heads(parent) if n != parent] | 28 newchildren = [n for n in repo.heads(parent) if n != parent] |
29 newparent = parent | 29 newparent = parent |
30 if newchildren: | 30 if newchildren: |
31 newparent = newchildren[0] | 31 newparent = newchildren[0] |
32 hg.clean(repo, newparent, wlock=wlock) | 32 hg.clean(repo, newparent) |
33 newheads = [n for n in repo.heads() if n != newparent] | 33 newheads = [n for n in repo.heads() if n != newparent] |
34 err = False | 34 err = False |
35 if newheads: | 35 if newheads: |
36 ui.status(_('merging with new head %d:%s\n') % | 36 ui.status(_('merging with new head %d:%s\n') % |
37 (repo.changelog.rev(newheads[0]), short(newheads[0]))) | 37 (repo.changelog.rev(newheads[0]), short(newheads[0]))) |
38 err = hg.merge(repo, newheads[0], remind=False, wlock=wlock) | 38 err = hg.merge(repo, newheads[0], remind=False) |
39 if not err and len(newheads) > 1: | 39 if not err and len(newheads) > 1: |
40 ui.status(_('not merging with %d other new heads ' | 40 ui.status(_('not merging with %d other new heads ' |
41 '(use "hg heads" and "hg merge" to merge them)') % | 41 '(use "hg heads" and "hg merge" to merge them)') % |
42 (len(newheads) - 1)) | 42 (len(newheads) - 1)) |
43 if not err: | 43 if not err: |
44 mod, add, rem = repo.status(wlock=wlock)[:3] | 44 mod, add, rem = repo.status()[:3] |
45 message = (cmdutil.logmessage(opts) or | 45 message = (cmdutil.logmessage(opts) or |
46 (_('Automated merge with %s') % other.url())) | 46 (_('Automated merge with %s') % other.url())) |
47 n = repo.commit(mod + add + rem, message, | 47 n = repo.commit(mod + add + rem, message, |
48 opts['user'], opts['date'], lock=lock, wlock=wlock, | 48 opts['user'], opts['date'], |
49 force_editor=opts.get('force_editor')) | 49 force_editor=opts.get('force_editor')) |
50 ui.status(_('new changeset %d:%s merges remote changes ' | 50 ui.status(_('new changeset %d:%s merges remote changes ' |
51 'with local\n') % (repo.changelog.rev(n), | 51 'with local\n') % (repo.changelog.rev(n), |
52 short(n))) | 52 short(n))) |
53 def pull(lock, wlock): | 53 def pull(): |
54 cmdutil.setremoteconfig(ui, opts) | 54 cmdutil.setremoteconfig(ui, opts) |
55 | 55 |
56 other = hg.repository(ui, ui.expandpath(source)) | 56 other = hg.repository(ui, ui.expandpath(source)) |
57 ui.status(_('pulling from %s\n') % ui.expandpath(source)) | 57 ui.status(_('pulling from %s\n') % ui.expandpath(source)) |
58 revs = None | 58 revs = None |
59 if opts['rev'] and not other.local(): | 59 if opts['rev'] and not other.local(): |
60 raise util.Abort(_("fetch -r doesn't work for remote repositories yet")) | 60 raise util.Abort(_("fetch -r doesn't work for remote repositories yet")) |
61 elif opts['rev']: | 61 elif opts['rev']: |
62 revs = [other.lookup(rev) for rev in opts['rev']] | 62 revs = [other.lookup(rev) for rev in opts['rev']] |
63 modheads = repo.pull(other, heads=revs, lock=lock) | 63 modheads = repo.pull(other, heads=revs) |
64 return postincoming(other, modheads, lock, wlock) | 64 return postincoming(other, modheads) |
65 | 65 |
66 parent, p2 = repo.dirstate.parents() | 66 parent, p2 = repo.dirstate.parents() |
67 if parent != repo.changelog.tip(): | 67 if parent != repo.changelog.tip(): |
68 raise util.Abort(_('working dir not at tip ' | 68 raise util.Abort(_('working dir not at tip ' |
69 '(use "hg update" to check out tip)')) | 69 '(use "hg update" to check out tip)')) |
71 raise util.Abort(_('outstanding uncommitted merge')) | 71 raise util.Abort(_('outstanding uncommitted merge')) |
72 wlock = lock = None | 72 wlock = lock = None |
73 try: | 73 try: |
74 wlock = repo.wlock() | 74 wlock = repo.wlock() |
75 lock = repo.lock() | 75 lock = repo.lock() |
76 mod, add, rem = repo.status(wlock=wlock)[:3] | 76 mod, add, rem = repo.status()[:3] |
77 if mod or add or rem: | 77 if mod or add or rem: |
78 raise util.Abort(_('outstanding uncommitted changes')) | 78 raise util.Abort(_('outstanding uncommitted changes')) |
79 if len(repo.heads()) > 1: | 79 if len(repo.heads()) > 1: |
80 raise util.Abort(_('multiple heads in this repository ' | 80 raise util.Abort(_('multiple heads in this repository ' |
81 '(use "hg heads" and "hg merge" to merge)')) | 81 '(use "hg heads" and "hg merge" to merge)')) |
82 return pull(lock, wlock) | 82 return pull() |
83 finally: | 83 finally: |
84 del lock, wlock | 84 del lock, wlock |
85 | 85 |
86 cmdtable = { | 86 cmdtable = { |
87 'fetch': | 87 'fetch': |