match longest archivetype extension first

This commit is contained in:
Mike McLean 2024-10-10 09:34:43 -04:00 committed by Tomas Kopecek
parent 18fa1c3fea
commit 6afde19a8a
2 changed files with 7 additions and 4 deletions

View file

@ -7807,13 +7807,15 @@ def get_archive_type(filename=None, type_name=None, type_id=None, strict=False):
else: else:
raise koji.GenericError('one of filename, type_name, or type_id must be specified') raise koji.GenericError('one of filename, type_name, or type_id must be specified')
parts = filename.split('.') # otherwise match the filename
query = QueryProcessor( query = QueryProcessor(
tables=['archivetypes'], tables=['archivetypes'],
columns=['id', 'name', 'description', 'extensions', 'compression_type'], columns=['id', 'name', 'description', 'extensions', 'compression_type'],
clauses=['extensions ~* %(pattern)s'], clauses=['extensions ~* %(pattern)s'],
) )
for start in range(len(parts) - 1, -1, -1): # match longest extension first. e.g. .tar.gz before .gz
parts = filename.split('.')
for start in range(len(parts)):
ext = '.'.join(parts[start:]) ext = '.'.join(parts[start:])
query.values['pattern'] = r'(\s|^)%s(\s|$)' % ext query.values['pattern'] = r'(\s|^)%s(\s|$)' % ext
results = query.execute() results = query.execute()
@ -7825,7 +7827,7 @@ def get_archive_type(filename=None, type_name=None, type_id=None, strict=False):
raise koji.GenericError('multiple matches for file extension: %s' % ext) raise koji.GenericError('multiple matches for file extension: %s' % ext)
# otherwise # otherwise
if strict: if strict:
raise koji.GenericError('unsupported file extension: %s' % ext) raise koji.GenericError('unsupported file extension: %s' % filename)
else: else:
return None return None

View file

@ -61,7 +61,8 @@ class TestGetArchiveType(DBQueryTestCase):
archive_info = [{'id': 1, 'name': 'archive-type-1', 'extensions': 'ext'}, archive_info = [{'id': 1, 'name': 'archive-type-1', 'extensions': 'ext'},
{'id': 2, 'name': 'archive-type-2', 'extensions': 'ext'}] {'id': 2, 'name': 'archive-type-2', 'extensions': 'ext'}]
filename = 'test-filename.ext' filename = 'test-filename.ext'
self.qp_execute_return_value = archive_info self.qp_execute_side_effect = [[], archive_info]
# no matches for full name, multiple matches for .ext
with self.assertRaises(koji.GenericError) as ex: with self.assertRaises(koji.GenericError) as ex:
kojihub.get_archive_type(filename=filename) kojihub.get_archive_type(filename=filename)
self.assertEqual("multiple matches for file extension: ext", str(ex.exception)) self.assertEqual("multiple matches for file extension: ext", str(ex.exception))