aboutsummaryrefslogtreecommitdiff
path: root/utils/aur/AURUtils/srcinfo.py
diff options
context:
space:
mode:
author67au <[email protected]>2021-12-11 03:03:14 +0800
committerKunoi Sayami <[email protected]>2021-12-11 18:42:40 +0800
commitdcbf7ce789edce4042c674ab71fa89a25141084b (patch)
tree90e60440cd65b13d6ea46e32959b6d14e6b21724 /utils/aur/AURUtils/srcinfo.py
parent84a71e61c3a8674c9cee6f30240fb4d86cc1dc04 (diff)
feat(script): add new aur check
Signed-off-by: 67au <[email protected]>
Diffstat (limited to 'utils/aur/AURUtils/srcinfo.py')
-rw-r--r--utils/aur/AURUtils/srcinfo.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/utils/aur/AURUtils/srcinfo.py b/utils/aur/AURUtils/srcinfo.py
new file mode 100644
index 0000000..34d2240
--- /dev/null
+++ b/utils/aur/AURUtils/srcinfo.py
@@ -0,0 +1,97 @@
+import re
+from collections import defaultdict
+from itertools import chain
+from typing import Optional, Union
+
+from .errors import PackageNotFound
+from .aur_deps import depends_strip
+
+key_value_pattern = re.compile(r'(?P<KEY>.+?)=(?P<VALUE>.+)')
+multivalued_attrs = {
+ 'source', 'provides', 'conflicts', 'depends', 'replaces', 'optdepends', 'makedepends', 'checkdepends',
+ 'md5sums', 'sha1sums', 'sha224sums', 'sha256sums', 'sha384sums', 'sha512sums', 'arch'
+}
+
+
+class SRCINFO:
+
+ def __init__(self, pkgbase: str, pkgbase_opt: dict, pkgs_opt: dict):
+ self.pkgbase = pkgbase
+ self.pkgbase_opt = pkgbase_opt
+ self.pkgs_opt = pkgs_opt
+
+ @classmethod
+ def parse(cls, source: str):
+ pkgbase = None
+ pkgbase_opt = defaultdict(list)
+ pkgs_opt = {}
+ handler = None
+ for l in source.splitlines():
+ m = key_value_pattern.search(l.strip())
+ if m is None:
+ continue
+ key, value = m.group('KEY').strip(), m.group('VALUE').strip()
+ if key == 'pkgbase':
+ pkgbase = value
+ handler = pkgbase_opt
+ elif key == 'pkgname':
+ pkgs_opt[value] = defaultdict(list)
+ handler = pkgs_opt[value]
+ else:
+ if key in multivalued_attrs:
+ handler[key].append(value)
+ else:
+ handler[key] = value
+ return SRCINFO(pkgbase, pkgbase_opt, pkgs_opt)
+
+ @property
+ def pkgs(self) -> dict:
+ return {
+ k: {i: self.get_pkg_opt(k, i) for i in chain(self.pkgbase_opt.keys(), v.keys())}
+ for k, v in self.pkgs_opt.items()
+ }
+
+ @property
+ def pkgs_name(self) -> list:
+ return list(self.pkgs_opt.keys())
+
+ def _chain_pkg_opt(self, pkgname: str, opt: str) -> chain:
+ if pkgname not in self.pkgs_name:
+ raise PackageNotFound(f'{pkgname} not found in {self.pkgbase}')
+ return chain(self.pkgbase_opt.get(opt, []), self.pkgs_opt[pkgname].get(opt, []))
+
+ def _chain_opt(self, opt: str) -> chain:
+ return chain(self.pkgbase_opt.get(opt, []), *(i.get(opt, []) for i in self.pkgs_opt.values()))
+
+ def get_pkg_opt(self, pkgname: str, opt: str) -> Union[list, str]:
+ if pkgname not in self.pkgs_name:
+ raise PackageNotFound(f'{pkgname} not found in {self.pkgbase}')
+ if opt in multivalued_attrs:
+ return list(self._chain_pkg_opt(pkgname, opt))
+ return self.pkgbase_opt.get(opt)
+
+ def get_opt(self, opt: str) -> Union[list, str]:
+ if opt in multivalued_attrs:
+ return list(self._chain_opt(opt))
+ return self.pkgbase_opt.get(opt)
+
+ @property
+ def depends(self) -> list[str]:
+ return list(map(depends_strip, self._chain_opt('depends')))
+
+ @property
+ def makedepends(self) -> list[str]:
+ return list(map(depends_strip, self._chain_opt('makedepends')))
+
+ @property
+ def optdepends(self) -> list[str]:
+ return list(self._chain_opt('optdepends'))
+
+ @property
+ def version(self) -> tuple[Optional[str], str, str]:
+ return self.pkgbase_opt.get('epoch', None), \
+ self.pkgbase_opt['pkgver'], self.pkgbase_opt['pkgrel']
+
+ def get_version(self) -> str:
+ epoch = f"{self.pkgbase_opt['epoch']}:" if self.pkgbase_opt.get('epoch') else ''
+ return f"{epoch}{self.pkgbase_opt['pkgver']}-{self.pkgbase_opt['pkgrel']}"