]> arthur.barton.de Git - bup.git/blob - cmd-server.py
Extremely basic 'bup server' support.
[bup.git] / cmd-server.py
1 #!/usr/bin/env python
2 import sys, struct
3 import options, git
4 from helpers import *
5
6
7 def receive_objects(f):
8     w = git.PackWriter()
9     while 1:
10         ns = f.read(4)
11         if not ns:
12             w.abort()
13             raise Exception('object read: expected length header, got EOF\n')
14         n = struct.unpack('!I', ns)[0]
15         #log('expecting %d bytes\n' % n)
16         if not n:
17             w.close()
18             return
19         buf = f.read(n)
20         #log('read %d bytes\n' % n)
21         if len(buf) < n:
22             w.abort()
23             raise Exception('object read: expected %d bytes, got %d\n'
24                             % (n, len(buf)))
25         w._raw_write(buf)
26     w.close()
27
28
29 optspec = """
30 bup server
31 """
32 o = options.Options('bup server', optspec)
33 (opt, flags, extra) = o.parse(sys.argv[1:])
34
35 if extra:
36     log('bup server: no arguments expected\n')
37     o.usage()
38
39 log('bup server: reading from stdin.\n')
40
41 f = sys.stdin
42 lr = linereader(f)
43 for _line in lr:
44     line = _line.strip()
45     if not line:
46         continue
47     log('bup server: command: %r\n' % line)
48     if line == 'quit':
49         break
50     elif line == 'set-dir':
51         git.repodir = lr.next()
52         git.check_repo_or_die()
53         log('bup server: bupdir is %r\n' % git.repodir)
54     elif line == 'receive-objects':
55         git.check_repo_or_die()
56         receive_objects(f)
57     else:
58         raise Exception('unknown server command: %r\n' % line)
59
60 log('bup server: done\n')