repo.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import os
  2. import subprocess
  3. from .pkgbuild import PKGBUILD
  4. class Package(object):
  5. def __init__(self, repo, config):
  6. self.repo = repo
  7. self.config = config
  8. def _exec(self, *args):
  9. try:
  10. subprocess.check_output(args, cwd=self.path)
  11. except subprocess.CalledProcessError as e:
  12. print(e.stderr)
  13. def _git(self, *args):
  14. self._exec('git', *args)
  15. def _clone(self):
  16. if not os.path.exists(self.path):
  17. os.makedirs(self.path)
  18. self._git("init")
  19. self._git("remote", "add", "origin", self.url)
  20. self._git("fetch", "origin")
  21. self._git("checkout", "master")
  22. @property
  23. def name(self):
  24. return self.config["name"]
  25. @property
  26. def url(self):
  27. return self.config.get("url") or "https://aur.archlinux.org/{}.git".format(
  28. self.name)
  29. @property
  30. def path(self):
  31. return os.path.join(self.repo.config.config['cachedir'], self.name)
  32. @property
  33. def PKGBUILD(self):
  34. if not os.path.exists(self.path):
  35. self._clone()
  36. if not os.path.exists(os.path.join(self.path, "PKGBUILD")):
  37. self.update()
  38. if not hasattr(self, '_PKGBUILD'):
  39. self._PKGBUILD = PKGBUILD(os.path.join(self.path, 'PKGBUILD'))
  40. return self._PKGBUILD
  41. def update(self):
  42. if not os.path.exists(os.path.join(self.path, '.git')):
  43. self._clone()
  44. else:
  45. self._git("remote", "set-url", "origin", self.url)
  46. self._git("checkout", "-f")
  47. self._git("fetch", "--prune", "origin")
  48. self._git("checkout", "-B", "master", "origin/master")
  49. def makepkg(self):
  50. self._exec("makepkg")
  51. class Repo(object):
  52. def __init__(self, config):
  53. self.config = config
  54. self.packages = []
  55. for package in self.config["packages"]:
  56. if isinstance(package, str):
  57. self.packages.append(Package(self, dict(name=package)))
  58. else:
  59. self.packages.append(Package(self, package))
  60. @property
  61. def name(self):
  62. return self.config.name
  63. @property
  64. def id(self):
  65. return self.config.id