mercurial/sshserver.py
changeset 11593 d054cc5c7737
parent 11585 5d907fbb9703
child 11594 67863f9d805f
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)