diff --git a/src/python/OBis/obis/dm/git.py b/src/python/OBis/obis/dm/git.py index dad15e9137261dc485575224f711287e07a7c30e..d04b75933e5a0734b8ac6a15637c45a45ef3a676 100644 --- a/src/python/OBis/obis/dm/git.py +++ b/src/python/OBis/obis/dm/git.py @@ -167,14 +167,30 @@ class ChecksumGeneratorMd5(object): return hash_md5.hexdigest() +class ChecksumGeneratorWORM(object): + def get_checksum(self, file): + return { + 'checksum': self.worm(file), + 'checksumType': 'WORM', + 'fileLength': os.path.getsize(file), + 'path': file + } + def worm(self, file): + modification_time = int(os.path.getmtime(file)) + size = os.path.getsize(file) + return "WORM-s{}-m{}--{}".format(size, modification_time, file) + + class ChecksumGeneratorGitAnnex(object): def __init__(self): - backend = self._get_annex_backend() - self.checksum_generator_replacement = ChecksumGeneratorCrc32() if backend is None else None + self.backend = self._get_annex_backend() + self.checksum_generator_replacement = ChecksumGeneratorCrc32() if self.backend is None else None # define which generator to use for files which are not handled by annex - if backend == 'MD5': + if self.backend == 'MD5': self.checksum_generator_supplement = ChecksumGeneratorMd5() + elif self.backend == 'WORM': + self.checksum_generator_supplement = ChecksumGeneratorWORM() else: self.checksum_generator_supplement = ChecksumGeneratorCrc32() @@ -191,12 +207,20 @@ class ChecksumGeneratorGitAnnex(object): if annex_info['present'] != True: return self.checksum_generator_supplement.get_checksum(file) return { - 'checksum': annex_info['key'].split('--')[1], + 'checksum': self._get_checksum_from_annex_info(annex_info), 'checksumType': annex_info['key'].split('-')[0], 'fileLength': os.path.getsize(file), 'path': file } + def _get_checksum_from_annex_info(self, annex_info): + if self.backend == 'MD5': + return annex_info['key'].split('--')[1] + elif self.backend == 'WORM': + return annex_info['key'][5:] + else: + raise ValueError("Git annex backend not supported: " + self.backend) + def _get_annex_backend(self): with open('.gitattributes') as gitattributes: for line in gitattributes.readlines():