Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/sshserver.py @ 2397:e9d402506514
merge change to ssh protocol.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Sun, 04 Jun 2006 10:29:34 -0700 |
parents | 8d44649df03b |
children | cc90dcbdf053 |
rev | line source |
---|---|
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() | |
2397
e9d402506514
merge change to ssh protocol.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2396
diff
changeset
|
47 else: self.respond("") |
2396 | 48 return cmd != '' |
49 | |
50 def do_heads(self): | |
51 h = self.repo.heads() | |
52 self.respond(" ".join(map(hex, h)) + "\n") | |
53 | |
54 def do_lock(self): | |
55 self.lock = self.repo.lock() | |
56 self.respond("") | |
57 | |
58 def do_unlock(self): | |
59 if self.lock: | |
60 self.lock.release() | |
61 self.lock = None | |
62 self.respond("") | |
63 | |
64 def do_branches(self): | |
65 arg, nodes = self.getarg() | |
66 nodes = map(bin, nodes.split(" ")) | |
67 r = [] | |
68 for b in self.repo.branches(nodes): | |
69 r.append(" ".join(map(hex, b)) + "\n") | |
70 self.respond("".join(r)) | |
71 | |
72 def do_between(self): | |
73 arg, pairs = self.getarg() | |
74 pairs = [map(bin, p.split("-")) for p in pairs.split(" ")] | |
75 r = [] | |
76 for b in self.repo.between(pairs): | |
77 r.append(" ".join(map(hex, b)) + "\n") | |
78 self.respond("".join(r)) | |
79 | |
80 def do_changegroup(self): | |
81 nodes = [] | |
82 arg, roots = self.getarg() | |
83 nodes = map(bin, roots.split(" ")) | |
84 | |
85 cg = self.repo.changegroup(nodes, 'serve') | |
86 while True: | |
87 d = cg.read(4096) | |
88 if not d: | |
89 break | |
90 self.fout.write(d) | |
91 | |
92 self.fout.flush() | |
93 | |
94 def do_addchangegroup(self): | |
95 if not self.lock: | |
96 self.respond("not locked") | |
97 return | |
98 | |
99 self.respond("") | |
100 r = self.repo.addchangegroup(self.fin, 'serve') | |
101 self.respond(str(r)) |