Files
darling-lol/scripts/prepare.py
T
lucannez64 7bbf9ec0e7 Fetch pinned darling-swift LFS objects from GitHub, not the dead host
The pinned src/external/swift/.lfsconfig points lfs.url at the retired
git-lfs.darlinghq.org, so a fresh `git submodule update --init --recursive`
blocks with no output right after src/external/sqlite is checked out: swift is
the next submodule in sorted order and its checkout waits on that host.

Override lfs.url to GitHub's endpoint, which still serves the objects (verified
44 objects / 16 MB, real Mach-O dylibs), and print explicit submodule progress so
the last completed submodule is not mistaken for the stalled one.
2026-10-15 01:12:47 +02:00

44 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""Fetch pinned Darling sources and apply each patch to its owning repository."""
import argparse,json,os,subprocess,tempfile
from pathlib import Path
from common import ROOT,render
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('--source',type=Path,default=ROOT/'build/darling-src')
p.add_argument('--check-only',action='store_true',help='validate against temporary base indexes, without changing existing source')
a=p.parse_args();source=a.source.resolve();manifest=json.loads((ROOT/'upstream/manifest.json').read_text())
def run(args,**kwargs):return subprocess.run(args,check=True,**kwargs)
if not (source/'.git').exists():
if a.check_only:p.error('check-only requires an existing pinned source checkout')
source.parent.mkdir(parents=True,exist_ok=True)
run(['git','clone',manifest['upstream'],str(source)])
run(['git','-C',str(source),'checkout','--detach',manifest['revision']])
# Recursive initialization can spend a long time fetching nested repos (and
# Git LFS assets). Explicit progress keeps the last completed submodule
# from looking like the operation that is currently stuck. The pinned
# darling-swift .lfsconfig points at the retired git-lfs.darlinghq.org, so
# fetch that submodule's LFS objects from GitHub, which still serves them;
# otherwise the checkout blocks on the dead host right after sqlite.
print('Initializing Darling submodules (large repositories/LFS assets may take a while)...',flush=True)
run(['git','-C',str(source),'-c','lfs.url=https://github.com/darlinghq/darling-swift.git/info/lfs',
'submodule','update','--init','--recursive','--progress'])
print('Darling submodules initialized.',flush=True)
# Never reset someone else's checkout to make a patch apply.
for component in manifest['components']:
repo=source/component['path']
actual=subprocess.check_output(['git','-C',str(repo),'rev-parse','HEAD'],text=True).strip()
if actual!=component['revision']:raise SystemExit(f"Wrong revision for {component['path']}: expected {component['revision']}, got {actual}")
patch=render((ROOT/component['patch']).read_text())
if a.check_only:
with tempfile.TemporaryDirectory(prefix='darling-patch-index-') as tmp:
env=dict(os.environ,GIT_INDEX_FILE=str(Path(tmp)/'index'))
run(['git','-C',str(repo),'read-tree',component['revision']],env=env)
run(['git','-C',str(repo),'apply','--cached','--check','--whitespace=nowarn','-'],input=patch,text=True,env=env)
else:
already=subprocess.run(['git','-C',str(repo),'apply','--reverse','--check','-'],input=patch,text=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL).returncode==0
if not already:
run(['git','-C',str(repo),'apply','--check','-'],input=patch,text=True)
run(['git','-C',str(repo),'apply','--whitespace=nowarn','-'],input=patch,text=True)
print(('Checked ' if a.check_only else 'Prepared ')+component['path'],flush=True)
print('All',len(manifest['components']),'component patches validated' if a.check_only else 'component patches ready')