##// END OF EJS Templates
fetch: hold lock and wlock across all operations
Vadim Gelfer -
r2827:2a0c599f default
parent child Browse files
Show More
@@ -24,29 +24,30 b" def fetch(ui, repo, source='default', **"
24 if modheads == 0:
24 if modheads == 0:
25 return 0
25 return 0
26 if modheads == 1:
26 if modheads == 1:
27 return hg.update(repo, repo.changelog.tip())
27 return hg.update(repo, repo.changelog.tip(), wlock=wlock)
28 newheads = repo.heads(parent)
28 newheads = repo.heads(parent)
29 newchildren = [n for n in repo.heads(parent) if n != parent]
29 newchildren = [n for n in repo.heads(parent) if n != parent]
30 newparent = parent
30 newparent = parent
31 if newchildren:
31 if newchildren:
32 newparent = newchildren[0]
32 newparent = newchildren[0]
33 hg.update(repo, newparent)
33 hg.update(repo, newparent, wlock=wlock)
34 newheads = [n for n in repo.heads() if n != newparent]
34 newheads = [n for n in repo.heads() if n != newparent]
35 err = False
35 err = False
36 if newheads:
36 if newheads:
37 ui.status(_('merging with new head %d:%s\n') %
37 ui.status(_('merging with new head %d:%s\n') %
38 (repo.changelog.rev(newheads[0]), short(newheads[0])))
38 (repo.changelog.rev(newheads[0]), short(newheads[0])))
39 err = hg.update(repo, newheads[0], allow=True, remind=False)
39 err = hg.update(repo, newheads[0], allow=True, remind=False,
40 wlock=wlock)
40 if not err and len(newheads) > 1:
41 if not err and len(newheads) > 1:
41 ui.status(_('not merging with %d other new heads '
42 ui.status(_('not merging with %d other new heads '
42 '(use "hg heads" and "hg merge" to merge them)') %
43 '(use "hg heads" and "hg merge" to merge them)') %
43 (len(newheads) - 1))
44 (len(newheads) - 1))
44 if not err:
45 if not err:
45 mod, add, rem = repo.status()[:3]
46 mod, add, rem = repo.status(wlock=wlock)[:3]
46 message = (commands.logmessage(opts) or
47 message = (commands.logmessage(opts) or
47 (_('Automated merge with %s') % other.url()))
48 (_('Automated merge with %s') % other.url()))
48 n = repo.commit(mod + add + rem, message,
49 n = repo.commit(mod + add + rem, message,
49 opts['user'], opts['date'], lock=lock,
50 opts['user'], opts['date'], lock=lock, wlock=wlock,
50 force_editor=opts.get('force_editor'))
51 force_editor=opts.get('force_editor'))
51 ui.status(_('new changeset %d:%s merges remote changes '
52 ui.status(_('new changeset %d:%s merges remote changes '
52 'with local\n') % (repo.changelog.rev(n),
53 'with local\n') % (repo.changelog.rev(n),
@@ -55,7 +56,7 b" def fetch(ui, repo, source='default', **"
55 commands.setremoteconfig(ui, opts)
56 commands.setremoteconfig(ui, opts)
56
57
57 other = hg.repository(ui, ui.expandpath(source))
58 other = hg.repository(ui, ui.expandpath(source))
58 ui.status(_('pulling from %s\n') % source)
59 ui.status(_('pulling from %s\n') % ui.expandpath(source))
59 revs = None
60 revs = None
60 if opts['rev'] and not other.local():
61 if opts['rev'] and not other.local():
61 raise util.Abort(_("fetch -r doesn't work for remote repositories yet"))
62 raise util.Abort(_("fetch -r doesn't work for remote repositories yet"))
@@ -70,17 +71,19 b" def fetch(ui, repo, source='default', **"
70 '(use "hg update" to check out tip)'))
71 '(use "hg update" to check out tip)'))
71 if p2 != nullid:
72 if p2 != nullid:
72 raise util.Abort(_('outstanding uncommitted merge'))
73 raise util.Abort(_('outstanding uncommitted merge'))
73 mod, add, rem = repo.status()[:3]
74 wlock = repo.wlock()
74 if mod or add or rem:
75 raise util.Abort(_('outstanding uncommitted changes'))
76 if len(repo.heads()) > 1:
77 raise util.Abort(_('multiple heads in this repository '
78 '(use "hg heads" and "hg merge" to merge them)'))
79 lock = repo.lock()
75 lock = repo.lock()
80 try:
76 try:
77 mod, add, rem = repo.status(wlock=wlock)[:3]
78 if mod or add or rem:
79 raise util.Abort(_('outstanding uncommitted changes'))
80 if len(repo.heads()) > 1:
81 raise util.Abort(_('multiple heads in this repository '
82 '(use "hg heads" and "hg merge" to merge)'))
81 return pull()
83 return pull()
82 finally:
84 finally:
83 lock.release()
85 lock.release()
86 wlock.release()
84
87
85 cmdtable = {
88 cmdtable = {
86 'fetch':
89 'fetch':
@@ -1177,22 +1177,29 b' class localrepository(repo.repository):'
1177 else:
1177 else:
1178 return subset
1178 return subset
1179
1179
1180 def pull(self, remote, heads=None, force=False):
1180 def pull(self, remote, heads=None, force=False, lock=None):
1181 l = self.lock()
1181 mylock = False
1182 if not lock:
1183 lock = self.lock()
1184 mylock = True
1182
1185
1183 fetch = self.findincoming(remote, force=force)
1186 try:
1184 if fetch == [nullid]:
1187 fetch = self.findincoming(remote, force=force)
1185 self.ui.status(_("requesting all changes\n"))
1188 if fetch == [nullid]:
1189 self.ui.status(_("requesting all changes\n"))
1186
1190
1187 if not fetch:
1191 if not fetch:
1188 self.ui.status(_("no changes found\n"))
1192 self.ui.status(_("no changes found\n"))
1189 return 0
1193 return 0
1190
1194
1191 if heads is None:
1195 if heads is None:
1192 cg = remote.changegroup(fetch, 'pull')
1196 cg = remote.changegroup(fetch, 'pull')
1193 else:
1197 else:
1194 cg = remote.changegroupsubset(fetch, heads, 'pull')
1198 cg = remote.changegroupsubset(fetch, heads, 'pull')
1195 return self.addchangegroup(cg, 'pull', remote.url())
1199 return self.addchangegroup(cg, 'pull', remote.url())
1200 finally:
1201 if mylock:
1202 lock.release()
1196
1203
1197 def push(self, remote, force=False, revs=None):
1204 def push(self, remote, force=False, revs=None):
1198 # there are two ways to push to remote repo:
1205 # there are two ways to push to remote repo:
General Comments 0
You need to be logged in to leave comments. Login now