mercurial/wireproto.py
changeset 11581 4530b3307fb9
child 11583 944c23762c3c
equal deleted inserted replaced
11580:69248b5add46 11581:4530b3307fb9
       
     1 # wireproto.py - generic wire protocol support functions
       
     2 #
       
     3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 from i18n import _
       
     9 from node import bin, hex
       
    10 import urllib
       
    11 import pushkey as pushkey_
       
    12 
       
    13 def dispatch(repo, proto, command):
       
    14     if command not in commands:
       
    15         return False
       
    16     func, spec = commands[command]
       
    17     args = proto.getargs(spec)
       
    18     proto.respond(func(repo, *args))
       
    19     return True
       
    20 
       
    21 def between(repo, pairs):
       
    22     pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
       
    23     r = []
       
    24     for b in repo.between(pairs):
       
    25         r.append(" ".join(map(hex, b)) + "\n")
       
    26     return "".join(r)
       
    27 
       
    28 def branchmap(repo):
       
    29     branchmap = repo.branchmap()
       
    30     heads = []
       
    31     for branch, nodes in branchmap.iteritems():
       
    32         branchname = urllib.quote(branch)
       
    33         branchnodes = [hex(node) for node in nodes]
       
    34         heads.append('%s %s' % (branchname, ' '.join(branchnodes)))
       
    35     return '\n'.join(heads)
       
    36 
       
    37 def branches(repo, nodes):
       
    38     nodes = map(bin, nodes.split(" "))
       
    39     r = []
       
    40     for b in repo.branches(nodes):
       
    41         r.append(" ".join(map(hex, b)) + "\n")
       
    42     return "".join(r)
       
    43 
       
    44 def heads(repo):
       
    45     h = repo.heads()
       
    46     return " ".join(map(hex, h)) + "\n"
       
    47 
       
    48 def listkeys(repo, namespace):
       
    49     d = pushkey_.list(repo, namespace).items()
       
    50     t = '\n'.join(['%s\t%s' % (k.encode('string-escape'),
       
    51                                v.encode('string-escape')) for k, v in d])
       
    52     return t
       
    53 
       
    54 def lookup(repo, key):
       
    55     try:
       
    56         r = hex(repo.lookup(key))
       
    57         success = 1
       
    58     except Exception, inst:
       
    59         r = str(inst)
       
    60         success = 0
       
    61     return "%s %s\n" % (success, r)
       
    62 
       
    63 def pushkey(repo, namespace, key, old, new):
       
    64     r = pushkey_.push(repo, namespace, key, old, new)
       
    65     return '%s\n' % int(r)
       
    66 
       
    67 commands = {
       
    68     'between': (between, 'pairs'),
       
    69     'branchmap': (branchmap, ''),
       
    70     'branches': (branches, 'nodes'),
       
    71     'heads': (heads, ''),
       
    72     'listkeys': (listkeys, 'namespace'),
       
    73     'lookup': (lookup, 'key'),
       
    74     'pushkey': (pushkey, 'namespace key old new'),
       
    75 }