From: Rob Browning Date: Sat, 28 Dec 2019 01:46:02 +0000 (-0600) Subject: index-cmd: accommodate python 3 X-Git-Tag: 0.31~199 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=bup.git;a=commitdiff_plain;h=dee2d8f09fc29be74c3d4a0896944c4dde2c2f44;ds=sidebyside index-cmd: accommodate python 3 Signed-off-by: Rob Browning Tested-by: Rob Browning --- diff --git a/cmd/index-cmd.py b/cmd/index-cmd.py index 61a679a..c2a22f9 100755 --- a/cmd/index-cmd.py +++ b/cmd/index-cmd.py @@ -6,13 +6,16 @@ exec "$bup_python" "$0" ${1+"$@"} # end of bup preamble from __future__ import absolute_import, print_function +from binascii import hexlify import sys, stat, time, os, errno, re from bup import metadata, options, git, index, drecurse, hlinkdb +from bup.compat import argv_bytes from bup.drecurse import recursive_dirlist from bup.hashsplit import GIT_MODE_TREE, GIT_MODE_FILE from bup.helpers import (add_error, handle_ctrl_c, log, parse_excludes, parse_rx_excludes, progress, qprogress, saved_errors) +from bup.io import byte_stream, path_msg class IterHelper: @@ -21,10 +24,11 @@ class IterHelper: self.cur = None self.next() - def next(self): + def __next__(self): self.cur = next(self.i, None) return self.cur + next = __next__ def check_index(reader): try: @@ -35,9 +39,9 @@ def check_index(reader): if e.children_n: if opt.verbose: log('%08x+%-4d %r\n' % (e.children_ofs, e.children_n, - e.name)) + path_msg(e.name))) assert(e.children_ofs) - assert e.name[-1] == b'/' + assert e.name.endswith(b'/') assert(not d.get(e.children_ofs)) d[e.children_ofs] = 1 if e.flags & index.IX_HASHVALID: @@ -57,28 +61,28 @@ def check_index(reader): def clear_index(indexfile): - indexfiles = [indexfile, indexfile + '.meta', indexfile + '.hlink'] + indexfiles = [indexfile, indexfile + b'.meta', indexfile + b'.hlink'] for indexfile in indexfiles: path = git.repo(indexfile) try: os.remove(path) if opt.verbose: - log('clear: removed %s\n' % path) + log('clear: removed %s\n' % path_msg(path)) except OSError as e: if e.errno != errno.ENOENT: raise -def update_index(top, excluded_paths, exclude_rxs, xdev_exceptions): +def update_index(top, excluded_paths, exclude_rxs, xdev_exceptions, out=None): # tmax and start must be epoch nanoseconds. tmax = (time.time() - 1) * 10**9 ri = index.Reader(indexfile) - msw = index.MetaStoreWriter(indexfile + '.meta') + msw = index.MetaStoreWriter(indexfile + b'.meta') wi = index.Writer(indexfile, msw, tmax) rig = IterHelper(ri.iter(name=top)) tstart = int(time.time()) * 10**9 - hlinks = hlinkdb.HLinkDB(indexfile + '.hlink') + hlinks = hlinkdb.HLinkDB(indexfile + b'.hlink') fake_hash = None if opt.fake_valid: @@ -95,8 +99,8 @@ def update_index(top, excluded_paths, exclude_rxs, xdev_exceptions): exclude_rxs=exclude_rxs, xdev_exceptions=xdev_exceptions): if opt.verbose>=2 or (opt.verbose==1 and stat.S_ISDIR(pst.st_mode)): - sys.stdout.write('%s\n' % path) - sys.stdout.flush() + out.write(b'%s\n' % path) + out.flush() elapsed = time.time() - index_start paths_per_sec = total / elapsed if elapsed else 0 qprogress('Indexing: %d (%d paths/s)\r' % (total, paths_per_sec)) @@ -250,10 +254,17 @@ tick_start = time.time() time.sleep(1 - (tick_start - int(tick_start))) git.check_repo_or_die() -indexfile = opt.indexfile or git.repo('bupindex') 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)) @@ -262,36 +273,42 @@ if opt.clear: log('clear: clearing index.\n') clear_index(indexfile) +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, xdev_exceptions=xexcept) + update_index(rp, excluded_paths, exclude_rxs, xdev_exceptions=xexcept, + out=out) if opt['print'] or opt.status or opt.modified: - for (name, ent) in index.Reader(indexfile).filter(extra or ['']): + 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 = '' + line = b'' if opt.status: if ent.is_deleted(): - line += 'D ' + line += b'D ' elif not ent.is_valid(): if ent.sha == index.EMPTY_SHA: - line += 'A ' + line += b'A ' else: - line += 'M ' + line += b'M ' else: - line += ' ' + line += b' ' if opt.hash: - line += ent.sha.encode('hex') + ' ' + line += hexlify(ent) + b' ' if opt.long: - line += "%7s %7s " % (oct(ent.mode), oct(ent.gitmode)) - print(line + (name or './')) + line += b'%7s %7s ' % (oct(ent.mode), oct(ent.gitmode)) + 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')