1 #!/usr/bin/env python2.5
2 import sys, time, struct
3 import hashsplit, git, options, client
5 from subprocess import PIPE
9 bup split [-tcb] [-n name] [--bench] [filenames...]
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 v,verbose increase log output (can be used more than once)
17 bench print benchmark timings to stderr
18 max-pack-size= maximum bytes in a single pack
19 max-pack-objects= maximum number of objects in a single pack
20 fanout= maximum number of blobs in a single tree
22 o = options.Options('bup split', optspec)
23 (opt, flags, extra) = o.parse(sys.argv[1:])
25 git.check_repo_or_die()
26 if not (opt.blobs or opt.tree or opt.commit or opt.name):
27 log("bup split: use one or more of -b, -t, -c, -n\n")
30 hashsplit.split_verbosely = opt.verbose
32 git.verbose = opt.verbose - 1
35 hashsplit.max_pack_size = int(opt.max_pack_size)
36 if opt.max_pack_objects:
37 hashsplit.max_pack_objects = int(opt.max_pack_objects)
39 hashsplit.fanout = int(opt.fanout)
43 start_time = time.time()
45 refname = opt.name and 'refs/heads/%s' % opt.name or None
47 cli = client.Client(opt.remote)
48 oldref = refname and cli.read_ref(refname) or None
49 w = cli.new_packwriter()
52 oldref = refname and git.read_ref(refname) or None
55 (shalist,tree) = hashsplit.split_to_tree(w, hashsplit.autofiles(extra))
60 for (mode,name,bin) in shalist:
61 print bin.encode('hex')
63 print tree.encode('hex')
64 if opt.commit or opt.name:
65 msg = 'bup split\n\nGenerated by command:\n%r' % sys.argv
66 ref = opt.name and ('refs/heads/%s' % opt.name) or None
67 commit = w.new_commit(oldref, tree, msg)
69 print commit.encode('hex')
71 w.close() # must close before we can update the ref
75 cli.update_ref(refname, commit, oldref)
77 git.update_ref(refname, commit, oldref)
82 secs = time.time() - start_time
83 size = hashsplit.total_split
85 log('\nbup: %.2fkbytes in %.2f secs = %.2f kbytes/sec\n'
86 % (size/1024., secs, size/1024./secs))