Mercurial > public > mercurial-scm > hg
annotate mercurial/sshserver.py @ 11442:ee1ed6afac21 stable
addchangegroup: pass in lock to release it before changegroup hook is called
Currently, callers of addchangegroup first acquire the repository
lock, usually to check that an unbundle request isn't racing. This
means that changegroup hook actions that might write to a repo get
stuck waiting for a lock. Here, we add a new optional lock parameter
and update all the callers. Post-1.6 we may make it non-optional.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 25 Jun 2010 13:47:28 -0500 |
parents | 02a4373ca5cd |
children | c19d7e91cc46 |
rev | line source |
---|---|
2399 | 1 # sshserver.py - ssh protocol server support for mercurial |
2396 | 2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4258
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2859 | 4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
2396 | 5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8109
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
2396 | 8 |
3891 | 9 from i18n import _ |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
5833
diff
changeset
|
10 from node import bin, hex |
11369 | 11 import streamclone, util, hook, pushkey |
9713
d193cc97c4e8
hgweb/sshserver: extract capabilities for easier modification
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9198
diff
changeset
|
12 import os, sys, tempfile, urllib, copy |
2396 | 13 |
14 class sshserver(object): | |
9713
d193cc97c4e8
hgweb/sshserver: extract capabilities for easier modification
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9198
diff
changeset
|
15 |
11369 | 16 caps = 'unbundle lookup changegroupsubset branchmap pushkey'.split() |
9713
d193cc97c4e8
hgweb/sshserver: extract capabilities for easier modification
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9198
diff
changeset
|
17 |
2396 | 18 def __init__(self, ui, repo): |
19 self.ui = ui | |
20 self.repo = repo | |
21 self.lock = None | |
22 self.fin = sys.stdin | |
23 self.fout = sys.stdout | |
24 | |
5833
323b9c55b328
hook: redirect stdout to stderr for ssh and http servers
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
25 hook.redirect(True) |
2396 | 26 sys.stdout = sys.stderr |
27 | |
28 # Prevent insertion/deletion of CRs | |
29 util.set_binary(self.fin) | |
30 util.set_binary(self.fout) | |
31 | |
32 def getarg(self): | |
33 argline = self.fin.readline()[:-1] | |
34 arg, l = argline.split() | |
35 val = self.fin.read(int(l)) | |
36 return arg, val | |
37 | |
38 def respond(self, v): | |
39 self.fout.write("%d\n" % len(v)) | |
40 self.fout.write(v) | |
41 self.fout.flush() | |
42 | |
43 def serve_forever(self): | |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7875
diff
changeset
|
44 try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
45 while self.serve_one(): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
46 pass |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7875
diff
changeset
|
47 finally: |
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7875
diff
changeset
|
48 if self.lock is not None: |
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7875
diff
changeset
|
49 self.lock.release() |
2396 | 50 sys.exit(0) |
51 | |
52 def serve_one(self): | |
53 cmd = self.fin.readline()[:-1] | |
54 if cmd: | |
55 impl = getattr(self, 'do_' + cmd, None) | |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
56 if impl: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
57 impl() |
2397
e9d402506514
merge change to ssh protocol.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2396
diff
changeset
|
58 else: self.respond("") |
2396 | 59 return cmd != '' |
60 | |
3446
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
61 def do_lookup(self): |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
62 arg, key = self.getarg() |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
63 assert arg == 'key' |
3447
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
64 try: |
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
65 r = hex(self.repo.lookup(key)) |
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
66 success = 1 |
9198
061eeb602354
coding style: use a space after comma
Martin Geisler <mg@lazybytes.net>
parents:
8562
diff
changeset
|
67 except Exception, inst: |
3447
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
68 r = str(inst) |
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
69 success = 0 |
ef1032c223e7
sshrepo: add passing of lookup exceptions
Eric Hopper <hopper@omnifarious.org>
parents:
3446
diff
changeset
|
70 self.respond("%s %s\n" % (success, r)) |
3446
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
71 |
8562
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
72 def do_branchmap(self): |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
73 branchmap = self.repo.branchmap() |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
74 heads = [] |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
75 for branch, nodes in branchmap.iteritems(): |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
76 branchname = urllib.quote(branch) |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
77 branchnodes = [hex(node) for node in nodes] |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
78 heads.append('%s %s' % (branchname, ' '.join(branchnodes))) |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
79 self.respond('\n'.join(heads)) |
e3495c399006
named branches: server branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8312
diff
changeset
|
80 |
2396 | 81 def do_heads(self): |
82 h = self.repo.heads() | |
83 self.respond(" ".join(map(hex, h)) + "\n") | |
84 | |
2419
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
85 def do_hello(self): |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
86 '''the hello command returns a set of lines describing various |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
87 interesting things about the server, in an RFC822-like format. |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
88 Currently the only one defined is "capabilities", which |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
89 consists of a line in the form: |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
90 |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
91 capabilities: space separated list of tokens |
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
92 ''' |
9713
d193cc97c4e8
hgweb/sshserver: extract capabilities for easier modification
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9198
diff
changeset
|
93 caps = copy.copy(self.caps) |
10377
04e1e6743809
streamclone: allow uncompressed clones by default
Matt Mackall <mpm@selenic.com>
parents:
10282
diff
changeset
|
94 if streamclone.allowed(self.repo.ui): |
4258
b11a2fb59cf5
revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents:
3891
diff
changeset
|
95 caps.append('stream=%d' % self.repo.changelog.version) |
2621
5a5852a417b1
clone: disable stream support on server side by default.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
96 self.respond("capabilities: %s\n" % (' '.join(caps),)) |
2419
b17eebc911ae
Initial implementation of hello command for ssh
Matt Mackall <mpm@selenic.com>
parents:
2399
diff
changeset
|
97 |
2396 | 98 def do_lock(self): |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
99 '''DEPRECATED - allowing remote client to lock repo is not safe''' |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
100 |
2396 | 101 self.lock = self.repo.lock() |
102 self.respond("") | |
103 | |
104 def do_unlock(self): | |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
105 '''DEPRECATED''' |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
106 |
2396 | 107 if self.lock: |
108 self.lock.release() | |
109 self.lock = None | |
110 self.respond("") | |
111 | |
112 def do_branches(self): | |
113 arg, nodes = self.getarg() | |
114 nodes = map(bin, nodes.split(" ")) | |
115 r = [] | |
116 for b in self.repo.branches(nodes): | |
117 r.append(" ".join(map(hex, b)) + "\n") | |
118 self.respond("".join(r)) | |
119 | |
120 def do_between(self): | |
121 arg, pairs = self.getarg() | |
122 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")] | |
123 r = [] | |
124 for b in self.repo.between(pairs): | |
125 r.append(" ".join(map(hex, b)) + "\n") | |
126 self.respond("".join(r)) | |
127 | |
128 def do_changegroup(self): | |
129 nodes = [] | |
130 arg, roots = self.getarg() | |
131 nodes = map(bin, roots.split(" ")) | |
132 | |
133 cg = self.repo.changegroup(nodes, 'serve') | |
134 while True: | |
135 d = cg.read(4096) | |
136 if not d: | |
137 break | |
138 self.fout.write(d) | |
139 | |
140 self.fout.flush() | |
141 | |
3446
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
142 def do_changegroupsubset(self): |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
143 argmap = dict([self.getarg(), self.getarg()]) |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
144 bases = [bin(n) for n in argmap['bases'].split(' ')] |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
145 heads = [bin(n) for n in argmap['heads'].split(' ')] |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
146 |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
147 cg = self.repo.changegroupsubset(bases, heads, 'serve') |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
148 while True: |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
149 d = cg.read(4096) |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
150 if not d: |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
151 break |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
152 self.fout.write(d) |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
153 |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
154 self.fout.flush() |
0b450267cf47
Adding changegroupsubset and lookup to ssh protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents:
3223
diff
changeset
|
155 |
2396 | 156 def do_addchangegroup(self): |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
157 '''DEPRECATED''' |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
158 |
2396 | 159 if not self.lock: |
160 self.respond("not locked") | |
161 return | |
162 | |
163 self.respond("") | |
11442
ee1ed6afac21
addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents:
11369
diff
changeset
|
164 r = self.repo.addchangegroup(self.fin, 'serve', self.client_url(), |
ee1ed6afac21
addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents:
11369
diff
changeset
|
165 lock=self.lock) |
2396 | 166 self.respond(str(r)) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
167 |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2622
diff
changeset
|
168 def client_url(self): |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2622
diff
changeset
|
169 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2622
diff
changeset
|
170 return 'remote:ssh:' + client |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2859
diff
changeset
|
171 |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
172 def do_unbundle(self): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
173 their_heads = self.getarg()[1].split() |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
174 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
175 def check_heads(): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
176 heads = map(hex, self.repo.heads()) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
177 return their_heads == [hex('force')] or their_heads == heads |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
178 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
179 # fail early if possible |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
180 if not check_heads(): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
181 self.respond(_('unsynced changes')) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
182 return |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
183 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
184 self.respond('') |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
185 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
186 # write bundle data to temporary file because it can be big |
9742
0c84afa1d622
sshrepo: move mkstemp() out of the try block, we don't use the exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9713
diff
changeset
|
187 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') |
0c84afa1d622
sshrepo: move mkstemp() out of the try block, we don't use the exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9713
diff
changeset
|
188 fp = os.fdopen(fd, 'wb+') |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
189 try: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
190 count = int(self.fin.readline()) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
191 while count: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
192 fp.write(self.fin.read(count)) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
193 count = int(self.fin.readline()) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
194 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
195 was_locked = self.lock is not None |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
196 if not was_locked: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
197 self.lock = self.repo.lock() |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
198 try: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
199 if not check_heads(): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
200 # someone else committed/pushed/unbundled while we |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
201 # were transferring data |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
202 self.respond(_('unsynced changes')) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
203 return |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
204 self.respond('') |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
205 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
206 # push can proceed |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
207 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
208 fp.seek(0) |
11442
ee1ed6afac21
addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents:
11369
diff
changeset
|
209 r = self.repo.addchangegroup(fp, 'serve', self.client_url(), |
ee1ed6afac21
addchangegroup: pass in lock to release it before changegroup hook is called
Matt Mackall <mpm@selenic.com>
parents:
11369
diff
changeset
|
210 lock=self.lock) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
211 self.respond(str(r)) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
212 finally: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
213 if not was_locked: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
214 self.lock.release() |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
215 self.lock = None |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
216 finally: |
9742
0c84afa1d622
sshrepo: move mkstemp() out of the try block, we don't use the exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9713
diff
changeset
|
217 fp.close() |
0c84afa1d622
sshrepo: move mkstemp() out of the try block, we don't use the exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9713
diff
changeset
|
218 os.unlink(tempname) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2419
diff
changeset
|
219 |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2439
diff
changeset
|
220 def do_stream_out(self): |
6925
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
221 try: |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
222 for chunk in streamclone.stream_out(self.repo): |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
223 self.fout.write(chunk) |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
224 self.fout.flush() |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
225 except streamclone.StreamException, inst: |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
226 self.fout.write(str(inst)) |
87abfefafe02
make streamclone.stream_out() a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6794
diff
changeset
|
227 self.fout.flush() |
11369 | 228 |
229 def do_pushkey(self): | |
230 arg, key = self.getarg() | |
231 arg, namespace = self.getarg() | |
232 arg, new = self.getarg() | |
233 arg, old = self.getarg() | |
234 r = pushkey.push(self.repo, namespace, key, old, new) | |
235 self.respond('%s\n' % int(r)) | |
236 | |
237 def do_listkeys(self): | |
238 arg, namespace = self.getarg() | |
239 d = pushkey.list(self.repo, namespace).items() | |
240 t = '\n'.join(['%s\t%s' % (k.encode('string-escape'), | |
241 v.encode('string-escape')) for k, v in d]) | |
242 self.respond(t) |