From 7678967ae0b851b38db82bbc12e86e60853d2982 Mon Sep 17 00:00:00 2001 From: nkrapp Date: Wed, 2 Nov 2022 16:58:40 +0100 Subject: [PATCH] implement file caching to prevent having to download files multiple times --- lib/obs.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/obs.py b/lib/obs.py index 05af330..e1a558e 100644 --- a/lib/obs.py +++ b/lib/obs.py @@ -1,9 +1,11 @@ import errno import logging +import shutil import time import urllib.parse import xml.etree.ElementTree as ET from urllib.error import HTTPError +from pathlib import Path import osc.core @@ -160,8 +162,13 @@ class OBS: dirpath: str, file_md5: str, ) -> None: - with (dirpath / name).open("wb") as f: - f.write(self._download(project, package, name, revision).read()) + cached_file = self._path_from_md5(name, dirpath, file_md5) + if not self.in_cache(name, dirpath, file_md5): + with (dirpath / name).open("wb") as f: + f.write(self._download(project, package, name, revision).read()) + shutil.copy(dirpath / name, cached_file) + else: + shutil.copy(cached_file, dirpath / name) def list(self, project, package, srcmd5, linkrev): params = {"rev": srcmd5, "expand": "1"} @@ -179,3 +186,16 @@ class OBS: raise e return root + + def _path_from_md5(self, name, dirpath, md5): + cache = dirpath.joinpath(".cache/") + if not Path(cache).exists(): + cache.mkdir() + filepath = cache.joinpath(f"{md5[0:3]}/{md5[3:6]}/{md5[6:9]}/") + filepath.mkdir(parents=True, exist_ok=True) + return filepath.joinpath(f"{md5[9:]}-{name}") + + def in_cache(self, name, dirpath, md5): + if self._path_from_md5(name, dirpath, md5).is_file(): + return True + return False