mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-06-27 14:22:10 +00:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
4445c8c871 | |||
a3a66c7c9a | |||
45b762e3d9 | |||
c5db7e64ca | |||
0dd4d098f6 | |||
4866548224 |
@ -1,7 +1,7 @@
|
||||
# Maintainer: Evgeniy Alekseev
|
||||
|
||||
pkgname='ahriman'
|
||||
pkgver=0.11.0
|
||||
pkgver=0.11.3
|
||||
pkgrel=1
|
||||
pkgdesc="ArcHlinux ReposItory MANager"
|
||||
arch=('any')
|
||||
@ -23,7 +23,7 @@ optdepends=('aws-cli: sync to s3'
|
||||
source=("https://github.com/arcan1s/ahriman/releases/download/$pkgver/$pkgname-$pkgver-src.tar.xz"
|
||||
'ahriman.sysusers'
|
||||
'ahriman.tmpfiles')
|
||||
sha512sums=('02a586de3253908022ec0d8329d217dc52c922ab091d3c6ed91bb45fbc521de08f9163c17dfb7589422f43e7114b0b3dd6d35357c4cd82e564251a0f7f908d18'
|
||||
sha512sums=('ef3c5bf73f95a87f226bc7ca90cee990abf8e7d7dacf56ce5ab346e689019a414a1ffe186a38c75bbf2c9fcc7e04822455e704c67fe2e125c5883dee8066f4bc'
|
||||
'13718afec2c6786a18f0b223ef8e58dccf0688bca4cdbe203f14071f5031ed20120eb0ce38b52c76cfd6e8b6581a9c9eaa2743eb11abbaca637451a84c33f075'
|
||||
'55b20f6da3d66e7bbf2add5d95a3b60632df121717d25a993e56e737d14f51fe063eb6f1b38bd81cc32e05db01c0c1d80aaa720c45cde87f238d8b46cdb8cbc4')
|
||||
backup=('etc/ahriman.ini'
|
||||
|
@ -51,7 +51,7 @@ def sync(args: argparse.Namespace) -> None:
|
||||
def update(args: argparse.Namespace) -> None:
|
||||
app = Application.from_args(args)
|
||||
log_fn = lambda line: print(line) if args.dry_run else app.logger.info(line)
|
||||
packages = app.get_updates(args.no_aur, args.no_manual, args.no_vcs, log_fn)
|
||||
packages = app.get_updates(args.package, args.no_aur, args.no_manual, args.no_vcs, log_fn)
|
||||
if args.dry_run:
|
||||
return
|
||||
app.update(packages)
|
||||
@ -79,6 +79,7 @@ if __name__ == '__main__':
|
||||
add_parser.set_defaults(fn=add)
|
||||
|
||||
check_parser = subparsers.add_parser('check', description='check for updates')
|
||||
check_parser.add_argument('package', help='filter check by packages', nargs='*')
|
||||
check_parser.set_defaults(fn=update, no_aur=False, no_manual=True, no_vcs=False, dry_run=True)
|
||||
|
||||
rebuild_parser = subparsers.add_parser('rebuild', description='rebuild whole repository')
|
||||
@ -97,6 +98,7 @@ if __name__ == '__main__':
|
||||
sync_parser.set_defaults(fn=sync)
|
||||
|
||||
update_parser = subparsers.add_parser('update', description='run updates')
|
||||
update_parser.add_argument('package', help='filter check by packages', nargs='*')
|
||||
update_parser.add_argument('--dry-run', help='just perform check for updates, same as check command', action='store_true')
|
||||
update_parser.add_argument('--no-aur', help='do not check for AUR updates', action='store_true')
|
||||
update_parser.add_argument('--no-manual', help='do not include manual updates', action='store_true')
|
||||
|
@ -58,12 +58,12 @@ class Application:
|
||||
self.report()
|
||||
self.sync()
|
||||
|
||||
def get_updates(self, no_aur: bool, no_manual: bool, no_vcs: bool,
|
||||
def get_updates(self, filter_packages: List[str], no_aur: bool, no_manual: bool, no_vcs: bool,
|
||||
log_fn: Callable[[str], None]) -> List[Package]:
|
||||
updates = []
|
||||
|
||||
if not no_aur:
|
||||
updates.extend(self.repository.updates_aur(no_vcs))
|
||||
updates.extend(self.repository.updates_aur(filter_packages, no_vcs))
|
||||
if not no_manual:
|
||||
updates.extend(self.repository.updates_manual())
|
||||
|
||||
@ -114,13 +114,18 @@ class Application:
|
||||
self.repository.process_sync(targets)
|
||||
|
||||
def update(self, updates: Iterable[Package]) -> None:
|
||||
def process_single(portion: Iterable[Package]):
|
||||
packages = self.repository.process_build(portion)
|
||||
self.repository.process_update(packages)
|
||||
def process_update(paths: Iterable[str]) -> None:
|
||||
self.repository.process_update(paths)
|
||||
self._finalize()
|
||||
|
||||
# process built packages
|
||||
packages = self.repository.packages_built()
|
||||
process_update(packages)
|
||||
|
||||
# process manual packages
|
||||
tree = Tree()
|
||||
tree.load(updates)
|
||||
for num, level in enumerate(tree.levels()):
|
||||
self.logger.info(f'processing level #{num} {[package.base for package in level]}')
|
||||
process_single(level)
|
||||
packages = self.repository.process_build(level)
|
||||
process_update(packages)
|
@ -63,8 +63,8 @@ class Repository:
|
||||
shutil.rmtree(os.path.join(self.paths.manual, package))
|
||||
|
||||
def _clear_packages(self) -> None:
|
||||
for package in os.listdir(self.paths.packages):
|
||||
os.remove(os.path.join(self.paths.packages, package))
|
||||
for package in self.packages_built():
|
||||
os.remove(package)
|
||||
|
||||
def packages(self) -> List[Package]:
|
||||
result: Dict[str, Package] = {}
|
||||
@ -80,6 +80,12 @@ class Repository:
|
||||
continue
|
||||
return list(result.values())
|
||||
|
||||
def packages_built(self) -> List[str]:
|
||||
return [
|
||||
os.path.join(self.paths.packages, fn)
|
||||
for fn in os.listdir(self.paths.packages)
|
||||
]
|
||||
|
||||
def process_build(self, updates: Iterable[Package]) -> List[str]:
|
||||
def build_single(package: Package) -> None:
|
||||
self.web.set_building(package.base)
|
||||
@ -99,10 +105,7 @@ class Repository:
|
||||
continue
|
||||
self._clear_build()
|
||||
|
||||
return [
|
||||
os.path.join(self.paths.packages, fn)
|
||||
for fn in os.listdir(self.paths.packages)
|
||||
]
|
||||
return self.packages_built()
|
||||
|
||||
def process_remove(self, packages: Iterable[str]) -> str:
|
||||
def remove_single(package: str) -> None:
|
||||
@ -154,7 +157,7 @@ class Repository:
|
||||
|
||||
return self.repo.repo_path
|
||||
|
||||
def updates_aur(self, no_vcs: bool) -> List[Package]:
|
||||
def updates_aur(self, filter_packages: Iterable[str], no_vcs: bool) -> List[Package]:
|
||||
result: List[Package] = []
|
||||
|
||||
build_section = self.config.get_section_name('build', self.architecture)
|
||||
@ -165,6 +168,8 @@ class Repository:
|
||||
continue
|
||||
if local.is_vcs and no_vcs:
|
||||
continue
|
||||
if filter_packages and local.base not in filter_packages:
|
||||
continue
|
||||
|
||||
try:
|
||||
remote = Package.load(local.base, self.pacman, self.aur_url)
|
||||
|
@ -25,9 +25,8 @@ import shutil
|
||||
import tempfile
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from pyalpm import Handle
|
||||
from srcinfo.parse import parse_srcinfo
|
||||
from typing import List, Set, Type
|
||||
from typing import List, Optional, Set, Type
|
||||
|
||||
from ahriman.core.alpm.pacman import Pacman
|
||||
from ahriman.core.exceptions import InvalidPackageInfo
|
||||
@ -68,7 +67,7 @@ class Package:
|
||||
try:
|
||||
Task.fetch(clone_dir, self.git_url)
|
||||
# update pkgver first
|
||||
check_output('makepkg', '--nodeps', '--noprepare', '--nobuild',
|
||||
check_output('makepkg', '--nodeps', '--nobuild',
|
||||
exception=None, cwd=clone_dir)
|
||||
# generate new .SRCINFO and put it to parser
|
||||
src_info_source = check_output('makepkg', '--printsrcinfo',
|
||||
@ -76,7 +75,7 @@ class Package:
|
||||
src_info, errors = parse_srcinfo(src_info_source)
|
||||
if errors:
|
||||
raise InvalidPackageInfo(errors)
|
||||
return f'{src_info["pkgver"]}-{src_info["pkgrel"]}'
|
||||
return self.full_version(src_info.get('epoch'), src_info['pkgver'], src_info['pkgrel'])
|
||||
finally:
|
||||
shutil.rmtree(clone_dir, ignore_errors=True)
|
||||
|
||||
@ -97,8 +96,9 @@ class Package:
|
||||
if errors:
|
||||
raise InvalidPackageInfo(errors)
|
||||
packages = set(src_info['packages'].keys())
|
||||
version = cls.full_version(src_info.get('epoch'), src_info['pkgver'], src_info['pkgrel'])
|
||||
|
||||
return cls(src_info['pkgbase'], f'{src_info["pkgver"]}-{src_info["pkgrel"]}', aur_url, packages)
|
||||
return cls(src_info['pkgbase'], version, aur_url, packages)
|
||||
|
||||
@staticmethod
|
||||
def dependencies(path: str) -> Set[str]:
|
||||
@ -115,6 +115,11 @@ class Package:
|
||||
packages = set(src_info['packages'].keys())
|
||||
return set(depends + makedepends) - packages
|
||||
|
||||
@staticmethod
|
||||
def full_version(epoch: Optional[str], pkgver: str, pkgrel: str) -> str:
|
||||
prefix = f'{epoch}:' if epoch else ''
|
||||
return f'{prefix}{pkgver}-{pkgrel}'
|
||||
|
||||
@staticmethod
|
||||
def load(path: str, pacman: Pacman, aur_url: str) -> Package:
|
||||
try:
|
||||
|
@ -17,4 +17,4 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
__version__ = '0.11.0'
|
||||
__version__ = '0.11.3'
|
Reference in New Issue
Block a user