X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cmd%2Fsave-cmd.py;h=fc93408c2a5dcc61923d2f7bc18356856c4fe926;hb=1f1a58af1a37e6cebfa0a5f70d391157f19f8827;hp=327d36677db12526ae115986e71941e3772ac62a;hpb=a5189a69a8e37f7ed5b43af314f9ec35bbfbb910;p=bup.git diff --git a/cmd/save-cmd.py b/cmd/save-cmd.py index 327d366..fc93408 100755 --- a/cmd/save-cmd.py +++ b/cmd/save-cmd.py @@ -1,6 +1,8 @@ #!/usr/bin/env python import sys, stat, time, math from cStringIO import StringIO +from errno import EACCES + from bup import hashsplit, git, options, index, client, metadata, hlinkdb from bup.helpers import * from bup.hashsplit import GIT_MODE_TREE, GIT_MODE_FILE, GIT_MODE_SYMLINK @@ -72,7 +74,11 @@ if opt.name and opt.name.startswith('.'): o.fatal("'%s' is not a valid branch name" % opt.name) refname = opt.name and 'refs/heads/%s' % opt.name or None if opt.remote or is_reverse: - cli = client.Client(opt.remote) + try: + cli = client.Client(opt.remote) + except client.ClientError, e: + log('error: %s' % e) + sys.exit(1) oldref = refname and cli.read_ref(refname) or None w = cli.new_packwriter(compression_level=opt.compress) else: @@ -135,7 +141,22 @@ def _pop(force_tree, dir_metadata=None): [metadata_f], keep_boundaries=False) shalist.append((mode, '.bupm', id)) - tree = force_tree or w.new_tree(shalist) + # FIXME: only test if collision is possible (i.e. given --strip, etc.)? + if force_tree: + tree = force_tree + else: + names_seen = set() + clean_list = [] + for x in shalist: + name = x[1] + if name in names_seen: + parent_path = '/'.join(parts) + '/' + add_error('error: ignoring duplicate path %r in %r' + % (name, parent_path)) + else: + names_seen.add(name) + clean_list.append(x) + tree = w.new_tree(clean_list) if shalists: shalists[-1].append((GIT_MODE_TREE, git.mangle_name(part, @@ -185,10 +206,13 @@ def progress_report(n): indexfile = opt.indexfile or git.repo('bupindex') r = index.Reader(indexfile) -if not os.access(indexfile + '.meta', os.W_OK|os.R_OK): - log('error: cannot access "%s"; have you run bup index?' % indexfile) +try: + msr = index.MetaStoreReader(indexfile + '.meta') +except IOError, ex: + if ex.errno != EACCES: + raise + log('error: cannot access %r; have you run bup index?' % indexfile) sys.exit(1) -msr = index.MetaStoreReader(indexfile + '.meta') hlink_db = hlinkdb.HLinkDB(indexfile + '.hlink') def already_saved(ent): @@ -269,7 +293,8 @@ for (transname,ent) in r.filter(extra, wantrecurse=wantrecurse_during): continue if opt.smaller and ent.size >= opt.smaller: if exists and not hashvalid: - add_error('skipping large file "%s"' % ent.name) + if opt.verbose: + log('skipping large file "%s"\n' % ent.name) lastskip_name = ent.name continue @@ -298,16 +323,7 @@ for (transname,ent) in r.filter(extra, wantrecurse=wantrecurse_during): # ...]. if first_root == None: - dir_name, fs_path = dirp[0] first_root = dirp[0] - # Not indexed, so just grab the FS metadata or use empty metadata. - try: - meta = metadata.from_path(fs_path) if fs_path else metadata.Metadata() - except (OSError, IOError), e: - add_error(e) - lastskip_name = dir_name - else: - _push(dir_name, meta) elif first_root != dirp[0]: root_collision = True @@ -324,8 +340,8 @@ for (transname,ent) in r.filter(extra, wantrecurse=wantrecurse_during): except (OSError, IOError), e: add_error(e) lastskip_name = dir_name - else: - _push(dir_name, meta) + meta = metadata.Metadata() + _push(dir_name, meta) if not file: if len(parts) == 1: