mercurial/sshserver.py
changeset 2439 e8c4f3d3df8c
parent 2419 b17eebc911ae
child 2612 ffb895f16925
equal deleted inserted replaced
2436:f910b91dd912 2439:e8c4f3d3df8c
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 from demandload import demandload
     8 from demandload import demandload
     9 from i18n import gettext as _
     9 from i18n import gettext as _
    10 from node import *
    10 from node import *
    11 demandload(globals(), "sys util")
    11 demandload(globals(), "os sys tempfile util")
    12 
    12 
    13 class sshserver(object):
    13 class sshserver(object):
    14     def __init__(self, ui, repo):
    14     def __init__(self, ui, repo):
    15         self.ui = ui
    15         self.ui = ui
    16         self.repo = repo
    16         self.repo = repo
    58         consists of a line in the form:
    58         consists of a line in the form:
    59 
    59 
    60         capabilities: space separated list of tokens
    60         capabilities: space separated list of tokens
    61         '''
    61         '''
    62 
    62 
    63         r = "capabilities:\n"
    63         r = "capabilities: unbundle\n"
    64         self.respond(r)
    64         self.respond(r)
    65 
    65 
    66     def do_lock(self):
    66     def do_lock(self):
       
    67         '''DEPRECATED - allowing remote client to lock repo is not safe'''
       
    68 
    67         self.lock = self.repo.lock()
    69         self.lock = self.repo.lock()
    68         self.respond("")
    70         self.respond("")
    69 
    71 
    70     def do_unlock(self):
    72     def do_unlock(self):
       
    73         '''DEPRECATED'''
       
    74 
    71         if self.lock:
    75         if self.lock:
    72             self.lock.release()
    76             self.lock.release()
    73         self.lock = None
    77         self.lock = None
    74         self.respond("")
    78         self.respond("")
    75 
    79 
   102             self.fout.write(d)
   106             self.fout.write(d)
   103 
   107 
   104         self.fout.flush()
   108         self.fout.flush()
   105 
   109 
   106     def do_addchangegroup(self):
   110     def do_addchangegroup(self):
       
   111         '''DEPRECATED'''
       
   112 
   107         if not self.lock:
   113         if not self.lock:
   108             self.respond("not locked")
   114             self.respond("not locked")
   109             return
   115             return
   110 
   116 
   111         self.respond("")
   117         self.respond("")
   112         r = self.repo.addchangegroup(self.fin, 'serve')
   118         r = self.repo.addchangegroup(self.fin, 'serve')
   113         self.respond(str(r))
   119         self.respond(str(r))
       
   120 
       
   121     def do_unbundle(self):
       
   122         their_heads = self.getarg()[1].split()
       
   123 
       
   124         def check_heads():
       
   125             heads = map(hex, self.repo.heads())
       
   126             return their_heads == [hex('force')] or their_heads == heads
       
   127 
       
   128         # fail early if possible
       
   129         if not check_heads():
       
   130             self.respond(_('unsynced changes'))
       
   131             return
       
   132 
       
   133         self.respond('')
       
   134 
       
   135         # write bundle data to temporary file because it can be big
       
   136 
       
   137         try:
       
   138             fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
       
   139             fp = os.fdopen(fd, 'wb+')
       
   140 
       
   141             count = int(self.fin.readline())
       
   142             while count:
       
   143                 fp.write(self.fin.read(count))
       
   144                 count = int(self.fin.readline())
       
   145 
       
   146             was_locked = self.lock is not None
       
   147             if not was_locked:
       
   148                 self.lock = self.repo.lock()
       
   149             try:
       
   150                 if not check_heads():
       
   151                     # someone else committed/pushed/unbundled while we
       
   152                     # were transferring data
       
   153                     self.respond(_('unsynced changes'))
       
   154                     return
       
   155                 self.respond('')
       
   156 
       
   157                 # push can proceed
       
   158 
       
   159                 fp.seek(0)
       
   160                 r = self.repo.addchangegroup(fp, 'serve')
       
   161                 self.respond(str(r))
       
   162             finally:
       
   163                 if not was_locked:
       
   164                     self.lock.release()
       
   165                     self.lock = None
       
   166         finally:
       
   167             fp.close()
       
   168             os.unlink(tempname)
       
   169