3 import hashsplit, git, options
16 for sub in os.listdir(n):
17 subfull = os.path.join(n, sub)
18 for sub2 in direxpand([subfull]):
21 if e.errno == errno.ENOTDIR:
23 elif e.errno in [errno.ENOENT, errno.EPERM, errno.EACCES]:
30 p = os.path.normpath(dir)
31 return (p != '.') and p or ''
35 def __init__(self, parent, name):
37 assert(not (parent and not name))
43 self.parent.children[self.name] = self
47 return os.path.join(self.parent.fullpath(), self.name)
57 def getdir(self, dir):
58 # FIXME: deal with '..' somehow
59 if dir.startswith('/'):
64 for part in _normpath(dir).split('/'):
65 sub = top.children.get(part)
67 sub = top.children[part] = Tree(top, part)
71 def addfile(self, mode, fullname, id):
72 (dir, name) = os.path.split(fullname)
73 self.getdir(dir).children[name] = (mode, name, id)
76 for c in self.children.values():
77 if isinstance(c, tuple): # sha1 entry for a file
80 t = ('40000', c.name, c.gen_tree())
85 self.sha = git.gen_tree(self.shalist())
90 bup save [-tc] [-n name] <filenames...>
92 t,tree output a tree id
93 c,commit output a commit id
94 n,name= name of backup set to update (if any)
95 v,verbose increase log output (can be used more than once)
97 o = options.Options('bup save', optspec)
98 (opt, flags, extra) = o.parse(sys.argv[1:])
100 if not (opt.tree or opt.commit or opt.name):
101 log("bup save: use one or more of -t, -c, -n\n")
105 git.verbose = opt.verbose - 1
106 hashsplit.split_verbosely = opt.verbose - 1
108 root = Tree(None, '')
109 for fn in direxpand(extra):
113 # FIXME: symlinks etc.
121 (mode, id) = hashsplit.split_to_blob_or_tree([f])
122 root.addfile(mode, fn, id)
123 tree = root.gen_tree()
127 print tree.encode('hex')
128 if opt.commit or opt.name:
129 msg = 'bup save\n\nGenerated by command:\n%r' % sys.argv
130 ref = opt.name and ('refs/heads/%s' % opt.name) or None
131 commit = git.gen_commit_easy(ref, tree, msg)
133 print commit.encode('hex')
138 log('WARNING: %d errors encountered while saving.\n' % len(saved_errors))