Server: generate meta.json for builds/ on startup for incremental updates
This commit is contained in:
@@ -151,6 +151,10 @@ async def lifespan(app: FastAPI):
|
|||||||
# Scan launcher versions and generate meta
|
# Scan launcher versions and generate meta
|
||||||
logger.info("Scanning launcher versions...")
|
logger.info("Scanning launcher versions...")
|
||||||
|
|
||||||
|
# Generate meta.json in builds/ directory
|
||||||
|
logger.info("Generating launcher meta...")
|
||||||
|
generate_launcher_builds_meta()
|
||||||
|
|
||||||
# Extract new format ZIPs to versions directory
|
# Extract new format ZIPs to versions directory
|
||||||
logger.info("Extracting new format versions...")
|
logger.info("Extracting new format versions...")
|
||||||
extract_new_format_versions()
|
extract_new_format_versions()
|
||||||
@@ -829,8 +833,79 @@ def calculate_file_hash(file_path: Path) -> str:
|
|||||||
return hash_sha.hexdigest()
|
return hash_sha.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def generate_launcher_builds_meta():
|
||||||
|
"""Generate meta.json in builds/ directory for incremental updates"""
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
version = get_current_launcher_version()
|
||||||
|
if not version:
|
||||||
|
return
|
||||||
|
|
||||||
|
meta_path = BUILDS_DIR / "meta.json"
|
||||||
|
|
||||||
|
# Check if meta exists and is fresh
|
||||||
|
if meta_path.exists():
|
||||||
|
try:
|
||||||
|
with open(meta_path, 'r', encoding='utf-8') as f:
|
||||||
|
existing = json.load(f)
|
||||||
|
if existing.get("version") == version:
|
||||||
|
logger.debug("Launcher meta.json already exists and is current")
|
||||||
|
return
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Generate new meta
|
||||||
|
files = []
|
||||||
|
try:
|
||||||
|
for file_path in BUILDS_DIR.rglob("*"):
|
||||||
|
if file_path.is_file() and file_path.name not in ["meta.json"]:
|
||||||
|
rel_path = str(file_path.relative_to(BUILDS_DIR))
|
||||||
|
stat = file_path.stat()
|
||||||
|
|
||||||
|
# Calculate hash
|
||||||
|
sha256_hash = hashlib.sha256()
|
||||||
|
with open(file_path, "rb") as f:
|
||||||
|
for chunk in iter(lambda: f.read(8192), b""):
|
||||||
|
sha256_hash.update(chunk)
|
||||||
|
|
||||||
|
files.append({
|
||||||
|
"path": rel_path,
|
||||||
|
"size": stat.st_size,
|
||||||
|
"hash": f"sha256:{sha256_hash.hexdigest()}"
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to generate launcher meta: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
"version": version,
|
||||||
|
"type": "builds",
|
||||||
|
"release_date": datetime.utcnow().isoformat(),
|
||||||
|
"files": files
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(meta_path, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(meta, f, indent=2)
|
||||||
|
logger.info(f"Generated launcher meta.json with {len(files)} files")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to save meta.json: {e}")
|
||||||
|
|
||||||
|
|
||||||
def scan_launcher_version(version: str) -> Optional[dict]:
|
def scan_launcher_version(version: str) -> Optional[dict]:
|
||||||
"""Scan a launcher version directory and return meta"""
|
"""Scan a launcher version directory and return meta"""
|
||||||
|
# First check if meta exists in builds/ directly (for new format)
|
||||||
|
meta_path = BUILDS_DIR / "meta.json"
|
||||||
|
if meta_path.exists():
|
||||||
|
try:
|
||||||
|
with open(meta_path, 'r', encoding='utf-8') as f:
|
||||||
|
meta = json.load(f)
|
||||||
|
if meta.get("version") == version:
|
||||||
|
return meta
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Fallback: check versions directory
|
||||||
version_path = VERSIONS_DIR / version
|
version_path = VERSIONS_DIR / version
|
||||||
|
|
||||||
if not version_path.exists() or not version_path.is_dir():
|
if not version_path.exists() or not version_path.is_dir():
|
||||||
|
|||||||
Reference in New Issue
Block a user