[arch] fix -> uninstall: not detecting hard requirements properly

This commit is contained in:
Vinicius Moreira
2020-09-11 11:17:27 -03:00
parent 590eb2abd2
commit 293d2a5fb0
15 changed files with 235 additions and 86 deletions

View File

@@ -320,3 +320,8 @@ def check_enabled_services(*names: str) -> Dict[str, bool]:
else:
status = output.split('\n')
return {s: status[i].strip().lower() == 'enabled' for i, s in enumerate(names) if s}
def execute(cmd: str, shell: bool = False) -> Tuple[int, str]:
p = subprocess.run(args=cmd.split(' ') if not shell else [cmd], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
return p.returncode, p.stdout.decode()

View File

@@ -19,7 +19,9 @@ def read_config(update_file: bool = False) -> dict:
'aur_build_dir': None,
'aur_remove_build_dir': True,
'aur_build_only_chosen': True,
'check_dependency_breakage': True}
'check_dependency_breakage': True,
'suggest_unneeded_uninstall': False,
'suggest_optdep_uninstall': False}
return read(CONFIG_FILE, template, update_file=update_file)

View File

@@ -39,7 +39,7 @@ from bauh.gems.arch.aur import AURClient
from bauh.gems.arch.config import read_config, get_build_dir
from bauh.gems.arch.dependencies import DependenciesAnalyser
from bauh.gems.arch.download import MultithreadedDownloadService, ArchDownloadException
from bauh.gems.arch.exceptions import PackageNotFoundException
from bauh.gems.arch.exceptions import PackageNotFoundException, PackageInHoldException
from bauh.gems.arch.mapper import ArchDataMapper
from bauh.gems.arch.model import ArchPackage
from bauh.gems.arch.output import TransactionStatusHandler
@@ -1140,7 +1140,7 @@ class ArchManager(SoftwareManager):
return True
def _request_unncessary_uninstall_confirmation(self, uninstalled: Iterable[str], unnecessary: Iterable[str], watcher: ProcessWatcher) -> Optional[List[str]]:
def _request_unncessary_uninstall_confirmation(self, unnecessary: Iterable[str], watcher: ProcessWatcher) -> Optional[Set[str]]:
reqs = [InputOption(label=p, value=p, icon_path=get_icon_path(), read_only=False) for p in unnecessary]
reqs_select = MultipleSelectComponent(options=reqs, default_options=set(reqs), label="", max_per_line=3 if len(reqs) > 9 else 1)
@@ -1150,7 +1150,7 @@ class ArchManager(SoftwareManager):
deny_label=self.i18n['arch.uninstall.unnecessary.proceed'].capitalize(),
confirmation_label=self.i18n['arch.uninstall.unnecessary.cancel'].capitalize(),
window_cancel=False):
return reqs_select.get_selected_values()
return {*reqs_select.get_selected_values()}
def _request_all_unncessary_uninstall_confirmation(self, pkgs: Iterable[str], context: TransactionContext):
reqs = [InputOption(label=p, value=p, icon_path=get_icon_path(), read_only=True) for p in pkgs]
@@ -1172,47 +1172,45 @@ class ArchManager(SoftwareManager):
net_available = internet.is_available() if disk_loader else True
required_by = self.deps_analyser.map_all_required_by(names, set())
hard_requirements = set()
if required_by:
target_provided = pacman.map_provided(pkgs={*names, *required_by}).keys()
for n in names:
try:
pkg_reqs = pacman.list_hard_requirements(n, self.logger)
if target_provided:
required_by_deps = pacman.map_all_deps(required_by, only_installed=True)
if pkg_reqs:
hard_requirements.update(pkg_reqs)
except PackageInHoldException:
context.watcher.show_message(title=self.i18n['error'].capitalize(),
body=self.i18n['arch.uninstall.error.hard_dep_in_hold'].format(bold(n)),
type_=MessageType.ERROR)
return False
if required_by_deps:
all_provided = pacman.map_provided()
for pkg, deps in required_by_deps.items():
target_required_by = 0
for dep in deps:
dep_split = pacman.RE_DEP_OPERATORS.split(dep)
if dep_split[0] in target_provided or dep_split[0] in required_by:
dep_providers = all_provided.get(dep_split[0])
if dep_providers:
target_required_by += 1 if not dep_providers.difference(target_provided) else 0
if not target_required_by:
required_by.remove(pkg)
self._update_progress(context, 50)
self._update_progress(context, 25)
to_uninstall = set()
to_uninstall.update(names)
if required_by:
to_uninstall.update(required_by)
if hard_requirements:
to_uninstall.update(hard_requirements)
if not self._request_uninstall_confirmation(to_uninstall=names,
required=required_by,
required=hard_requirements,
watcher=context.watcher):
return False
if remove_unneeded:
all_deps_map = pacman.map_all_deps(names=to_uninstall, only_installed=True) # retrieving the deps to check if they are still necessary
unnecessary_packages = pacman.list_post_uninstall_unneeded_packages(to_uninstall)
self.logger.info("Checking unnecessary optdeps")
if context.config['suggest_optdep_uninstall']:
unnecessary_packages.update(self._list_opt_deps_with_no_hard_requirements(source_pkgs=to_uninstall))
self.logger.info("Packages no longer needed found: {}".format(len(unnecessary_packages)))
else:
all_deps_map = None
unnecessary_packages = None
self._update_progress(context, 50)
if disk_loader and to_uninstall: # loading package instances in case the uninstall succeeds
instances = self.read_installed(disk_loader=disk_loader,
@@ -1234,60 +1232,50 @@ class ArchManager(SoftwareManager):
self._update_progress(context, 70)
if all_deps_map:
context.watcher.change_substatus(self.i18n['arch.checking_unnecessary_deps'])
all_deps = set()
if unnecessary_packages:
unnecessary_to_uninstall = self._request_unncessary_uninstall_confirmation(unnecessary=unnecessary_packages,
watcher=context.watcher)
all_provided = pacman.map_provided(remote=False)
for deps in all_deps_map.values():
for dep in deps:
real_deps = all_provided.get(dep)
if unnecessary_to_uninstall:
context.watcher.change_substatus(self.i18n['arch.checking_unnecessary_deps'])
unnecessary_requirements = set()
if real_deps:
all_deps.update(real_deps)
for pkg in unnecessary_to_uninstall:
try:
pkg_reqs = pacman.list_hard_requirements(pkg)
if all_deps:
self.logger.info("Mapping dependencies required packages of uninstalled packages")
alldeps_reqs = pacman.map_required_by(all_deps)
if pkg_reqs:
unnecessary_requirements.update(pkg_reqs)
no_longer_needed = set()
if alldeps_reqs:
for dep, reqs in alldeps_reqs.items():
if not reqs:
no_longer_needed.add(dep)
except PackageInHoldException:
context.watcher.show_message(title=self.i18n['warning'].capitalize(),
body=self.i18n['arch.uninstall.error.hard_dep_in_hold'].format(bold(p)),
type_=MessageType.WARNING)
if no_longer_needed:
self.logger.info("{} packages no longer needed found".format(len(no_longer_needed)))
unnecessary_to_uninstall = self._request_unncessary_uninstall_confirmation(uninstalled=to_uninstall,
unnecessary=no_longer_needed,
watcher=context.watcher)
all_unnecessary_to_uninstall = {*unnecessary_to_uninstall, *unnecessary_requirements}
if unnecessary_to_uninstall:
unnecessary_to_uninstall_deps = pacman.list_unnecessary_deps(unnecessary_to_uninstall, all_provided)
all_unnecessary_to_uninstall = {*unnecessary_to_uninstall, *unnecessary_to_uninstall_deps}
if not unnecessary_requirements or self._request_all_unncessary_uninstall_confirmation(all_unnecessary_to_uninstall, context):
if disk_loader: # loading package instances in case the uninstall succeeds
unnecessary_instances = self.read_installed(disk_loader=disk_loader,
internet_available=net_available,
names=all_unnecessary_to_uninstall).installed
else:
unnecessary_instances = None
if not unnecessary_to_uninstall_deps or self._request_all_unncessary_uninstall_confirmation(all_unnecessary_to_uninstall, context):
unneded_uninstalled = self._uninstall_pkgs(all_unnecessary_to_uninstall, context.root_password, context.handler)
if disk_loader: # loading package instances in case the uninstall succeeds
unnecessary_instances = self.read_installed(disk_loader=disk_loader,
internet_available=net_available,
names=all_unnecessary_to_uninstall).installed
else:
unnecessary_instances = None
if unneded_uninstalled:
to_uninstall.update(all_unnecessary_to_uninstall)
unneded_uninstalled = self._uninstall_pkgs(all_unnecessary_to_uninstall, context.root_password, context.handler)
if unneded_uninstalled:
to_uninstall.update(all_unnecessary_to_uninstall)
if disk_loader and unnecessary_instances: # loading package instances in case the uninstall succeeds
for p in unnecessary_instances:
context.removed[p.name] = p
else:
self.logger.error("Could not uninstall some unnecessary packages")
context.watcher.print("Could not uninstall some unnecessary packages")
if disk_loader and unnecessary_instances: # loading package instances in case the uninstall succeeds
for p in unnecessary_instances:
context.removed[p.name] = p
else:
self.logger.error("Could not uninstall some unnecessary packages")
context.watcher.print("Could not uninstall some unnecessary packages")
self._update_progress(context, 90)
if bool(context.config['clean_cached']): # cleaning old versions
context.watcher.change_substatus(self.i18n['arch.uninstall.clean_cached.substatus'])
if os.path.isdir('/var/cache/pacman/pkg'):
@@ -1315,13 +1303,14 @@ class ArchManager(SoftwareManager):
return TransactionResult.fail()
removed = {}
arch_config = read_config()
success = self._uninstall(TransactionContext(change_progress=True,
arch_config=read_config(),
arch_config=arch_config,
watcher=watcher,
root_password=root_password,
handler=handler,
removed=removed),
remove_unneeded=True,
remove_unneeded=arch_config['suggest_unneeded_uninstall'],
names={pkg.name},
disk_loader=disk_loader) # to be able to return all uninstalled packages
if success:
@@ -1545,7 +1534,7 @@ class ArchManager(SoftwareManager):
if context.removed is None:
context.removed = {}
res = self._uninstall(context=context, names={conflicting_pkg}, disk_loader=context.disk_loader)
res = self._uninstall(context=context, names={conflicting_pkg}, disk_loader=context.disk_loader, remove_unneeded=False)
context.restabilish_progress()
return res
@@ -2568,16 +2557,27 @@ class ArchManager(SoftwareManager):
def get_screenshots(self, pkg: SoftwarePackage) -> List[str]:
pass
def _gen_bool_selector(self, id_: str, label_key: str, tooltip_key: str, value: bool, max_width: int, capitalize_label: bool = True) -> SingleSelectComponent:
def _gen_bool_selector(self, id_: str, label_key: str, tooltip_key: str, value: bool, max_width: int,
capitalize_label: bool = True, label_params: Optional[list] = None, tooltip_params: Optional[list] = None) -> SingleSelectComponent:
opts = [InputOption(label=self.i18n['yes'].capitalize(), value=True),
InputOption(label=self.i18n['no'].capitalize(), value=False)]
return SingleSelectComponent(label=self.i18n[label_key],
lb = self.i18n[label_key]
if label_params:
lb = lb.format(*label_params)
tip = self.i18n[tooltip_key]
if tooltip_params:
tip = tip.format(*tooltip_params)
return SingleSelectComponent(label=lb,
options=opts,
default_option=[o for o in opts if o.value == value][0],
max_per_line=len(opts),
type_=SelectViewType.RADIO,
tooltip=self.i18n[tooltip_key],
tooltip=tip,
max_width=max_width,
id_=id_,
capitalize_label=capitalize_label)
@@ -2638,6 +2638,17 @@ class ArchManager(SoftwareManager):
tooltip_key='arch.config.clean_cache.tip',
value=bool(local_config['clean_cached']),
max_width=max_width),
self._gen_bool_selector(id_='suggest_unneeded_uninstall',
label_key='arch.config.suggest_unneeded_uninstall',
tooltip_params=['"{}"'.format(self.i18n['arch.config.suggest_optdep_uninstall'])],
tooltip_key='arch.config.suggest_unneeded_uninstall.tip',
value=bool(local_config['suggest_unneeded_uninstall']),
max_width=max_width),
self._gen_bool_selector(id_='suggest_optdep_uninstall',
label_key='arch.config.suggest_optdep_uninstall',
tooltip_key='arch.config.suggest_optdep_uninstall.tip',
value=bool(local_config['suggest_optdep_uninstall']),
max_width=max_width),
self._gen_bool_selector(id_='ref_mirs',
label_key='arch.config.refresh_mirrors',
tooltip_key='arch.config.refresh_mirrors.tip',
@@ -2707,6 +2718,8 @@ class ArchManager(SoftwareManager):
config['aur_build_dir'] = form_install.get_component('aur_build_dir').file_path
config['aur_build_only_chosen'] = form_install.get_component('aur_build_only_chosen').get_selected()
config['check_dependency_breakage'] = form_install.get_component('check_dependency_breakage').get_selected()
config['suggest_optdep_uninstall'] = form_install.get_component('suggest_optdep_uninstall').get_selected()
config['suggest_unneeded_uninstall'] = form_install.get_component('suggest_unneeded_uninstall').get_selected()
if not config['aur_build_dir']:
config['aur_build_dir'] = None
@@ -3132,3 +3145,35 @@ class ArchManager(SoftwareManager):
f.write(new_srcinfo)
return custom_pkgbuild_path
def _list_opt_deps_with_no_hard_requirements(self, source_pkgs: Set[str], installed_provided: Optional[Dict[str, Set[str]]] = None) -> Set[str]:
optdeps = set()
for deps in pacman.map_optional_deps(names=source_pkgs, remote=False).values():
optdeps.update(deps.keys())
res = set()
if optdeps:
all_provided = pacman.map_provided() if not installed_provided else installed_provided
real_optdeps = set()
for o in optdeps:
dep_providers = all_provided.get(o)
if dep_providers:
for p in dep_providers:
if p not in source_pkgs:
real_optdeps.add(p)
if real_optdeps:
for p in real_optdeps:
try:
reqs = pacman.list_hard_requirements(p, self.logger)
if reqs is not None and (not reqs or reqs.issubset(source_pkgs)):
res.add(p)
except PackageInHoldException:
self.logger.warning("There is a requirement in hold for opt dep '{}'".format(p))
continue
return res

View File

@@ -1,5 +1,13 @@
from typing import Optional
class PackageNotFoundException(Exception):
def __init__(self, name: str):
self.name = name
class PackageInHoldException(Exception):
def __init__(self, name: Optional[str] = None):
self.name = name

View File

@@ -1,12 +1,15 @@
import logging
import os
import re
from threading import Thread
from typing import List, Set, Tuple, Dict, Iterable
from typing import List, Set, Tuple, Dict, Iterable, Optional
from colorama import Fore
from bauh.commons import system
from bauh.commons.system import run_cmd, new_subprocess, new_root_subprocess, SystemProcess, SimpleProcess
from bauh.commons.util import size_to_byte
from bauh.gems.arch.exceptions import PackageNotFoundException
from bauh.gems.arch.exceptions import PackageNotFoundException, PackageInHoldException
RE_DEPS = re.compile(r'[\w\-_]+:[\s\w_\-\.]+\s+\[\w+\]')
RE_OPTDEPS = re.compile(r'[\w\._\-]+\s*:')
@@ -1128,3 +1131,42 @@ def get_packages_to_sync_first() -> Set[str]:
def is_snapd_installed() -> bool:
return bool(run_cmd('pacman -Qq snapd', print_error=False))
def list_hard_requirements(name: str, logger: Optional[logging.Logger] = None) -> Optional[Set[str]]:
code, output = system.execute('pacman -Rc {} --print-format=%n'.format(name), shell=True)
if code != 0:
if 'HoldPkg' in output:
raise PackageInHoldException()
elif 'target not found' in output:
raise PackageNotFoundException(name)
elif logger:
logger.error("Unexpected error while listing hard requirements of: {}".format(name))
print('{}{}{}'.format(Fore.RED, output, Fore.RESET))
elif output:
reqs = set()
for line in output.split('\n'):
if line:
line_strip = line.strip()
if line_strip and line_strip != name:
reqs.add(line_strip)
return reqs
def list_post_uninstall_unneeded_packages(names: Set[str]) -> Set[str]:
output = run_cmd('pacman -Rss {} --print-format=%n'.format(' '.join(names)), print_error=False)
reqs = set()
if output:
for line in output.split('\n'):
if line:
line_strip = line.strip()
if line_strip and line_strip not in names:
reqs.add(line_strip)
return reqs

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Refresh mirrors on startup
arch.config.refresh_mirrors.tip=Refresh the package mirrors once a day on startup ( or after a device reboot )
arch.config.repos=Repositories packages
arch.config.repos.tip=It allows to manage packages from the repositories set
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Synchronize packages databases
arch.config.sync_dbs.tip=Synchronizes the package databases once a day before the first package installation, upgrade or downgrade. This option helps to prevent errors during these operations.
arch.config.sync_dbs_start.tip=Synchronizes the package databases during the initialization once a day
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Actualitzen {}
arch.uncompressing.package=Sestà descomprimint el paquet
arch.uninstall.clean_cached.error=No s'ha pogut eliminar {} versions antigues que es troba al disc
arch.uninstall.clean_cached.substatus=Eliminació de versions antigues del disc
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=It is necessary to uninstall them as well to proceed
arch.uninstall.unnecessary.all=The following {} packages will be uninstalled

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Refresh mirrors on startup
arch.config.refresh_mirrors.tip=Refresh the package mirrors once a day on startup ( or after a device reboot )
arch.config.repos=Repositories packages
arch.config.repos.tip=It allows to manage packages from the repositories set
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Synchronize packages databases
arch.config.sync_dbs.tip=Synchronizes the package databases once a day before the first package installation, upgrade or downgrade. This option helps to prevent errors during these operations.
arch.config.sync_dbs_start.tip=Synchronizes the package databases during the initialization once a day
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Updating {}
arch.uncompressing.package=Paket entpacken
arch.uninstall.clean_cached.error=It was not possible to remove old {} versions found on disk
arch.uninstall.clean_cached.substatus=Removing old versions from disk
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=It is necessary to uninstall them as well to proceed
arch.uninstall.unnecessary.all=The following {} packages will be uninstalled

View File

@@ -57,6 +57,10 @@ arch.config.refresh_mirrors=Refresh mirrors on startup
arch.config.refresh_mirrors.tip=Refresh the package mirrors once a day on startup ( or after a device reboot )
arch.config.repos=Repositories packages
arch.config.repos.tip=It allows to manage packages from the repositories set
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Synchronize packages databases
arch.config.sync_dbs.tip=Synchronizes the package databases once a day before the first package installation, upgrade or downgrade. This option helps to prevent errors during these operations.
arch.config.sync_dbs_start.tip=Synchronizes the package databases during the initialization once a day
@@ -214,6 +218,7 @@ arch.task.sync_sb.status=Updating {}
arch.uncompressing.package=Uncompressing the package
arch.uninstall.clean_cached.error=It was not possible to remove old {} versions found on disk
arch.uninstall.clean_cached.substatus=Removing old versions from disk
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=It is necessary to uninstall them as well to proceed
arch.uninstall.unnecessary.all=The following {} packages will be uninstalled

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Actualizar espejos al iniciar
arch.config.refresh_mirrors.tip=Actualiza los espejos de paquetes una vez al día al iniciar ( o después de reiniciar el dispositivo )
arch.config.repos=Paquetes de repositorios
arch.config.repos.tip=Permite gestionar paquetes de los repositorios configurados
arch.config.suggest_optdep_uninstall=Desinstalar dependencias opcionales
arch.config.suggest_optdep_uninstall.tip=Si las dependencias opcionales asociadas con los paquetes desinstalados deben se sugeridas para desinstalación. Solo se sugerirán las dependencias opcionales que no sean dependencias de otros paquetes.
arch.config.suggest_unneeded_uninstall=Desinstalar las dependencias innecesarias
arch.config.suggest_unneeded_uninstall.tip=Si las dependencias aparentemente ya no necesarias asociadas con los paquetes desinstalados deben ser sugeridas para desinstalación. Cuando esta propiedad está habilitada, automáticamente deshabilita la propiedad {}.
arch.config.sync_dbs=Sincronizar las bases de paquetes
arch.config.sync_dbs.tip=Sincroniza las bases de paquetes una vez al día antes de la primera instalación, actualización o reversión de paquete. Esta opción ayuda a prevenir errores durante estas operaciones.
arch.config.sync_dbs_start.tip=Sincroniza las bases de paquetes durante la inicialización una vez al día
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Actualizando {}
arch.uncompressing.package=Descomprimindo el paquete
arch.uninstall.clean_cached.error=No fue posible eliminar versiones antiguas de {} encontradas en disco
arch.uninstall.clean_cached.substatus=Eliminando versiones antiguas del disco
arch.uninstall.error.hard_dep_in_hold=No es posible desinstalar {} porque una de sus dependencias está bloqueada (InHold)
arch.uninstall.required_by=Los {} paquetes enumerados abajo dependen de {} para funcionar correctamente
arch.uninstall.required_by.advice=Es necesario desinstalarlos también para continuar
arch.uninstall.unnecessary.all=Los {} seguintes paquetes serán desinstalados

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Refresh mirrors on startup
arch.config.refresh_mirrors.tip=Refresh the package mirrors once a day on startup ( or after a device reboot )
arch.config.repos=Repositories packages
arch.config.repos.tip=It allows to manage packages from the repositories set
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Synchronize packages databases
arch.config.sync_dbs.tip=Synchronizes the package databases once a day before the first package installation, upgrade or downgrade. This option helps to prevent errors during these operations.
arch.config.sync_dbs_start.tip=Synchronizes the package databases during the initialization once a day
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Aggiornando {}
arch.uncompressing.package=Non comprimere il pacchetto
arch.uninstall.clean_cached.error=Non è stato possibile rimuovere le vecchie {} versioni trovate sul disco
arch.uninstall.clean_cached.substatus=Rimozione di versioni precedenti dal disco
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=It is necessary to uninstall them as well to proceed
arch.uninstall.unnecessary.all=The following {} packages will be uninstalled

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Atualizar espelhos ao iniciar
arch.config.refresh_mirrors.tip=Atualiza os espelhos de pacotes uma vez ao dia na inicialização
arch.config.repos=Pacotes de repositórios
arch.config.repos.tip=Permite gerenciar pacotes dos repositórisos
arch.config.suggest_optdep_uninstall=Desinstalar dependências opcionais
arch.config.suggest_optdep_uninstall.tip=Se as dependências opcionais associadas a pacotes desinstalados devem ser sugeridas para desinstalação. Somente as dependências opcionais que não sejam dependências de outros pacotes serão sugeridas.
arch.config.suggest_unneeded_uninstall=Desinstalar dependências desnecessárias
arch.config.suggest_unneeded_uninstall.tip=Se as dependências aparentemente não mais necessárias associadas aos pacotes desinstalados devem ser sugeridas para desinstalação. Quando essa proprieda está habilitada automaticamente desabilita a propriedade {}.
arch.config.sync_dbs=Sincronizar bases de pacotes
arch.config.sync_dbs.tip=Sincroniza as bases de pacotes uma vez ao dia antes da primeira instalação, atualização ou reversão de pacote. Essa opção ajuda a evitar erros durante essa operações.
arch.config.sync_dbs_start.tip=Sincroniza as bases de pacotes durante a inicialização uma vez ao dia
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Atualizando {}
arch.uncompressing.package=Descompactando o pacote
arch.uninstall.clean_cached.error=Não foi possível remover versões antigas de {} encontradas em disco
arch.uninstall.clean_cached.substatus=Removendo versões antigas do disco
arch.uninstall.error.hard_dep_in_hold=Não é possível desinstalar {} pois uma de suas dependências está bloqueada (InHold)
arch.uninstall.required_by=Os {} pacotes listados abaixo dependem de {} para funcionar corretamente
arch.uninstall.required_by.advice=Para prosseguir será necessário desinstá-los também
arch.uninstall.unnecessary.all=Os seguintes {} pacotes serão desinstalados

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Обновить зеркала при запуск
arch.config.refresh_mirrors.tip=Обновляйте зеркала пакета один раз в день при запуске (или после перезагрузки устройства)
arch.config.repos=Пакеты репозиториев
arch.config.repos.tip=Он позволяет управлять пакетами из набора репозиториев
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Синхронизация баз данных пакетов
arch.config.sync_dbs.tip=Синхронизируйте базы данных пакетов один раз в день перед первой установкой, обновлением или понижением версии пакета. Этот параметр помогает предотвратить ошибки во время этих операций.
arch.config.sync_dbs_start.tip=Синхронизирует базы данных пакетов во время инициализации один раз в день
@@ -213,6 +217,7 @@ arch.task.sync_sb.status=Updating {}
arch.uncompressing.package=Распаковка пакета
arch.uninstall.clean_cached.error=It was not possible to remove old {} versions found on disk
arch.uninstall.clean_cached.substatus=Removing old versions from disk
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=It is necessary to uninstall them as well to proceed
arch.uninstall.unnecessary.all=The following {} packages will be uninstalled

View File

@@ -56,6 +56,10 @@ arch.config.refresh_mirrors=Başlangıçta yansıları yenile
arch.config.refresh_mirrors.tip=Paket yansılarını başlangıçta günde bir kez (veya cihaz yeniden başlatıldıktan sonra) yenileyin
arch.config.repos=Depo paketleri
arch.config.repos.tip=Paketleri depolardan yönetmeye izin verir
arch.config.suggest_optdep_uninstall=Uninstall optional dependencies
arch.config.suggest_optdep_uninstall.tip=If the optional dependencies associated with uninstalled packages should be suggested for uninstallation. Only the optional dependencies that are not dependencies of other packages will be suggested.
arch.config.suggest_unneeded_uninstall=Uninstall unneeded dependencies
arch.config.suggest_unneeded_uninstall.tip=If the dependencies apparently no longer necessary associated with the uninstalled packages should be suggested for uninstallation. When this property is enabled it automatically disables the property {}.
arch.config.sync_dbs=Paket veritabanlarını senkronize et
arch.config.sync_dbs.tip=İlk veritabanını kurmadan, yükseltmeden veya indirmeden önce paket veritabanlarını günde bir kez senkronize eder. Bu seçenek, bu işlemler sırasında hataların önlenmesine yardımcı olur.
arch.config.sync_dbs_start.tip=Başlatma sırasında paket veritabanlarını günde bir kez senkronize eder
@@ -213,6 +217,7 @@ arch.task.sync_sb.status={} güncelleniyor
arch.uncompressing.package=Paket arşivden çıkarılıyor
arch.uninstall.clean_cached.error=Diskte bulunan eski {} sürümleri kaldırılamadı
arch.uninstall.clean_cached.substatus=Eski sürümler diskten kaldırılıyor
arch.uninstall.error.hard_dep_in_hold=It is not possible to uninstall {} because one of its dependencies is marked as "InHold"
arch.uninstall.required_by=The {} packages listed below depend on {} to work properly
arch.uninstall.required_by.advice=Devam etmek için bunları da kaldırmak gerekir
arch.uninstall.unnecessary.all=Aşağıdaki {} paketler kaldırılacak