aboutsummaryrefslogtreecommitdiff
path: root/utils/ng/pkgbuild.py
diff options
context:
space:
mode:
authorKunoiSayami <[email protected]>2022-10-20 02:20:55 +0800
committerKunoiSayami <[email protected]>2022-10-20 02:20:55 +0800
commit82e723a6d12b6d2c5a2791de425d72cdb8503373 (patch)
treef51201b22bbfcb8bd6a9f903756377178ac6ea72 /utils/ng/pkgbuild.py
parent75d860c1ef864483d17fea1f44bf3e8c78d3927d (diff)
fix(pkg): Fix ksutils-teamspeak-management-tools
* refactor(utils): Clear unused script * feat(utils): Add next generation of build script Signed-off-by: KunoiSayami <[email protected]>
Diffstat (limited to 'utils/ng/pkgbuild.py')
-rw-r--r--utils/ng/pkgbuild.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/utils/ng/pkgbuild.py b/utils/ng/pkgbuild.py
new file mode 100644
index 0000000..ed1a661
--- /dev/null
+++ b/utils/ng/pkgbuild.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+from __future__ import annotations
+import argparse
+import asyncio
+import dataclasses
+import lzma
+import logging
+import os
+import pathlib
+import subprocess
+
+import aiofiles
+
+logger = logging.getLogger()
+logger.setLevel(logging.DEBUG)
+
+
+class PackageVersion:
+ name: str
+ version: str
+
+ def __eq__(self, other: PackageVersion) -> bool:
+ return other.version == self.version
+
+ def __gt__(self, other: PackageVersion) -> bool:
+ return self.version > other.version
+
+ def __lt__(self, other: PackageVersion) -> bool:
+ return self.version < other.version
+
+ def __le__(self, other: PackageVersion) -> bool:
+ return self < other or self == other
+
+ def __ge__(self, other: PackageVersion) -> bool:
+ return self > other or self == other
+
+ def __ne__(self, other: PackageVersion) -> bool:
+ return not self == other
+
+ def __str__(self) -> str:
+ return f'{self.name} {self.version}'
+
+
+def fetch_database(pkg_db: str) -> dict[str, str]:
+ name_read = False
+ version_read = False
+ pkg_name = ''
+ package_storage = {}
+ with lzma.open(pkg_db) as fin:
+ for line in fin:
+ line = line.strip()
+ if name_read:
+ pkg_name = line.decode()
+ name_read = False
+ elif version_read:
+ package_storage.update({pkg_name: line.decode()})
+ #logger.debug(pkg_name, line.decode())
+ version_read = False
+ pkg_name = ''
+ if line == b"%NAME%":
+ assert not name_read
+ name_read = True
+ if line == b"%VERSION%":
+ assert not version_read
+ version_read = True
+ assert (name_read is False and version_read is False) or (version_read != name_read)
+ return package_storage
+
+
+def get_src_info(s: str) -> PackageVersion:
+ base = ''
+ ver = ''
+ rel = ''
+ for line in s.splitlines(False):
+ if (line := line.strip()).startswith('pkgver'):
+ ver = line.split('=', maxsplit=2)[1]
+ elif line.startswith('pkgrel'):
+ rel = line.split('=', maxsplit=2)[1]
+ elif line.startswith('pkgbase'):
+ base = line.split('=', maxsplit=2)[1]
+ return PackageVersion(base.strip(), f'{ver.strip()}-{rel.strip()}')
+
+
+async def parse_srcinfo(path: pathlib.PurePath) -> PackageVersion:
+ if (path := pathlib.Path(path.joinpath('.SRCINFO'))).is_file():
+ async with aiofiles.open(str(path)) as fin:
+ return get_src_info(await fin.read())
+ else:
+ p = await asyncio.create_subprocess_exec('makepkg', '--printsrcinfo', stdout=subprocess.PIPE, cwd=path.parent)
+ (stdout, stderr) = (await p.communicate())
+ return get_src_info(stdout.decode())
+
+
+async def do_work(pkg_db: str):
+
+ repo = fetch_database(pkg_db)
+ home_directory = pathlib.Path(os.getcwd())
+
+ tasks = []
+ pending_build = []
+
+ for folder in os.listdir("."):
+ if folder.startswith("."):
+ continue
+ if os.path.isfile(folder):
+ continue
+
+ tasks.append(asyncio.create_task(parse_srcinfo(home_directory.joinpath(folder))))
+
+ finished, _ = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
+
+ for future in finished:
+ pkg = future.result()
+ if pkg.name in repo:
+ #print(pkg.name, repo[pkg.name], pkg.version)
+ if repo[pkg.name] < pkg.version:
+ pending_build.append(pkg.name)
+ else:
+ pending_build.append(pkg.name)
+
+ print(pending_build)
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='pkgbuild.py')
+ parser.add_argument('db_file')
+ args = parser.parse_args()
+ asyncio.run(do_work(args.db_file)) \ No newline at end of file