[arch] feature -> AUR: custom actions to allow/ignore rebuild-detector for a given package

This commit is contained in:
Vinicius Moreira
2021-01-14 15:32:54 -03:00
parent 0680a3118d
commit 7d539e0838
17 changed files with 319 additions and 11 deletions

View File

@@ -16,6 +16,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
<img src="https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.12/rebuild_detector.png">
</p>
- new package actions to Allow/Ignore rebuild check for a specific package. Useful for binary packages (e.g: package-bin).
<p align="center">
<img src="https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.12/allow_rebuild_check.png">
</p>
<p align="center">
<img src="https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.12/ignore_rebuild_check.png">
</p>
- form some reason **rebuild-detector** hangs when executed within PyCharm (this integration is disabled regarding this particular scenario for now)
- new custom action to quickly reinstall a package

View File

@@ -188,6 +188,8 @@ database:
- **clean cache**: it cleans the pacman cache directory (default: `/var/cache/pacman/pkg`)
- **mark PKGBUILD as editable**: it marks a given PKGBUILD of a package as editable (a popup with the PKGBUILD will be displayed before upgrading/downgrading this package). Action only available when the configuration property **edit_aur_pkgbuild** is not **false**.
- **unmark PKGBUILD as editable**: reverts the action described above. Action only available when the configuration property **edit_aur_pkgbuild** is not **false**.
- **allow reinstallation check**: it allows to check if a given AUR packages requires to be rebuilt
- **ignore reinstallation check**: it does not to check if a given AUR packages requires to be rebuilt
- **check Snaps support**: checks if the Snapd services are properly enabled.
- Installed AUR packages have their **PKGBUILD** files cached at **~/.cache/bauh/arch/installed/$pkgname**
- Packages with ignored updates are defined at **~/.config/bauh/arch/updates_ignored.txt**

View File

@@ -18,6 +18,7 @@ CONFIG_FILE = '{}/arch.yml'.format(CONFIG_PATH)
SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/arch/aur_suggestions.txt'
UPDATES_IGNORED_FILE = '{}/updates_ignored.txt'.format(CONFIG_DIR)
EDITABLE_PKGBUILDS_FILE = '{}/aur/editable_pkgbuilds.txt'.format(CONFIG_DIR)
IGNORED_REBUILD_CHECK_FILE = '{}/aur/ignored_rebuild_check.txt'.format(CONFIG_DIR)
def get_icon_path() -> str:

View File

@@ -449,7 +449,7 @@ class ArchManager(SoftwareManager):
return res
def _fill_aur_pkgs(self, aur_pkgs: dict, output: List[ArchPackage], disk_loader: DiskCacheLoader, internet_available: bool,
arch_config: dict, rebuild_check: Optional[Thread], to_rebuild: Set[str]):
arch_config: dict, rebuild_check: Optional[Thread], rebuild_ignored: Optional[Thread], rebuild_output: Optional[Dict[str, Set[str]]]):
if internet_available:
try:
@@ -462,9 +462,16 @@ class ArchManager(SoftwareManager):
if pkgsinfo:
editable_pkgbuilds = self._read_editable_pkgbuilds() if arch_config['edit_aur_pkgbuild'] is not False else None
if rebuild_check:
ignore_rebuild_check = None
if rebuild_ignored and rebuild_output is not None:
rebuild_ignored.join()
ignore_rebuild_check = rebuild_output['ignored']
to_rebuild = None
if rebuild_check and rebuild_output is not None:
self.logger.info("Waiting for rebuild-detector")
rebuild_check.join()
to_rebuild = rebuild_output['to_rebuild']
for pkgdata in pkgsinfo:
pkg = self.aur_mapper.map_api_data(pkgdata, aur_pkgs, self.categories)
@@ -477,10 +484,15 @@ class ArchManager(SoftwareManager):
pkg.update = self._check_aur_package_update(pkg=pkg,
installed_data=aur_pkgs.get(pkg.name, {}),
api_data=pkgdata)
pkg.aur_update = pkg.update # used in 'set_rebuild_check'
if ignore_rebuild_check is not None:
pkg.allow_rebuild = pkg.name not in ignore_rebuild_check
if to_rebuild and not pkg.update and pkg.name in to_rebuild:
pkg.require_rebuild = True
pkg.update = True
pkg.update_state()
pkg.status = PackageStatus.READY
output.append(pkg)
@@ -564,15 +576,19 @@ class ArchManager(SoftwareManager):
self.disk_cache_updater.join()
self.logger.info("Disk cache ready")
def __fill_packages_to_rebuild(self, output: Set[str]):
def __fill_packages_to_rebuild(self, output: Dict[str, Set[str]]):
if rebuild_detector.is_installed():
if 'PYCHARM_CLASSPATH' in os.environ:
self.logger.warning("'rebuild-detector' is currently not working within PyCharm. Aborting...")
return
self.logger.info("rebuild-detector: checking")
output.update(rebuild_detector.list_required_rebuild())
self.logger.info("rebuild-detector: packages detected -> {}".format(output))
to_rebuild = rebuild_detector.list_required_rebuild()
output['to_rebuild'].update(to_rebuild)
self.logger.info("rebuild-detector: {} packages require rebuild".format(len(to_rebuild)))
def __fill_ignored_by_rebuild_detector(self, output: Dict[str, Set[str]]):
output['ignored'].update(rebuild_detector.list_ignored())
def read_installed(self, disk_loader: Optional[DiskCacheLoader], limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None, names: Iterable[str] = None, wait_disk_cache: bool = True) -> SearchResult:
self.aur_client.clean_caches()
@@ -583,11 +599,15 @@ class ArchManager(SoftwareManager):
if not aur_supported and not repos_supported:
return SearchResult.empty()
to_rebuild, rebuild_check = set(), None
rebuild_output, rebuild_check, rebuild_ignored = None, None, None
if aur_supported and arch_config['aur_rebuild_detector']:
rebuild_check = Thread(target=self.__fill_packages_to_rebuild, args=(to_rebuild,), daemon=True)
rebuild_output = {'to_rebuild': set(), 'ignored': set()}
rebuild_check = Thread(target=self.__fill_packages_to_rebuild, args=(rebuild_output,), daemon=True)
rebuild_check.start()
rebuild_ignored = Thread(target=self.__fill_ignored_by_rebuild_detector, args=(rebuild_output, ), daemon=True)
rebuild_ignored.start()
installed = pacman.map_installed(names=names)
aur_pkgs, repo_pkgs = None, None
@@ -622,7 +642,7 @@ class ArchManager(SoftwareManager):
map_threads = []
if aur_pkgs:
t = Thread(target=self._fill_aur_pkgs, args=(aur_pkgs, pkgs, disk_loader, internet_available, arch_config, rebuild_check, to_rebuild), daemon=True)
t = Thread(target=self._fill_aur_pkgs, args=(aur_pkgs, pkgs, disk_loader, internet_available, arch_config, rebuild_check, rebuild_ignored, rebuild_output), daemon=True)
t.start()
map_threads.append(t)
@@ -3461,3 +3481,22 @@ class ArchManager(SoftwareManager):
watcher=watcher,
context=context,
disk_loader=self.context.disk_loader_factory.new()).success
def set_rebuild_check(self, pkg: ArchPackage, root_password: str, watcher: ProcessWatcher) -> bool:
if pkg.repository != 'aur':
return False
try:
if pkg.allow_rebuild:
rebuild_detector.add_as_ignored(pkg.name)
pkg.allow_rebuild = False
else:
rebuild_detector.remove_from_ignored(pkg.name)
pkg.allow_rebuild = True
except:
self.logger.error("An unexpected exception happened")
traceback.print_exc()
return False
pkg.update_state()
return True

View File

@@ -28,6 +28,20 @@ ACTION_AUR_REINSTALL = CustomSoftwareAction(i18n_label_key='arch.action.reinstal
manager_method='reinstall',
icon_path=resource.get_path('img/build.svg', ROOT_DIR))
ACTION_IGNORE_REBUILD_CHECK = CustomSoftwareAction(i18n_label_key='arch.action.rebuild_check.ignore',
i18n_status_key='arch.action.rebuild_check.ignore.status',
i18n_confirm_key='arch.action.rebuild_check.ignore.confirm',
requires_root=False,
manager_method='set_rebuild_check',
icon_path=resource.get_path('img/check_disabled.svg', ROOT_DIR))
ACTION_ALLOW_REBUILD_CHECK = CustomSoftwareAction(i18n_label_key='arch.action.rebuild_check.allow',
i18n_status_key='arch.action.rebuild_check.allow.status',
i18n_confirm_key='arch.action.rebuild_check.allow.confirm',
requires_root=False,
manager_method='set_rebuild_check',
icon_path=resource.get_path('img/check.svg', ROOT_DIR))
class ArchPackage(SoftwarePackage):
@@ -38,7 +52,9 @@ class ArchPackage(SoftwarePackage):
desktop_entry: str = None, installed: bool = False, srcinfo: dict = None, dependencies: Set[str] = None,
categories: List[str] = None, i18n: I18n = None, update_ignored: bool = False, arch: str = None,
pkgbuild_editable: bool = None, install_date: Optional[int] = None, commit: Optional[str] = None,
require_rebuild: bool = False):
require_rebuild: bool = False,
allow_rebuild: Optional[bool] = None,
aur_update: bool = False):
super(ArchPackage, self).__init__(name=name, version=version, latest_version=latest_version, description=description,
installed=installed, categories=categories)
@@ -64,6 +80,8 @@ class ArchPackage(SoftwarePackage):
self.install_date = install_date
self.commit = commit # only for AUR for downgrading purposes
self.require_rebuild = require_rebuild
self.allow_rebuild = allow_rebuild
self.aur_update = aur_update
@staticmethod
def disk_cache_path(pkgname: str):
@@ -189,12 +207,22 @@ class ArchPackage(SoftwarePackage):
if self.pkgbuild_editable is not None:
actions.append(ACTION_AUR_DISABLE_PKGBUILD_EDITION if self.pkgbuild_editable else ACTION_AUR_ENABLE_PKGBUILD_EDITION)
if self.allow_rebuild is not None:
actions.append(ACTION_IGNORE_REBUILD_CHECK if self.allow_rebuild else ACTION_ALLOW_REBUILD_CHECK)
return actions
def get_update_tip(self) -> Optional[str]:
if self.repository == 'aur' and self.require_rebuild:
if self.repository == 'aur' and self.allow_rebuild and self.require_rebuild:
return self.i18n['arch.package.requires_rebuild'] + ' (rebuild)'
def update_state(self):
if self.repository == 'aur':
if self.allow_rebuild and self.require_rebuild:
self.update = True
else:
self.update = self.aur_update
def __hash__(self):
if self.view_name is not None:
return hash((self.view_name, self.repository))

View File

@@ -1,6 +1,9 @@
import os
from pathlib import Path
from typing import Set
from bauh.commons import system
from bauh.gems.arch import IGNORED_REBUILD_CHECK_FILE
def is_installed() -> bool:
@@ -22,3 +25,42 @@ def list_required_rebuild() -> Set[str]:
required.add(line_split[1])
return required
def list_ignored() -> Set[str]:
if os.path.isfile(IGNORED_REBUILD_CHECK_FILE):
with open(IGNORED_REBUILD_CHECK_FILE) as f:
ignored_str = f.read()
return {p.strip() for p in ignored_str.split('\n') if p}
else:
return set()
def add_as_ignored(pkgname: str):
ignored = list_ignored()
ignored.add(pkgname)
Path(os.path.dirname(IGNORED_REBUILD_CHECK_FILE)).mkdir(parents=True, exist_ok=True)
with open(IGNORED_REBUILD_CHECK_FILE, 'w+') as f:
for p in ignored:
f.write('{}\n'.format(p))
def remove_from_ignored(pkgname: str):
ignored = list_ignored()
if ignored is None or pkgname not in ignored:
return
ignored.remove(pkgname)
Path(os.path.dirname(IGNORED_REBUILD_CHECK_FILE)).mkdir(parents=True, exist_ok=True)
if ignored:
with open(IGNORED_REBUILD_CHECK_FILE, 'w+') as f:
for p in ignored:
f.write('{}\n'.format(p))
else:
os.remove(IGNORED_REBUILD_CHECK_FILE)

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewBox="0 0 512.00001 512"
enable-background="new 0 0 26 26"
id="svg817"
sodipodi:docname="check.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata823">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs821" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview819"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.84308888"
inkscape:cx="364.16486"
inkscape:cy="281.60119"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg817"
inkscape:document-rotation="0" />
<path
d="m 7.1896424,281.46877 c -3.9182273,-5.09374 -5.8774013,-12.73441 -5.8774013,-17.82813 0,-5.09374 1.959072,-12.73441 5.8776223,-17.82815 l 27.4278676,-35.6563 c 7.836472,-10.18747 19.591293,-10.18747 27.427884,0 l 1.959055,2.54694 107.75243,150.2657 c 3.91834,5.09374 9.79575,5.09374 13.71398,0 L 447.99541,8.952986 h 1.95907 v 0 c 7.8367,-10.187467 19.59149,-10.187467 27.42797,0 l 27.42788,35.656297 c 7.83657,10.187468 7.83657,25.468796 0,35.65628 v 0 L 191.34838,503.04705 c -3.91834,5.09364 -7.83648,7.64056 -13.71388,7.64056 -5.87762,0 -9.79575,-2.54692 -13.71399,-7.64056 L 11.107887,289.10934 Z"
id="path815"
inkscape:connector-curvature="0"
style="fill:#499c54;fill-opacity:1;stroke-width:22.3376" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewBox="0 0 512.00001 512"
enable-background="new 0 0 26 26"
id="svg817"
sodipodi:docname="check_disabled.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata823">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs821" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview819"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.84308888"
inkscape:cx="364.16486"
inkscape:cy="281.60119"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg817"
inkscape:document-rotation="0" />
<g
id="g1547">
<path
d="m 7.1896424,281.46877 c -3.9182273,-5.09374 -5.8774013,-12.73441 -5.8774013,-17.82813 0,-5.09374 1.959072,-12.73441 5.8776223,-17.82815 l 27.4278676,-35.6563 c 7.836472,-10.18747 19.591293,-10.18747 27.427884,0 l 1.959055,2.54694 107.75243,150.2657 c 3.91834,5.09374 9.79575,5.09374 13.71398,0 L 447.99541,8.952986 h 1.95907 v 0 c 7.8367,-10.187467 19.59149,-10.187467 27.42797,0 l 27.42788,35.656297 c 7.83657,10.187468 7.83657,25.468796 0,35.65628 v 0 L 191.34838,503.04705 c -3.91834,5.09364 -7.83648,7.64056 -13.71388,7.64056 -5.87762,0 -9.79575,-2.54692 -13.71399,-7.64056 L 11.107887,289.10934 Z"
id="path815"
inkscape:connector-curvature="0"
style="fill:#499c54;fill-opacity:1;stroke-width:22.3376" />
<path
style="fill:#db5860;fill-opacity:1;stroke-width:1.16152"
id="path936"
d="M 256.00058,8.2104756 C 392.90373,8.2104756 503.7901,119.09685 503.7901,256 c 0,136.90315 -110.88637,247.78952 -247.78952,247.78952 C 119.09743,503.78952 8.2098955,392.90431 8.2098955,256 8.2098955,119.09569 119.09627,8.2104756 256.00058,8.2104756 Z M 454.23173,256 c 0,-109.52276 -88.7084,-198.232321 -198.23231,-198.232321 -45.84152,0 -87.84191,15.73505 -121.41667,41.75299 L 412.47991,377.41783 C 438.49785,343.84191 454.23173,301.84152 454.23173,256 Z M 256.00058,454.23231 c 45.84152,0 87.84191,-15.73504 121.41667,-41.75298 L 99.521254,134.58333 C 73.503315,168.15925 57.768265,210.15964 57.768265,256 c 0,109.52391 88.708395,198.23231 198.232315,198.23231 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=The system's package database is locked.
arch.action.db_locked.body.l2=It is necessary to unlock it to continue.
arch.action.db_locked.confirmation=Unlock and continue

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=The system's package database is locked.
arch.action.db_locked.body.l2=It is necessary to unlock it to continue.
arch.action.db_locked.confirmation=Unlock and continue

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=The system's package database is locked.
arch.action.db_locked.body.l2=It is necessary to unlock it to continue.
arch.action.db_locked.confirmation=Unlock and continue

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Permitir verificación de reinstalación
arch.action.rebuild_check.allow.status=Permitindo verificación de reinstalación
arch.action.rebuild_check.allow.confirm=¿ Permitir verificación de reinstalación para {} ?
arch.action.rebuild_check.ignore=Ignorar verificación de reinstalación
arch.action.rebuild_check.ignore.status=Ignorando verificación de reinstalación
arch.action.rebuild_check.ignore.confirm=¿ Ignorar verificación de reinstalación para {} ?
arch.action.db_locked.body.l1=La base de datos de paquetes del sistema está bloqueada.
arch.action.db_locked.body.l2=Es necesario desbloquearla para continuar.
arch.action.db_locked.confirmation=Desbloquear y continuar

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=La base de données de paquets du système est verrouillée.
arch.action.db_locked.body.l2=Il faut la déverrouiller pour continuer.
arch.action.db_locked.confirmation=Déverrouiller et continuer

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=The system's package database is locked.
arch.action.db_locked.body.l2=It is necessary to unlock it to continue.
arch.action.db_locked.confirmation=Unlock and continue

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Permitir verificação de reinstalação
arch.action.rebuild_check.allow.status=Permitindo verificação de reinstalação
arch.action.rebuild_check.allow.confirm=Permitir verificação de reinstalação para {} ?
arch.action.rebuild_check.ignore=Ignorar verificação de reinstalação
arch.action.rebuild_check.ignore.status=Ignorando verificação de reinstalação
arch.action.rebuild_check.ignore.confirm=Ignorar verificação de reinstalação para {} ?
arch.action.db_locked.body.l1=O banco de dados de pacotes do sistema está bloqueado.
arch.action.db_locked.body.l2=É necessário desbloquea-lo para continuar.
arch.action.db_locked.confirmation=Desbloquear e continuar

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=The system package database is locked.
arch.action.db_locked.body.l2=It is necessary to unlock it to continue.
arch.action.db_locked.confirmation=Unlock and continue

View File

@@ -1,3 +1,9 @@
arch.action.rebuild_check.allow=Allow reinstallation check
arch.action.rebuild_check.allow.status=Allowing reinstallation check
arch.action.rebuild_check.allow.confirm=Allow reinstallation check for {} ?
arch.action.rebuild_check.ignore=Ignore reinstallation check
arch.action.rebuild_check.ignore.status=Ignoring reinstallation check
arch.action.rebuild_check.ignore.confirm=Ignore reinstallation check for {} ?
arch.action.db_locked.body.l1=Sistemin paket veritabanı kilitli.
arch.action.db_locked.body.l2=Devam etmek için veritabanı kilidini açmak gerekiyor.
arch.action.db_locked.confirmation=Veritabanı kilidini aç ve devam et