Add --ckecksum option to update command
This commit is contained in:
parent
6d040b4ba6
commit
81462677a7
|
@ -178,6 +178,7 @@ def _check(**kwargs):
|
|||
if log_level < 30:
|
||||
summary.print()
|
||||
if summary.errors:
|
||||
LOG.error('Db data is not accurate run `ordigi update --checksum`')
|
||||
sys.exit(1)
|
||||
else:
|
||||
LOG.error('Db data is not accurate run `ordigi update`')
|
||||
|
@ -578,6 +579,13 @@ def _sort(**kwargs):
|
|||
|
||||
@cli.command('update')
|
||||
@add_options(_logger_options)
|
||||
@click.option(
|
||||
'--checksum',
|
||||
'-c',
|
||||
default=False,
|
||||
is_flag=True,
|
||||
help='Update checksum, assuming file are changed by the user',
|
||||
)
|
||||
@click.argument('path', required=True, nargs=1, type=click.Path())
|
||||
def _update(**kwargs):
|
||||
"""
|
||||
|
@ -589,7 +597,7 @@ def _update(**kwargs):
|
|||
|
||||
collection = Collection(root)
|
||||
loc = _cli_get_location(collection)
|
||||
summary = collection.update(loc)
|
||||
summary = collection.update(loc, kwargs['checksum'])
|
||||
|
||||
if log_level < 30:
|
||||
summary.print()
|
||||
|
|
|
@ -835,7 +835,9 @@ class Collection(SortMedias):
|
|||
file_paths = list(self.get_collection_files())
|
||||
db_rows = [row['FilePath'] for row in self.db.sqlite.get_rows('metadata')]
|
||||
for file_path in file_paths:
|
||||
# Assuming file_path are inside collection root dir
|
||||
relpath = os.path.relpath(file_path, self.root)
|
||||
|
||||
# If file not in database
|
||||
if relpath not in db_rows:
|
||||
self.log.error('Db data is not accurate')
|
||||
|
|
|
@ -527,7 +527,7 @@ class Media(ReadExif):
|
|||
|
||||
return db.get_metadata(relpath, 'LocationId')
|
||||
|
||||
def _check_file(self, db, root):
|
||||
def _check_file(self, db, root, check=True):
|
||||
"""Check if file_path is a subpath of root"""
|
||||
|
||||
if str(self.file_path).startswith(str(root)):
|
||||
|
@ -535,14 +535,13 @@ class Media(ReadExif):
|
|||
db_checksum = db.get_checksum(relpath)
|
||||
file_checksum = self.metadata['checksum']
|
||||
# Check if checksum match
|
||||
if db_checksum and db_checksum != file_checksum:
|
||||
self.log.error(f'{self.file_path} checksum has changed')
|
||||
self.log.error('(modified or corrupted file).')
|
||||
if check and db_checksum and db_checksum != file_checksum:
|
||||
self.log.error(f'{self.file_path} checksum has changed, modified or corrupted file.')
|
||||
self.log.error(
|
||||
f'file_checksum={file_checksum},\ndb_checksum={db_checksum}'
|
||||
)
|
||||
self.log.info(
|
||||
'Use --reset-cache, check database integrity or try to restore the file'
|
||||
'Use ordigi update --checksum or --reset-cache, check database integrity or try to restore the file'
|
||||
)
|
||||
# We d'ont want to silently ignore or correct this without
|
||||
# resetting the cache as is could be due to file corruption
|
||||
|
@ -605,7 +604,7 @@ class Media(ReadExif):
|
|||
if not album or album == '':
|
||||
self.metadata['album'] = folder
|
||||
|
||||
def get_metadata(self, root, loc=None, db=None, cache=False):
|
||||
def get_metadata(self, root, loc=None, db=None, cache=False, check=True):
|
||||
"""
|
||||
Get a dictionary of metadata from exif.
|
||||
All keys will be present and have a value of None if not obtained.
|
||||
|
@ -615,8 +614,9 @@ class Media(ReadExif):
|
|||
|
||||
db_checksum = False
|
||||
location_id = None
|
||||
if cache and db:
|
||||
relpath, db_checksum = self._check_file(db, root)
|
||||
if cache and db and str(self.file_path).startswith(str(root)):
|
||||
relpath = os.path.relpath(self.file_path, root)
|
||||
db_checksum = db.get_checksum(relpath)
|
||||
if db_checksum:
|
||||
location_id = self._set_metadata_from_db(db, relpath)
|
||||
self.set_location_from_db(location_id, db)
|
||||
|
@ -702,17 +702,17 @@ class Medias:
|
|||
|
||||
return media
|
||||
|
||||
def get_media_data(self, file_path, src_dir, loc=None):
|
||||
def get_media_data(self, file_path, src_dir, loc=None, check=True):
|
||||
media = self.get_media(file_path, src_dir)
|
||||
media.get_metadata(
|
||||
self.root, loc, self.db.sqlite, self.exif_opt['cache']
|
||||
self.root, loc, self.db.sqlite, self.exif_opt['cache'], check
|
||||
)
|
||||
|
||||
return media
|
||||
|
||||
def get_metadata(self, src_path, src_dir, loc=None):
|
||||
def get_metadata(self, src_path, src_dir, loc=None, check=True):
|
||||
"""Get metadata"""
|
||||
return self.get_media_data(src_path, src_dir, loc).metadata
|
||||
return self.get_media_data(src_path, src_dir, loc, check).metadata
|
||||
|
||||
def get_paths(self, src_dirs, imp=False):
|
||||
"""Get paths"""
|
||||
|
|
|
@ -154,6 +154,7 @@ class TestOrdigi:
|
|||
shutil.copyfile(file_path, dest_path)
|
||||
for opt, arg in self.logger_options:
|
||||
self.assert_cli(cli._update, [opt, arg, str(self.src_path)])
|
||||
self.assert_cli(cli._update, ['--checksum', str(self.src_path)])
|
||||
|
||||
def assert_check(self):
|
||||
for opt, arg in self.logger_options:
|
||||
|
@ -187,7 +188,6 @@ class TestOrdigi:
|
|||
def test_init_update_check_clean(self):
|
||||
self.assert_init()
|
||||
self.assert_update()
|
||||
self.assert_check()
|
||||
self.assert_clean()
|
||||
|
||||
def test_import(self, tmp_path):
|
||||
|
@ -239,6 +239,9 @@ class TestOrdigi:
|
|||
self.assert_cli(cli._compare, paths)
|
||||
self.assert_options(cli._compare, bool_options, arg_options, paths)
|
||||
|
||||
def test_check(self):
|
||||
self.assert_check()
|
||||
|
||||
|
||||
def test_needsfiles(tmpdir):
|
||||
assert tmpdir
|
||||
|
|
|
@ -169,7 +169,7 @@ class TestCollection:
|
|||
path_format = 'test_exif/<city>/<%Y>-<name>.%l<ext>'
|
||||
summary = collection.sort_files([tmp_path], loc)
|
||||
|
||||
self.assert_sort(summary, 23)
|
||||
self.assert_sort(summary, 26)
|
||||
|
||||
shutil.copytree(tmp_path / 'test_exif', tmp_path / 'test_exif_copy')
|
||||
collection.summary = Summary(tmp_path)
|
||||
|
|
Loading…
Reference in New Issue