comparison 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
comparison
equal deleted inserted replaced
11441:d74fe370ab04 11442:ee1ed6afac21
159 if not self.lock: 159 if not self.lock:
160 self.respond("not locked") 160 self.respond("not locked")
161 return 161 return
162 162
163 self.respond("") 163 self.respond("")
164 r = self.repo.addchangegroup(self.fin, 'serve', self.client_url()) 164 r = self.repo.addchangegroup(self.fin, 'serve', self.client_url(),
165 lock=self.lock)
165 self.respond(str(r)) 166 self.respond(str(r))
166 167
167 def client_url(self): 168 def client_url(self):
168 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0] 169 client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0]
169 return 'remote:ssh:' + client 170 return 'remote:ssh:' + client
203 self.respond('') 204 self.respond('')
204 205
205 # push can proceed 206 # push can proceed
206 207
207 fp.seek(0) 208 fp.seek(0)
208 r = self.repo.addchangegroup(fp, 'serve', self.client_url()) 209 r = self.repo.addchangegroup(fp, 'serve', self.client_url(),
210 lock=self.lock)
209 self.respond(str(r)) 211 self.respond(str(r))
210 finally: 212 finally:
211 if not was_locked: 213 if not was_locked:
212 self.lock.release() 214 self.lock.release()
213 self.lock = None 215 self.lock = None