From 0201bcd85345539046f04b3491f04d11191f7b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Tue, 26 Feb 2013 15:44:51 +0100 Subject: [PATCH] 0.3.0: `--sum` command-line argument --- README.rst | 5 +++++ src/bitrot.py | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 985435c..f38a15c 100644 --- a/README.rst +++ b/README.rst @@ -36,6 +36,11 @@ under 10 minutes. Both tests on HFS+. Change Log ---------- +0.3.0 +~~~~~ + +* ``--sum`` command-line argument for easy comparison of multiple databases + 0.2.1 ~~~~~ diff --git a/src/bitrot.py b/src/bitrot.py index 27bbbc5..239df68 100644 --- a/src/bitrot.py +++ b/src/bitrot.py @@ -37,7 +37,7 @@ import sys CHUNK_SIZE = 16384 DOT_THRESHOLD = 200 -VERSION = (0, 2, 1) +VERSION = (0, 3, 0) def sha1(path): @@ -152,21 +152,45 @@ def run(verbosity=1): sys.exit(1) +def stable_sum(): + current_dir = b'.' # sic, relative path + bitrot_db = os.path.join(current_dir, b'.bitrot.db') + digest = hashlib.sha512() + conn = get_sqlite3_cursor(bitrot_db) + cur = conn.cursor() + cur.execute('SELECT hash FROM bitrot ORDER BY path') + row = cur.fetchone() + while row: + digest.update(row[0]) + row = cur.fetchone() + return digest.hexdigest() + + def run_from_command_line(): parser = argparse.ArgumentParser(prog='bitrot') parser.add_argument('-q', '--quiet', action='store_true', help='don\'t print anything besides checksum errors') + parser.add_argument('-s', '--sum', action='store_true', + help='using only the data already gathered, return a SHA-512 sum ' + 'of hashes of all the entries in the database. No timestamps ' + 'are used in calculation.') parser.add_argument('-v', '--verbose', action='store_true', help='list new, updated and missing entries') parser.add_argument('--version', action='version', version='%(prog)s {}.{}.{}'.format(*VERSION)) args = parser.parse_args() - verbosity = 1 - if args.quiet: - verbosity = 0 - elif args.verbose: - verbosity = 2 - run(verbosity=verbosity) + if args.sum: + try: + print(stable_sum()) + except RuntimeError as e: + print(unicode(e).encode('utf8'), file=sys.stderr) + else: + verbosity = 1 + if args.quiet: + verbosity = 0 + elif args.verbose: + verbosity = 2 + run(verbosity=verbosity) if __name__ == '__main__':