def compare_and_save_fs_db(repo, fs_dir, do_checksum): if not os.path.exists(fs_dir): log.critical("Path '{}' does not exist.".format(fs_dir)) return if not common.db_length(repo.db_file): log.critical("Database is empty.") return status_files = {fname: open(repo.get_status_fname(fname), "w+") for fname, descr in config.STATUS_FILES_DESC.items()} lists_of_files = compare_fs_db(repo, fs_dir, do_checksum) log.warn("Done, {} files compared.".format(sum(map(len, lists_of_files.values())))) for fname, flist in lists_of_files.items(): log.info("{}: {}".format(config.STATUS_FILES_DESC[fname], len(flist))) status_f = status_files[fname] for entry in flist: relpath, info = entry common.print_a_file(relpath, info, status_f) for status_file in status_files.values(): status_file.close()
def progress_on_fs_and_db(repo, fs_dir, do_checksum): total_len = common.db_length(repo.db_file) count = 0 db = common.browse_db(repo.db_file) fs = common.browse_filesystem(fs_dir, do_checksum) state = FileState.OK while True: if state in (FileState.OK, FileState.DIFFERENT): fs_entry = next(fs) if fs_entry is not None: # not a new directory db_entry = next(db) elif fs_entry is False or state is FileState.MISSING_IN_FS: db_entry = next(db) elif db_entry is False or state is FileState.MISSING_ON_DB: fs_entry = next(fs) else: assert False # should not come here if fs_entry is None: # new directory continue if fs_entry is False and db_entry is False: common.progress(total_len, total_len) print("") raise StopIteration() if fs_entry is False: # no more fs entries state = FileState.MISSING_IN_FS # so file cannot be on fs elif db_entry is False: # no more db entries state = FileState.MISSING_ON_DB # so file cannot be on db else: # returns None if could compare, # or db_fullpath > fs_fullpath state, diff = compare_entries(fs_dir, fs_entry, db_entry, do_checksum) common.progress(count, total_len) count += 1 yield state, diff, db_entry, fs_entry