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)