mercurial/sshserver.py
changeset 11579 c19d7e91cc46
parent 11442 ee1ed6afac21
child 11580 69248b5add46
equal deleted inserted replaced
11578:bb7af1de5e38 11579:c19d7e91cc46
    27 
    27 
    28         # Prevent insertion/deletion of CRs
    28         # Prevent insertion/deletion of CRs
    29         util.set_binary(self.fin)
    29         util.set_binary(self.fin)
    30         util.set_binary(self.fout)
    30         util.set_binary(self.fout)
    31 
    31 
    32     def getarg(self):
    32     def getargs(self, args):
    33         argline = self.fin.readline()[:-1]
    33         data = {}
    34         arg, l = argline.split()
    34         keys = args.split()
    35         val = self.fin.read(int(l))
    35         count = len(keys)
    36         return arg, val
    36         for n in xrange(len(keys)):
       
    37             argline = self.fin.readline()[:-1]
       
    38             arg, l = argline.split()
       
    39             val = self.fin.read(int(l))
       
    40             if arg not in keys:
       
    41                 raise util.Abort("unexpected parameter %r" % arg)
       
    42             if arg == '*':
       
    43                 star = {}
       
    44                 for n in xrange(int(l)):
       
    45                     arg, l = argline.split()
       
    46                     val = self.fin.read(int(l))
       
    47                     star[arg] = val
       
    48                 data['*'] = star
       
    49             else:
       
    50                 data[arg] = val
       
    51         return [data[k] for k in keys]
       
    52 
       
    53     def getarg(self, name):
       
    54         return self.getargs(name)[0]
    37 
    55 
    38     def respond(self, v):
    56     def respond(self, v):
    39         self.fout.write("%d\n" % len(v))
    57         self.fout.write("%d\n" % len(v))
    40         self.fout.write(v)
    58         self.fout.write(v)
    41         self.fout.flush()
    59         self.fout.flush()
    57                 impl()
    75                 impl()
    58             else: self.respond("")
    76             else: self.respond("")
    59         return cmd != ''
    77         return cmd != ''
    60 
    78 
    61     def do_lookup(self):
    79     def do_lookup(self):
    62         arg, key = self.getarg()
    80         key = self.getarg('key')
    63         assert arg == 'key'
       
    64         try:
    81         try:
    65             r = hex(self.repo.lookup(key))
    82             r = hex(self.repo.lookup(key))
    66             success = 1
    83             success = 1
    67         except Exception, inst:
    84         except Exception, inst:
    68             r = str(inst)
    85             r = str(inst)
   108             self.lock.release()
   125             self.lock.release()
   109         self.lock = None
   126         self.lock = None
   110         self.respond("")
   127         self.respond("")
   111 
   128 
   112     def do_branches(self):
   129     def do_branches(self):
   113         arg, nodes = self.getarg()
   130         nodes = self.getarg('nodes')
   114         nodes = map(bin, nodes.split(" "))
   131         nodes = map(bin, nodes.split(" "))
   115         r = []
   132         r = []
   116         for b in self.repo.branches(nodes):
   133         for b in self.repo.branches(nodes):
   117             r.append(" ".join(map(hex, b)) + "\n")
   134             r.append(" ".join(map(hex, b)) + "\n")
   118         self.respond("".join(r))
   135         self.respond("".join(r))
   119 
   136 
   120     def do_between(self):
   137     def do_between(self):
   121         arg, pairs = self.getarg()
   138         pairs = self.getarg('pairs')
   122         pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
   139         pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
   123         r = []
   140         r = []
   124         for b in self.repo.between(pairs):
   141         for b in self.repo.between(pairs):
   125             r.append(" ".join(map(hex, b)) + "\n")
   142             r.append(" ".join(map(hex, b)) + "\n")
   126         self.respond("".join(r))
   143         self.respond("".join(r))
   127 
   144 
   128     def do_changegroup(self):
   145     def do_changegroup(self):
   129         nodes = []
   146         nodes = []
   130         arg, roots = self.getarg()
   147         roots = self.getarg('roots')
   131         nodes = map(bin, roots.split(" "))
   148         nodes = map(bin, roots.split(" "))
   132 
   149 
   133         cg = self.repo.changegroup(nodes, 'serve')
   150         cg = self.repo.changegroup(nodes, 'serve')
   134         while True:
   151         while True:
   135             d = cg.read(4096)
   152             d = cg.read(4096)
   138             self.fout.write(d)
   155             self.fout.write(d)
   139 
   156 
   140         self.fout.flush()
   157         self.fout.flush()
   141 
   158 
   142     def do_changegroupsubset(self):
   159     def do_changegroupsubset(self):
   143         argmap = dict([self.getarg(), self.getarg()])
   160         bases, heads = self.getargs('bases heads')
   144         bases = [bin(n) for n in argmap['bases'].split(' ')]
   161         bases = [bin(n) for n in bases.split(' ')]
   145         heads = [bin(n) for n in argmap['heads'].split(' ')]
   162         heads = [bin(n) for n in heads.split(' ')]
   146 
   163 
   147         cg = self.repo.changegroupsubset(bases, heads, 'serve')
   164         cg = self.repo.changegroupsubset(bases, heads, 'serve')
   148         while True:
   165         while True:
   149             d = cg.read(4096)
   166             d = cg.read(4096)
   150             if not d:
   167             if not d:
   168     def client_url(self):
   185     def client_url(self):
   169         client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0]
   186         client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0]
   170         return 'remote:ssh:' + client
   187         return 'remote:ssh:' + client
   171 
   188 
   172     def do_unbundle(self):
   189     def do_unbundle(self):
   173         their_heads = self.getarg()[1].split()
   190         their_heads = self.getarg('heads').split()
   174 
   191 
   175         def check_heads():
   192         def check_heads():
   176             heads = map(hex, self.repo.heads())
   193             heads = map(hex, self.repo.heads())
   177             return their_heads == [hex('force')] or their_heads == heads
   194             return their_heads == [hex('force')] or their_heads == heads
   178 
   195 
   225         except streamclone.StreamException, inst:
   242         except streamclone.StreamException, inst:
   226             self.fout.write(str(inst))
   243             self.fout.write(str(inst))
   227             self.fout.flush()
   244             self.fout.flush()
   228 
   245 
   229     def do_pushkey(self):
   246     def do_pushkey(self):
   230         arg, key = self.getarg()
   247         namespace, key, old, new = self.getargs('namespace key old new')
   231         arg, namespace = self.getarg()
       
   232         arg, new = self.getarg()
       
   233         arg, old = self.getarg()
       
   234         r = pushkey.push(self.repo, namespace, key, old, new)
   248         r = pushkey.push(self.repo, namespace, key, old, new)
   235         self.respond('%s\n' % int(r))
   249         self.respond('%s\n' % int(r))
   236 
   250 
   237     def do_listkeys(self):
   251     def do_listkeys(self):
   238         arg, namespace = self.getarg()
   252         namespace = self.getarg('namespace')
   239         d = pushkey.list(self.repo, namespace).items()
   253         d = pushkey.list(self.repo, namespace).items()
   240         t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
   254         t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
   241                                    v.encode('string-escape')) for k, v in d])
   255                                    v.encode('string-escape')) for k, v in d])
   242         self.respond(t)
   256         self.respond(t)