def main(argv): o = options.Options(optspec) opt, flags, extra = o.parse_bytes(argv[1:]) if not (opt.modified or \ opt['print'] or \ opt.status or \ opt.update or \ opt.check or \ opt.clear): opt.update = 1 if (opt.fake_valid or opt.fake_invalid) and not opt.update: o.fatal('--fake-{in,}valid are meaningless without -u') if opt.fake_valid and opt.fake_invalid: o.fatal('--fake-valid is incompatible with --fake-invalid') if opt.clear and opt.indexfile: o.fatal('cannot clear an external index (via -f)') # FIXME: remove this once we account for timestamp races, i.e. index; # touch new-file; index. It's possible for this to happen quickly # enough that new-file ends up with the same timestamp as the first # index, and then bup will ignore it. tick_start = time.time() time.sleep(1 - (tick_start - int(tick_start))) git.check_repo_or_die() handle_ctrl_c() if opt.verbose is None: opt.verbose = 0 if opt.indexfile: indexfile = argv_bytes(opt.indexfile) else: indexfile = git.repo(b'bupindex') if opt.check: log('check: starting initial check.\n') check_index(index.Reader(indexfile), opt.verbose) if opt.clear: log('clear: clearing index.\n') clear_index(indexfile, opt.verbose) sys.stdout.flush() out = byte_stream(sys.stdout) if opt.update: if not extra: o.fatal('update mode (-u) requested but no paths given') extra = [argv_bytes(x) for x in extra] excluded_paths = parse_excludes(flags, o.fatal) exclude_rxs = parse_rx_excludes(flags, o.fatal) xexcept = index.unique_resolved_paths(extra) for rp, path in index.reduce_paths(extra): update_index(rp, excluded_paths, exclude_rxs, indexfile, check=opt.check, check_device=opt.check_device, xdev=opt.xdev, xdev_exceptions=xexcept, fake_valid=opt.fake_valid, fake_invalid=opt.fake_invalid, out=out, verbose=opt.verbose) if opt['print'] or opt.status or opt.modified: extra = [argv_bytes(x) for x in extra] for name, ent in index.Reader(indexfile).filter(extra or [b'']): if (opt.modified and (ent.is_valid() or ent.is_deleted() or not ent.mode)): continue line = b'' if opt.status: if ent.is_deleted(): line += b'D ' elif not ent.is_valid(): if ent.sha == index.EMPTY_SHA: line += b'A ' else: line += b'M ' else: line += b' ' if opt.hash: line += hexlify(ent.sha) + b' ' if opt.long: line += b'%7s %7s ' % (oct(ent.mode).encode('ascii'), oct(ent.gitmode).encode('ascii')) out.write(line + (name or b'./') + b'\n') if opt.check and (opt['print'] or opt.status or opt.modified or opt.update): log('check: starting final check.\n') check_index(index.Reader(indexfile), opt.verbose) if saved_errors: log('WARNING: %d errors encountered.\n' % len(saved_errors)) sys.exit(1)
handle_ctrl_c() if opt.check: log('check: starting initial check.\n') check_index(index.Reader(indexfile)) if opt.clear: log('clear: clearing index.\n') clear_index(indexfile) if opt.update: if not extra: o.fatal('update mode (-u) requested but no paths given') excluded_paths = parse_excludes(flags, o.fatal) exclude_rxs = parse_rx_excludes(flags, o.fatal) xexcept = index.unique_resolved_paths(extra) for rp, path in index.reduce_paths(extra): update_index(rp, excluded_paths, exclude_rxs, xdev_exceptions=xexcept) if opt['print'] or opt.status or opt.modified: for (name, ent) in index.Reader(indexfile).filter(extra or ['']): if (opt.modified and (ent.is_valid() or ent.is_deleted() or not ent.mode)): continue line = '' if opt.status: if ent.is_deleted(): line += 'D ' elif not ent.is_valid(): if ent.sha == index.EMPTY_SHA: line += 'A '