]> arthur.barton.de Git - bup.git/blob - cmd/split-cmd.py
cmd/split: minor correction to an error message.
[bup.git] / cmd / split-cmd.py
1 #!/usr/bin/env python
2 import sys, time, struct
3 from bup import hashsplit, git, options, client
4 from bup.helpers import *
5 from subprocess import PIPE
6
7
8 optspec = """
9 bup split [-tcb] [-n name] [--bench] [filenames...]
10 --
11 r,remote=  remote repository path
12 b,blobs    output a series of blob ids
13 t,tree     output a tree id
14 c,commit   output a commit id
15 n,name=    name of backup set to update (if any)
16 N,noop     don't actually save the data anywhere
17 q,quiet    don't print progress messages
18 v,verbose  increase log output (can be used more than once)
19 copy       just copy input to output, hashsplitting along the way
20 bench      print benchmark timings to stderr
21 max-pack-size=  maximum bytes in a single pack
22 max-pack-objects=  maximum number of objects in a single pack
23 fanout=    maximum number of blobs in a single tree
24 bwlimit=   maximum bytes/sec to transmit to server
25 """
26 o = options.Options('bup split', optspec)
27 (opt, flags, extra) = o.parse(sys.argv[1:])
28
29 handle_ctrl_c()
30 git.check_repo_or_die()
31 if not (opt.blobs or opt.tree or opt.commit or opt.name or
32         opt.noop or opt.copy):
33     o.fatal("use one or more of -b, -t, -c, -n, -N, --copy")
34 if (opt.noop or opt.copy) and (opt.blobs or opt.tree or 
35                                opt.commit or opt.name):
36     o.fatal('-N and --copy are incompatible with -b, -t, -c, -n')
37
38 if opt.verbose >= 2:
39     git.verbose = opt.verbose - 1
40     opt.bench = 1
41 if opt.max_pack_size:
42     hashsplit.max_pack_size = parse_num(opt.max_pack_size)
43 if opt.max_pack_objects:
44     hashsplit.max_pack_objects = parse_num(opt.max_pack_objects)
45 if opt.fanout:
46     hashsplit.fanout = parse_num(opt.fanout)
47 if opt.blobs:
48     hashsplit.fanout = 0
49 if opt.bwlimit:
50     client.bwlimit = parse_num(opt.bwlimit)
51
52 is_reverse = os.environ.get('BUP_SERVER_REVERSE')
53 if is_reverse and opt.remote:
54     o.fatal("don't use -r in reverse mode; it's automatic")
55 start_time = time.time()
56
57 refname = opt.name and 'refs/heads/%s' % opt.name or None
58 if opt.noop or opt.copy:
59     cli = pack_writer = oldref = None
60 elif opt.remote or is_reverse:
61     cli = client.Client(opt.remote)
62     oldref = refname and cli.read_ref(refname) or None
63     pack_writer = cli.new_packwriter()
64 else:
65     cli = None
66     oldref = refname and git.read_ref(refname) or None
67     pack_writer = git.PackWriter()
68
69 files = extra and (open(fn) for fn in extra) or [sys.stdin]
70 if pack_writer:
71     shalist = hashsplit.split_to_shalist(pack_writer, files)
72     tree = pack_writer.new_tree(shalist)
73 else:
74     last = 0
75     for (blob, bits) in hashsplit.hashsplit_iter(files):
76         hashsplit.total_split += len(blob)
77         if opt.copy:
78             sys.stdout.write(str(blob))
79         megs = hashsplit.total_split/1024/1024
80         if not opt.quiet and last != megs:
81             progress('%d Mbytes read\r' % megs)
82             last = megs
83     progress('%d Mbytes read, done.\n' % megs)
84
85 if opt.verbose:
86     log('\n')
87 if opt.blobs:
88     for (mode,name,bin) in shalist:
89         print bin.encode('hex')
90 if opt.tree:
91     print tree.encode('hex')
92 if opt.commit or opt.name:
93     msg = 'bup split\n\nGenerated by command:\n%r' % sys.argv
94     ref = opt.name and ('refs/heads/%s' % opt.name) or None
95     commit = pack_writer.new_commit(oldref, tree, msg)
96     if opt.commit:
97         print commit.encode('hex')
98
99 if pack_writer:
100     pack_writer.close()  # must close before we can update the ref
101
102 if opt.name:
103     if cli:
104         cli.update_ref(refname, commit, oldref)
105     else:
106         git.update_ref(refname, commit, oldref)
107
108 if cli:
109     cli.close()
110
111 secs = time.time() - start_time
112 size = hashsplit.total_split
113 if opt.bench:
114     log('\nbup: %.2fkbytes in %.2f secs = %.2f kbytes/sec\n'
115         % (size/1024., secs, size/1024./secs))