default: all
-all: bup-split bup-join bup randomgen chashsplit.so
+all: bup-split bup-join bup-save bup randomgen chashsplit.so
randomgen: randomgen.o
gcc -c -o $@ $^ $(CPPFLAGS) $(CFLAGS)
clean:
- rm -f *.o *.so *~ .*~ *.pyc \
- bup bup-split bup-join randomgen \
+ rm -f *.o *.so *~ .*~ *.pyc */*.pyc */*~ \
+ bup bup-split bup-join bup-save randomgen \
out[12] tags[12]
--- /dev/null
+#!/usr/bin/env python
+import sys, re, errno
+import hashsplit, git, options
+from helpers import *
+
+saved_errors = []
+
+def add_error(e):
+ saved_errors.append(e)
+ log('%s\n' % e)
+
+
+def direxpand(names):
+ for n in names:
+ log('%s\n' % n)
+ try:
+ for sub in os.listdir(n):
+ subfull = os.path.join(n, sub)
+ for sub2 in direxpand([subfull]):
+ yield sub2
+ except OSError, e:
+ if e.errno == errno.ENOTDIR:
+ yield n
+ elif e.errno in [errno.ENOENT, errno.EPERM, errno.EACCES]:
+ add_error(e)
+ else:
+ raise
+
+
+optspec = """
+bup save [-tc] [-n name] <filenames...>
+--
+t,tree output a tree id
+c,commit output a commit id
+n,name= name of backup set to update (if any)
+"""
+o = options.Options('bup save', optspec)
+(opt, flags, extra) = o.parse(sys.argv[1:])
+
+if not (opt.tree or opt.commit or opt.name):
+ log("bup save: use one or more of -t, -c, -n\n")
+ o.usage()
+
+shalist = []
+for fn in direxpand(extra):
+ try:
+ # FIXME: symlinks etc.
+ f = open(fn)
+ except IOError, e:
+ add_error(e)
+ continue
+ except OSError, e:
+ add_error(e)
+ continue
+ (mode, id) = hashsplit.split_to_blob_or_tree([f])
+ shalist.append((mode, re.sub(r'/', '_', fn), id))
+tree = git.gen_tree(shalist)
+if opt.tree:
+ print tree
+if opt.commit or opt.name:
+ msg = 'Generated by command:\n%r' % sys.argv
+ ref = opt.name and ('refs/heads/%s' % opt.name) or None
+ commit = git.gen_commit_easy(ref, tree, msg)
+ if opt.commit:
+ print commit
+
+if saved_errors:
+ log('WARNING: %d errors encountered while saving.\n' % len(saved_errors))
import sys
import git, chashsplit
+from helpers import *
BLOB_LWM = 8192*2
BLOB_MAX = BLOB_LWM*2
nv = (ofs + buf.used())/1000000
if nv != lv:
- log('%d\t' % nv)
+ #log('%d\t' % nv)
lv = nv
shalist.append(('100644', 'bup.chunk.%016x' % cn, sha))
tree = git.gen_tree(shalist)
return (shalist, tree)
+
+
+def split_to_blob_or_tree(files):
+ (shalist, tree) = split_to_tree(files)
+ if len(shalist) == 1:
+ return (shalist[0][0], shalist[0][2])
+ elif len(shalist) == 0:
+ return ('100644', git.hash_blob(''))
+ else:
+ return ('040000', tree)