2396
|
1 # commands.py - command processing for mercurial
|
|
2 #
|
|
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
|
|
4 #
|
|
5 # This software may be used and distributed according to the terms
|
|
6 # of the GNU General Public License, incorporated herein by reference.
|
|
7
|
|
8 from demandload import demandload
|
|
9 from i18n import gettext as _
|
|
10 from node import *
|
|
11 demandload(globals(), "sys util")
|
|
12
|
|
13 class sshserver(object):
|
|
14 def __init__(self, ui, repo):
|
|
15 self.ui = ui
|
|
16 self.repo = repo
|
|
17 self.lock = None
|
|
18 self.fin = sys.stdin
|
|
19 self.fout = sys.stdout
|
|
20
|
|
21 sys.stdout = sys.stderr
|
|
22
|
|
23 # Prevent insertion/deletion of CRs
|
|
24 util.set_binary(self.fin)
|
|
25 util.set_binary(self.fout)
|
|
26
|
|
27 def getarg(self):
|
|
28 argline = self.fin.readline()[:-1]
|
|
29 arg, l = argline.split()
|
|
30 val = self.fin.read(int(l))
|
|
31 return arg, val
|
|
32
|
|
33 def respond(self, v):
|
|
34 self.fout.write("%d\n" % len(v))
|
|
35 self.fout.write(v)
|
|
36 self.fout.flush()
|
|
37
|
|
38 def serve_forever(self):
|
|
39 while self.serve_one(): pass
|
|
40 sys.exit(0)
|
|
41
|
|
42 def serve_one(self):
|
|
43 cmd = self.fin.readline()[:-1]
|
|
44 if cmd:
|
|
45 impl = getattr(self, 'do_' + cmd, None)
|
|
46 if impl: impl()
|
|
47 return cmd != ''
|
|
48
|
|
49 def do_heads(self):
|
|
50 h = self.repo.heads()
|
|
51 self.respond(" ".join(map(hex, h)) + "\n")
|
|
52
|
|
53 def do_lock(self):
|
|
54 self.lock = self.repo.lock()
|
|
55 self.respond("")
|
|
56
|
|
57 def do_unlock(self):
|
|
58 if self.lock:
|
|
59 self.lock.release()
|
|
60 self.lock = None
|
|
61 self.respond("")
|
|
62
|
|
63 def do_branches(self):
|
|
64 arg, nodes = self.getarg()
|
|
65 nodes = map(bin, nodes.split(" "))
|
|
66 r = []
|
|
67 for b in self.repo.branches(nodes):
|
|
68 r.append(" ".join(map(hex, b)) + "\n")
|
|
69 self.respond("".join(r))
|
|
70
|
|
71 def do_between(self):
|
|
72 arg, pairs = self.getarg()
|
|
73 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")]
|
|
74 r = []
|
|
75 for b in self.repo.between(pairs):
|
|
76 r.append(" ".join(map(hex, b)) + "\n")
|
|
77 self.respond("".join(r))
|
|
78
|
|
79 def do_changegroup(self):
|
|
80 nodes = []
|
|
81 arg, roots = self.getarg()
|
|
82 nodes = map(bin, roots.split(" "))
|
|
83
|
|
84 cg = self.repo.changegroup(nodes, 'serve')
|
|
85 while True:
|
|
86 d = cg.read(4096)
|
|
87 if not d:
|
|
88 break
|
|
89 self.fout.write(d)
|
|
90
|
|
91 self.fout.flush()
|
|
92
|
|
93 def do_addchangegroup(self):
|
|
94 if not self.lock:
|
|
95 self.respond("not locked")
|
|
96 return
|
|
97
|
|
98 self.respond("")
|
|
99 r = self.repo.addchangegroup(self.fin, 'serve')
|
|
100 self.respond(str(r))
|