mirror of
https://github.com/frappe/bench.git
synced 2025-01-09 08:30:39 +00:00
fix: calc md5 for app cache
This commit is contained in:
parent
1751b2db5b
commit
16f89067c6
25
bench/app.py
25
bench/app.py
@ -6,6 +6,7 @@ import re
|
|||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import uuid
|
||||||
import tarfile
|
import tarfile
|
||||||
import typing
|
import typing
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@ -34,6 +35,7 @@ from bench.utils import (
|
|||||||
is_valid_frappe_branch,
|
is_valid_frappe_branch,
|
||||||
log,
|
log,
|
||||||
run_frappe_cmd,
|
run_frappe_cmd,
|
||||||
|
get_file_md5,
|
||||||
)
|
)
|
||||||
from bench.utils.bench import build_assets, install_python_dev_dependencies
|
from bench.utils.bench import build_assets, install_python_dev_dependencies
|
||||||
from bench.utils.render import step
|
from bench.utils.render import step
|
||||||
@ -338,6 +340,20 @@ class App(AppMeta):
|
|||||||
def get_app_path(self) -> Path:
|
def get_app_path(self) -> Path:
|
||||||
return Path(self.bench.name) / "apps" / self.app_name
|
return Path(self.bench.name) / "apps" / self.app_name
|
||||||
|
|
||||||
|
def get_app_cache_temp_path(self, is_compressed=False) -> Path:
|
||||||
|
cache_path = get_bench_cache_path("apps")
|
||||||
|
ext = "tgz" if is_compressed else "tar"
|
||||||
|
tarfile_name = f"{self.app_name}.{uuid.uuid4().hex}.{ext}"
|
||||||
|
return cache_path / tarfile_name
|
||||||
|
|
||||||
|
def get_app_cache_hashed_name(self, temp_path: Path) -> Path:
|
||||||
|
assert self.cache_key is not None
|
||||||
|
|
||||||
|
ext = temp_path.suffix[1:]
|
||||||
|
md5 = get_file_md5(temp_path.as_posix())
|
||||||
|
tarfile_name = f"{self.app_name}.{self.cache_key}.md5-{md5}.{ext}"
|
||||||
|
return temp_path.with_name(tarfile_name)
|
||||||
|
|
||||||
def get_app_cache_path(self, is_compressed=False) -> Path:
|
def get_app_cache_path(self, is_compressed=False) -> Path:
|
||||||
assert self.cache_key is not None
|
assert self.cache_key is not None
|
||||||
|
|
||||||
@ -392,7 +408,7 @@ class App(AppMeta):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
cwd = os.getcwd()
|
cwd = os.getcwd()
|
||||||
cache_path = self.get_app_cache_path(compress_artifacts)
|
cache_path = self.get_app_cache_temp_path(compress_artifacts)
|
||||||
mode = "w:gz" if compress_artifacts else "w"
|
mode = "w:gz" if compress_artifacts else "w"
|
||||||
|
|
||||||
message = f"Caching {self.app_name} app directory"
|
message = f"Caching {self.app_name} app directory"
|
||||||
@ -407,9 +423,12 @@ class App(AppMeta):
|
|||||||
try:
|
try:
|
||||||
with tarfile.open(cache_path, mode) as tar:
|
with tarfile.open(cache_path, mode) as tar:
|
||||||
tar.add(app_path.name)
|
tar.add(app_path.name)
|
||||||
|
hashed_path = self.get_app_cache_hashed_name(cache_path)
|
||||||
|
cache_path.rename(hashed_path)
|
||||||
|
|
||||||
success = True
|
success = True
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
log(f"Failed to cache {app_path}", level=3)
|
log(f"Failed to cache {app_path} {exc}", level=3)
|
||||||
success = False
|
success = False
|
||||||
finally:
|
finally:
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
|
@ -5,6 +5,7 @@ import os
|
|||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import hashlib
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -23,6 +24,12 @@ from bench.exceptions import (
|
|||||||
InvalidRemoteException,
|
InvalidRemoteException,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(PROJECT_NAME)
|
logger = logging.getLogger(PROJECT_NAME)
|
||||||
paths_in_app = ("hooks.py", "modules.txt", "patches.txt")
|
paths_in_app = ("hooks.py", "modules.txt", "patches.txt")
|
||||||
paths_in_bench = ("apps", "sites", "config", "logs", "config/pids")
|
paths_in_bench = ("apps", "sites", "config", "logs", "config/pids")
|
||||||
@ -605,3 +612,10 @@ def get_app_cache_extract_filter(
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
return filter_function
|
return filter_function
|
||||||
|
|
||||||
|
def get_file_md5(p: str) -> "str":
|
||||||
|
with open(p, "rb") as f:
|
||||||
|
file_md5 = hashlib.md5()
|
||||||
|
while chunk := f.read(2**16):
|
||||||
|
file_md5.update(chunk)
|
||||||
|
return file_md5.hexdigest()
|
||||||
|
Loading…
Reference in New Issue
Block a user