Merge branch 'master' of github.com:ambv/bitrot

Conflicts:
	src/bitrot.py
This commit is contained in:
Łukasz Langa 2013-10-19 22:14:47 +02:00
commit dbdf7cf99b

View File

@ -29,6 +29,7 @@ from __future__ import unicode_literals
import argparse import argparse
import atexit import atexit
import datetime import datetime
import errno
import hashlib import hashlib
import os import os
import shutil import shutil
@ -70,12 +71,12 @@ def get_sqlite3_cursor(path, copy=False):
conn = sqlite3.connect(path) conn = sqlite3.connect(path)
atexit.register(conn.close) atexit.register(conn.close)
cur = conn.cursor() cur = conn.cursor()
for name, in cur.execute('SELECT name FROM sqlite_master'): names = set(name for name, in cur.execute('SELECT name FROM sqlite_master'))
if name == 'bitrot': if 'bitrot' not in names:
break
else:
cur.execute('CREATE TABLE bitrot (path TEXT PRIMARY KEY, ' cur.execute('CREATE TABLE bitrot (path TEXT PRIMARY KEY, '
'mtime INTEGER, hash TEXT, timestamp TEXT)') 'mtime INTEGER, hash TEXT, timestamp TEXT)')
if 'bitrot_hash_idx' not in names:
cur.execute('CREATE INDEX bitrot_hash_idx ON bitrot (hash)')
return conn return conn
@ -101,18 +102,23 @@ def run(verbosity=1, test=False):
for path, _, files in os.walk(current_dir): for path, _, files in os.walk(current_dir):
for f in files: for f in files:
p = os.path.join(path, f) p = os.path.join(path, f)
st = os.lstat(p) try:
if not stat.S_ISREG(st.st_mode) or p == bitrot_db: st = os.lstat(p)
continue except OSError as ex:
paths.append(p) if ex.errno != errno.ENOENT:
total_size += st.st_size raise
else:
if not stat.S_ISREG(st.st_mode) or p == bitrot_db:
continue
paths.append(p)
total_size += st.st_size
paths.sort() paths.sort()
for p in paths: for p in paths:
st = os.stat(p) st = os.stat(p)
new_mtime = int(st.st_mtime) new_mtime = int(st.st_mtime)
current_size += st.st_size current_size += st.st_size
if verbosity: if verbosity:
size_fmt = '\r{:>6.1%}'.format(current_size/total_size) size_fmt = '\r{:>6.1%}'.format(current_size/(total_size or 1))
if size_fmt != last_reported_size: if size_fmt != last_reported_size:
sys.stdout.write(size_fmt) sys.stdout.write(size_fmt)
sys.stdout.flush() sys.stdout.flush()