import shlex import subprocess import sys from commia.prelude import * from commia.util import check_continue, read_ini from local import build_push packages = read_ini("packages/aur.ini")["default"] ini = Path("packages/aur.ini").read_text() git_ignore = Path("packages/.gitignore").read_text() only = sys.argv[1:] if len(only) == 0: only = None print("initializing new packages") for name, fix in packages.items(): if only and name not in only: print(f"skipping {name}") continue if not Path(f"packages/{name}").exists(): print(f"cloning {name}") run_check( [ "git", "clone", f"https://aur.archlinux.org/{name}.git", f"packages/{name}", ] ) if name.endswith("-git"): for line in Path(f"packages/{name}/PKGBUILD").read_text().splitlines(): if not line.startswith("pkgver="): continue ver = shlex.split(line[len("pkgver=") :])[0] ini = ini.replace(f"{name} = ?", f"{name} = {ver}") break else: if fix == "?": commit = subprocess.check_output( ["git", "rev-parse", "HEAD"], cwd=f"packages/{name}", text=True ).strip() ini = ini.replace(f"{name} = ?", f"{name} = {commit}") else: run_check(["git", "checkout", fix], cwd=f"packages/{name}") if not name in git_ignore: git_ignore += f"{name}\n" Path("packages/.gitignore").write_text(git_ignore) Path("packages/aur.ini").write_text(ini) print("checking for new versions") queue = [] for name, current in packages.items(): if only and name not in only: print(f"skipping {name}") continue if name.endswith("-git"): continue print(f"checking {name}") path = Path(f"packages/{name}") run_check(["git", "fetch"], cwd=path) head = subprocess.check_output( ["git", "rev-parse", "HEAD"], cwd=path, text=True ).strip() origin = subprocess.check_output( ["git", "rev-parse", "origin/HEAD"], cwd=path, text=True ).strip() if current == origin: print("no updates") continue if head != origin: print() run_check(["git", "diff", current, origin, ":!.SRCINFO"], cwd=path) print() if not check_continue(): continue run_check(["git", "checkout", origin], cwd=path) queue.append((name, current, origin)) print("build queued") for name, current in packages.items(): if only and name not in only: print(f"skipping {name}") continue if not name.endswith("-git"): continue print(f"checking {name}") path = Path(f"packages/{name}") # update git run_check(["git", "fetch"], cwd=path) head = subprocess.check_output( ["git", "rev-parse", "HEAD"], cwd=path, text=True ).strip() origin = subprocess.check_output( ["git", "rev-parse", "origin/HEAD"], cwd=path, text=True ).strip() if head != origin: print() run_check(["git", "diff", head, origin, ":!.SRCINFO"], cwd=path) print() if not check_continue(): continue run_check(["git", "checkout", "--force", origin], cwd=path) # check for new version run_check(["makepkg", "--noprepare", "--nobuild"], cwd=path) ver = None for line in Path(f"packages/{name}/PKGBUILD").read_text().splitlines(): if not line.startswith("pkgver="): continue ver = shlex.split(line[len("pkgver=") :])[0] break else: raise Exception("couldn't find pkgver!") if current == ver: print("no update") continue queue.append((name, current, ver)) if len(queue) == 0: print("nothing to build") exit() print("building new versions") for name, old, new in queue: build_push(name) ini = ini.replace(f"{name} = {old}", f"{name} = {new}") Path("packages/aur.ini").write_text(ini)