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))
|