Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/sshserver.py @ 11593:d054cc5c7737
protocol: unify unbundle on the server side
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 15 Jul 2010 11:24:42 -0500 |
parents | 5d907fbb9703 |
children | 67863f9d805f |
comparison
equal
deleted
inserted
replaced
11592:26e0782b8380 | 11593:d054cc5c7737 |
---|---|
70 def sendstream(self, source): | 70 def sendstream(self, source): |
71 for chunk in source: | 71 for chunk in source: |
72 self.fout.write(chunk) | 72 self.fout.write(chunk) |
73 self.fout.flush() | 73 self.fout.flush() |
74 | 74 |
75 def getfile(self, fpout): | |
76 self.respond('') | |
77 count = int(self.fin.readline()) | |
78 while count: | |
79 fpout.write(self.fin.read(count)) | |
80 count = int(self.fin.readline()) | |
81 | |
82 def redirect(self): | |
83 pass | |
84 | |
85 def respondpush(self, ret): | |
86 self.respond('') | |
87 self.respond(str(ret)) | |
88 | |
75 def serve_forever(self): | 89 def serve_forever(self): |
76 try: | 90 try: |
77 while self.serve_one(): | 91 while self.serve_one(): |
78 pass | 92 pass |
79 finally: | 93 finally: |
125 if not self.lock: | 139 if not self.lock: |
126 self.respond("not locked") | 140 self.respond("not locked") |
127 return | 141 return |
128 | 142 |
129 self.respond("") | 143 self.respond("") |
130 r = self.repo.addchangegroup(self.fin, 'serve', self.client_url(), | 144 r = self.repo.addchangegroup(self.fin, 'serve', self._client(), |
131 lock=self.lock) | 145 lock=self.lock) |
132 return str(r) | 146 return str(r) |
133 | 147 |
134 def client_url(self): | 148 def _client(self): |
135 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] | 149 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] |
136 return 'remote:ssh:' + client | 150 return 'remote:ssh:' + client |
137 | |
138 def do_unbundle(self): | |
139 their_heads = self.getarg('heads').split() | |
140 | |
141 def check_heads(): | |
142 heads = map(hex, self.repo.heads()) | |
143 return their_heads == [hex('force')] or their_heads == heads | |
144 | |
145 # fail early if possible | |
146 if not check_heads(): | |
147 self.respond(_('unsynced changes')) | |
148 return | |
149 | |
150 self.respond('') | |
151 | |
152 # write bundle data to temporary file because it can be big | |
153 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') | |
154 fp = os.fdopen(fd, 'wb+') | |
155 try: | |
156 count = int(self.fin.readline()) | |
157 while count: | |
158 fp.write(self.fin.read(count)) | |
159 count = int(self.fin.readline()) | |
160 | |
161 was_locked = self.lock is not None | |
162 if not was_locked: | |
163 self.lock = self.repo.lock() | |
164 try: | |
165 if not check_heads(): | |
166 # someone else committed/pushed/unbundled while we | |
167 # were transferring data | |
168 self.respond(_('unsynced changes')) | |
169 return | |
170 self.respond('') | |
171 | |
172 # push can proceed | |
173 | |
174 fp.seek(0) | |
175 r = self.repo.addchangegroup(fp, 'serve', self.client_url(), | |
176 lock=self.lock) | |
177 self.respond(str(r)) | |
178 finally: | |
179 if not was_locked: | |
180 self.lock.release() | |
181 self.lock = None | |
182 finally: | |
183 fp.close() | |
184 os.unlink(tempname) |