🗝
summary refs log tree commit diff
path: root/packages/aur.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/aur.py')
-rw-r--r--packages/aur.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/packages/aur.py b/packages/aur.py
new file mode 100644
index 0000000..85658e1
--- /dev/null
+++ b/packages/aur.py
@@ -0,0 +1,121 @@
+import shlex
+import subprocess
+
+from local import build_push
+
+from commia.prelude import *
+from commia.util import check_continue, read_ini
+
+packages = read_ini("packages/aur.ini")["default"]
+ini = Path("packages/aur.ini").read_text()
+git_ignore = Path("packages/.gitignore").read_text()
+
+print("initializing new packages")
+
+for name, fix in packages.items():
+    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 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 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", 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)