mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 16:44:15 +02:00
0.9.27
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -8,3 +8,10 @@ dist
|
|||||||
*.egg-info
|
*.egg-info
|
||||||
build
|
build
|
||||||
*.db
|
*.db
|
||||||
|
linux_dist/appimage/AppDir
|
||||||
|
linux_dist/appimage/appimage-builder-cache
|
||||||
|
linux_dist/appimage/*.zsync
|
||||||
|
linux_dist/appimage/*.AppImage
|
||||||
|
linux_dist/appimage/*.gz
|
||||||
|
linux_dist/appimage/bauh-*
|
||||||
|
|
||||||
|
|||||||
25
CHANGELOG.md
25
CHANGELOG.md
@@ -4,6 +4,31 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
|
## [0.9.27] 2022-02-11
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- Arch:
|
||||||
|
- preventing AUR's installed packages from not being mapped in cases the communication with the API fails
|
||||||
|
- code refactoring (String formatting method)
|
||||||
|
|
||||||
|
- Setup
|
||||||
|
- able to install bauh with python/pip without enforcing requirements through the environment variable `BAUH_SETUP_NO_REQS=1`
|
||||||
|
|
||||||
|
- Distribution
|
||||||
|
- AppImage: -~32% size reduction (141.93 MB -> 96.32 MB)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- Arch
|
||||||
|
- silent crash when handling and displaying transaction sub-status
|
||||||
|
- AUR: not detecting installed packages anymore due to recent AUR API changes
|
||||||
|
- installation fails when several dependent packages conflict with the installed ones
|
||||||
|
- removing a duplicate call to checking for AUR updates
|
||||||
|
|
||||||
|
- AppImage
|
||||||
|
- search: displaying duplicate installed apps for some cases
|
||||||
|
|
||||||
|
|
||||||
## [0.9.26] 2022-01-31
|
## [0.9.26] 2022-01-31
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Key features
|
|||||||
## Index
|
## Index
|
||||||
1. [Installation](#installation)
|
1. [Installation](#installation)
|
||||||
- [AppImage](#inst_appimage)
|
- [AppImage](#inst_appimage)
|
||||||
- [Ubuntu-based distros (20.04)](#inst_ubuntu)
|
- [Ubuntu 20.04 based distros (Linux Mint, PopOS, ...)](#inst_ubuntu)
|
||||||
- [Arch-based distros](#inst_arch)
|
- [Arch-based distros](#inst_arch)
|
||||||
2. [Isolated installation](#inst_iso)
|
2. [Isolated installation](#inst_iso)
|
||||||
3. [Desktop entry / menu shortcut](#desk_entry)
|
3. [Desktop entry / menu shortcut](#desk_entry)
|
||||||
@@ -56,7 +56,7 @@ Key features
|
|||||||
- Run the following command through a terminal: `chmod a+x bauh-${version}-x86_64.AppImage` (replace `${version}` by the respective downloaded version)
|
- Run the following command through a terminal: `chmod a+x bauh-${version}-x86_64.AppImage` (replace `${version}` by the respective downloaded version)
|
||||||
- Launch it: `./bauh-${version}-x86_64.AppImage`
|
- Launch it: `./bauh-${version}-x86_64.AppImage`
|
||||||
|
|
||||||
#### <a name="inst_ubuntu">Ubuntu-based distros (20.04)</a>
|
#### <a name="inst_ubuntu">Ubuntu 20.04 based distros (Linux Mint, PopOS, ...)</a>
|
||||||
|
|
||||||
##### Required dependencies
|
##### Required dependencies
|
||||||
|
|
||||||
@@ -66,6 +66,7 @@ Key features
|
|||||||
|
|
||||||
`sudo pip3 install bauh`
|
`sudo pip3 install bauh`
|
||||||
|
|
||||||
|
|
||||||
##### Optional dependencies (they should be installed with apt-get/apt)
|
##### Optional dependencies (they should be installed with apt-get/apt)
|
||||||
|
|
||||||
- `timeshift`: system backup
|
- `timeshift`: system backup
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
__version__ = '0.9.26'
|
__version__ = '0.9.27'
|
||||||
__app_name__ = 'bauh'
|
__app_name__ = 'bauh'
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|||||||
@@ -227,7 +227,7 @@ class AppImageManager(SoftwareManager):
|
|||||||
installed_found.append(appim)
|
installed_found.append(appim)
|
||||||
found = True
|
found = True
|
||||||
|
|
||||||
if not found and lower_words in appim.name.lower() or (appim.description and lower_words in appim.description.lower()):
|
if not found and (lower_words in appim.name.lower() or (appim.description and lower_words in appim.description.lower())):
|
||||||
installed_found.append(appim)
|
installed_found.append(appim)
|
||||||
try:
|
try:
|
||||||
apps_conn.close()
|
apps_conn.close()
|
||||||
|
|||||||
@@ -112,12 +112,30 @@ class AURClient:
|
|||||||
def search(self, words: str) -> dict:
|
def search(self, words: str) -> dict:
|
||||||
return self.http_client.get_json(URL_SEARCH + words)
|
return self.http_client.get_json(URL_SEARCH + words)
|
||||||
|
|
||||||
def get_info(self, names: Iterable[str]) -> List[dict]:
|
def get_info(self, names: Iterable[str]) -> Optional[List[dict]]:
|
||||||
|
if names:
|
||||||
try:
|
try:
|
||||||
res = self.http_client.get_json(URL_INFO + self._map_names_as_queries(names))
|
res = self.http_client.get_json(URL_INFO + self._map_names_as_queries(names))
|
||||||
return res['results'] if res and res.get('results') else []
|
except requests.exceptions.ConnectionError:
|
||||||
except:
|
self.logger.warning('Could not retrieve installed AUR packages API data. It seems the internet connection is off.')
|
||||||
return []
|
return
|
||||||
|
|
||||||
|
if res is None:
|
||||||
|
self.logger.warning("Call to AUR API's info endpoint has failed")
|
||||||
|
return
|
||||||
|
|
||||||
|
error = res.get('error')
|
||||||
|
|
||||||
|
if error:
|
||||||
|
self.logger.warning(f"AUR API's info endpoint returned an unexpected error: {error}")
|
||||||
|
return
|
||||||
|
|
||||||
|
results = res.get('results')
|
||||||
|
|
||||||
|
if results is not None:
|
||||||
|
return results
|
||||||
|
|
||||||
|
self.logger.warning(f"AUR API's info endpoint returned an unexpected response: {res}")
|
||||||
|
|
||||||
def map_provided(self, pkgname: str, pkgver: str, provided: Optional[Iterable[str]] = None, strip_epoch: bool = True) -> Set[str]:
|
def map_provided(self, pkgname: str, pkgver: str, provided: Optional[Iterable[str]] = None, strip_epoch: bool = True) -> Set[str]:
|
||||||
all_provided = {pkgname, f"{pkgname}={pkgver.split('-')[0] if strip_epoch else pkgver}"}
|
all_provided = {pkgname, f"{pkgname}={pkgver.split('-')[0] if strip_epoch else pkgver}"}
|
||||||
@@ -130,7 +148,10 @@ class AURClient:
|
|||||||
return all_provided
|
return all_provided
|
||||||
|
|
||||||
def gen_updates_data(self, names: Iterable[str]) -> Generator[Tuple[str, dict], None, None]:
|
def gen_updates_data(self, names: Iterable[str]) -> Generator[Tuple[str, dict], None, None]:
|
||||||
for package in self.get_info(names):
|
pkgs_info = self.get_info(names)
|
||||||
|
|
||||||
|
if pkgs_info:
|
||||||
|
for package in pkgs_info:
|
||||||
pkgname, pkgver = package['Name'], package['Version'].split('-')[0]
|
pkgname, pkgver = package['Name'], package['Version'].split('-')[0]
|
||||||
|
|
||||||
deps = set()
|
deps = set()
|
||||||
@@ -175,7 +196,7 @@ class AURClient:
|
|||||||
self.logger.warning('No .SRCINFO found for {}'.format(name))
|
self.logger.warning('No .SRCINFO found for {}'.format(name))
|
||||||
self.logger.info('Checking if {} is based on another package'.format(name))
|
self.logger.info('Checking if {} is based on another package'.format(name))
|
||||||
# if was not found, it may be based on another package.
|
# if was not found, it may be based on another package.
|
||||||
infos = self.get_info({name})
|
infos = self.get_info((name,))
|
||||||
|
|
||||||
if infos:
|
if infos:
|
||||||
info = infos[0]
|
info = infos[0]
|
||||||
@@ -214,8 +235,8 @@ class AURClient:
|
|||||||
|
|
||||||
return self.extract_required_dependencies(info)
|
return self.extract_required_dependencies(info)
|
||||||
|
|
||||||
def _map_names_as_queries(self, names) -> str:
|
def _map_names_as_queries(self, names: Iterable[str]) -> str:
|
||||||
return '&'.join(['arg[{}]={}'.format(i, urllib.parse.quote(n)) for i, n in enumerate(names)])
|
return '&'.join((f'arg[]={urllib.parse.quote(n)}' for n in names))
|
||||||
|
|
||||||
def read_local_index(self) -> dict:
|
def read_local_index(self) -> dict:
|
||||||
self.logger.info('Checking if the cached AUR index file exists')
|
self.logger.info('Checking if the cached AUR index file exists')
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ from pwd import getpwnam
|
|||||||
from threading import Thread
|
from threading import Thread
|
||||||
from typing import List, Set, Type, Tuple, Dict, Iterable, Optional, Collection, Generator
|
from typing import List, Set, Type, Tuple, Dict, Iterable, Optional, Collection, Generator
|
||||||
|
|
||||||
import requests
|
|
||||||
from dateutil.parser import parse as parse_date
|
from dateutil.parser import parse as parse_date
|
||||||
|
|
||||||
from bauh import __app_name__
|
from bauh import __app_name__
|
||||||
@@ -412,18 +411,39 @@ class ArchManager(SoftwareManager):
|
|||||||
res.update_total()
|
res.update_total()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _fill_aur_pkgs(self, aur_pkgs: dict, output: List[ArchPackage], disk_loader: DiskCacheLoader, internet_available: bool,
|
def _fill_aur_pkgs_offline(self, aur_pkgs: dict, arch_config: dict, output: List[ArchPackage], disk_loader: Optional[DiskCacheLoader]):
|
||||||
|
self.logger.info("Reading cached data from installed AUR packages")
|
||||||
|
|
||||||
|
editable_pkgbuilds = self._read_editable_pkgbuilds() if arch_config['edit_aur_pkgbuild'] is not False else None
|
||||||
|
for name, data in aur_pkgs.items():
|
||||||
|
pkg = ArchPackage(name=name, version=data.get('version'),
|
||||||
|
latest_version=data.get('version'), description=data.get('description'),
|
||||||
|
installed=True, repository='aur', i18n=self.i18n)
|
||||||
|
|
||||||
|
pkg.categories = self.categories.get(pkg.name)
|
||||||
|
pkg.pkgbuild_editable = pkg.name in editable_pkgbuilds if editable_pkgbuilds is not None else None
|
||||||
|
|
||||||
|
if disk_loader:
|
||||||
|
disk_loader.fill(pkg)
|
||||||
|
|
||||||
|
pkg.status = PackageStatus.READY
|
||||||
|
output.append(pkg)
|
||||||
|
|
||||||
|
def _fill_aur_pkgs(self, aur_pkgs: dict, output: List[ArchPackage], disk_loader: Optional[DiskCacheLoader], internet_available: bool,
|
||||||
arch_config: dict, rebuild_check: Optional[Thread], rebuild_ignored: Optional[Thread], rebuild_output: Optional[Dict[str, Set[str]]]):
|
arch_config: dict, rebuild_check: Optional[Thread], rebuild_ignored: Optional[Thread], rebuild_output: Optional[Dict[str, Set[str]]]):
|
||||||
|
|
||||||
if internet_available:
|
if not internet_available:
|
||||||
try:
|
self._fill_aur_pkgs_offline(aur_pkgs=aur_pkgs, arch_config=arch_config,
|
||||||
pkgsinfo = self.aur_client.get_info(aur_pkgs.keys())
|
output=output, disk_loader=disk_loader)
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
self.logger.warning('Could not retrieve installed AUR packages API data. It seems the internet connection is off.')
|
|
||||||
self.logger.info("Reading only local AUR packages data")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if pkgsinfo:
|
pkgsinfo = self.aur_client.get_info(aur_pkgs.keys())
|
||||||
|
|
||||||
|
if pkgsinfo is None:
|
||||||
|
self._fill_aur_pkgs_offline(aur_pkgs=aur_pkgs, arch_config=arch_config, output=output, disk_loader=disk_loader)
|
||||||
|
elif not pkgsinfo:
|
||||||
|
self.logger.warning("No data found for the supposed installed AUR packages returned from AUR API's info endpoint")
|
||||||
|
else:
|
||||||
editable_pkgbuilds = self._read_editable_pkgbuilds() if arch_config['edit_aur_pkgbuild'] is not False else None
|
editable_pkgbuilds = self._read_editable_pkgbuilds() if arch_config['edit_aur_pkgbuild'] is not False else None
|
||||||
|
|
||||||
ignore_rebuild_check = None
|
ignore_rebuild_check = None
|
||||||
@@ -461,22 +481,6 @@ class ArchManager(SoftwareManager):
|
|||||||
pkg.status = PackageStatus.READY
|
pkg.status = PackageStatus.READY
|
||||||
output.append(pkg)
|
output.append(pkg)
|
||||||
|
|
||||||
else:
|
|
||||||
editable_pkgbuilds = self._read_editable_pkgbuilds() if arch_config['edit_aur_pkgbuild'] is not False else None
|
|
||||||
for name, data in aur_pkgs.items():
|
|
||||||
pkg = ArchPackage(name=name, version=data.get('version'),
|
|
||||||
latest_version=data.get('version'), description=data.get('description'),
|
|
||||||
installed=True, repository='aur', i18n=self.i18n)
|
|
||||||
|
|
||||||
pkg.categories = self.categories.get(pkg.name)
|
|
||||||
pkg.pkgbuild_editable = pkg.name in editable_pkgbuilds if editable_pkgbuilds is not None else None
|
|
||||||
|
|
||||||
if disk_loader:
|
|
||||||
disk_loader.fill(pkg)
|
|
||||||
|
|
||||||
pkg.status = PackageStatus.READY
|
|
||||||
output.append(pkg)
|
|
||||||
|
|
||||||
def _check_aur_package_update(self, pkg: ArchPackage, installed_data: dict, api_data: dict) -> bool:
|
def _check_aur_package_update(self, pkg: ArchPackage, installed_data: dict, api_data: dict) -> bool:
|
||||||
if pkg.last_modified is None: # if last_modified is not available, then the install_date will be used instead
|
if pkg.last_modified is None: # if last_modified is not available, then the install_date will be used instead
|
||||||
install_date = installed_data.get('install_date')
|
install_date = installed_data.get('install_date')
|
||||||
@@ -1322,9 +1326,13 @@ class ArchManager(SoftwareManager):
|
|||||||
else:
|
else:
|
||||||
instances = None
|
instances = None
|
||||||
|
|
||||||
|
provided_by_uninstalled = pacman.map_provided(pkgs=to_uninstall)
|
||||||
|
|
||||||
uninstalled = self._uninstall_pkgs(to_uninstall, context.root_password, context.handler, ignore_dependencies=skip_requirements)
|
uninstalled = self._uninstall_pkgs(to_uninstall, context.root_password, context.handler, ignore_dependencies=skip_requirements)
|
||||||
|
|
||||||
if uninstalled:
|
if uninstalled:
|
||||||
|
self._remove_uninstalled_from_context(provided_by_uninstalled, context)
|
||||||
|
|
||||||
if disk_loader: # loading package instances in case the uninstall succeeds
|
if disk_loader: # loading package instances in case the uninstall succeeds
|
||||||
if instances:
|
if instances:
|
||||||
for p in instances:
|
for p in instances:
|
||||||
@@ -1395,6 +1403,22 @@ class ArchManager(SoftwareManager):
|
|||||||
self._update_progress(context, 100)
|
self._update_progress(context, 100)
|
||||||
return uninstalled
|
return uninstalled
|
||||||
|
|
||||||
|
def _remove_uninstalled_from_context(self, provided_by_uninstalled: Dict[str, Set[str]], context: TransactionContext):
|
||||||
|
if context.provided_map and provided_by_uninstalled: # updating the current provided context
|
||||||
|
for name, provided in provided_by_uninstalled.items():
|
||||||
|
if name in context.provided_map:
|
||||||
|
del context.provided_map[name]
|
||||||
|
|
||||||
|
if provided:
|
||||||
|
for exp in provided:
|
||||||
|
exp_provided = context.provided_map.get(exp)
|
||||||
|
|
||||||
|
if exp_provided and name in exp_provided:
|
||||||
|
exp_provided.remove(name)
|
||||||
|
|
||||||
|
if not exp_provided:
|
||||||
|
del context.provided_map[exp]
|
||||||
|
|
||||||
def uninstall(self, pkg: ArchPackage, root_password: str, watcher: ProcessWatcher, disk_loader: DiskCacheLoader) -> TransactionResult:
|
def uninstall(self, pkg: ArchPackage, root_password: str, watcher: ProcessWatcher, disk_loader: DiskCacheLoader) -> TransactionResult:
|
||||||
self.aur_client.clean_caches()
|
self.aur_client.clean_caches()
|
||||||
|
|
||||||
@@ -1703,6 +1727,8 @@ class ArchManager(SoftwareManager):
|
|||||||
|
|
||||||
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, skip_requirements=skip_requirements)
|
remove_unneeded=False, skip_requirements=skip_requirements)
|
||||||
|
|
||||||
|
|
||||||
context.restabilish_progress()
|
context.restabilish_progress()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@@ -1789,7 +1815,11 @@ class ArchManager(SoftwareManager):
|
|||||||
|
|
||||||
if len(pkgnames) != len(pkg_repos): # checking if any dep not found in the distro repos are from AUR
|
if len(pkgnames) != len(pkg_repos): # checking if any dep not found in the distro repos are from AUR
|
||||||
norepos = {p for p in pkgnames if p not in pkg_repos}
|
norepos = {p for p in pkgnames if p not in pkg_repos}
|
||||||
for pkginfo in self.aur_client.get_info(norepos):
|
|
||||||
|
aur_info = self.aur_client.get_info(norepos)
|
||||||
|
|
||||||
|
if aur_info:
|
||||||
|
for pkginfo in aur_info:
|
||||||
if pkginfo.get('Name') in norepos:
|
if pkginfo.get('Name') in norepos:
|
||||||
pkg_repos[pkginfo['Name']] = 'aur'
|
pkg_repos[pkginfo['Name']] = 'aur'
|
||||||
|
|
||||||
@@ -2384,7 +2414,7 @@ class ArchManager(SoftwareManager):
|
|||||||
if context.pkg and context.pkg.maintainer:
|
if context.pkg and context.pkg.maintainer:
|
||||||
pkg_maintainer = context.pkg.maintainer
|
pkg_maintainer = context.pkg.maintainer
|
||||||
elif context.repository == 'aur':
|
elif context.repository == 'aur':
|
||||||
aur_infos = self.aur_client.get_info({context.name})
|
aur_infos = self.aur_client.get_info((context.name,))
|
||||||
pkg_maintainer = aur_infos[0].get('Maintainer') if aur_infos else None
|
pkg_maintainer = aur_infos[0].get('Maintainer') if aur_infos else None
|
||||||
else:
|
else:
|
||||||
pkg_maintainer = context.repository
|
pkg_maintainer = context.repository
|
||||||
@@ -3482,7 +3512,7 @@ class ArchManager(SoftwareManager):
|
|||||||
|
|
||||||
self.aur_client.clean_caches()
|
self.aur_client.clean_caches()
|
||||||
|
|
||||||
apidatas = self.aur_client.get_info({pkg.name})
|
apidatas = self.aur_client.get_info((pkg.name,))
|
||||||
|
|
||||||
if not apidatas:
|
if not apidatas:
|
||||||
watcher.show_message(title=self.i18n['error'],
|
watcher.show_message(title=self.i18n['error'],
|
||||||
|
|||||||
@@ -264,6 +264,9 @@ class DependenciesAnalyser:
|
|||||||
aur_search = self.aur_client.search(dep_name)
|
aur_search = self.aur_client.search(dep_name)
|
||||||
|
|
||||||
if aur_search:
|
if aur_search:
|
||||||
|
aur_results = aur_search.get('results')
|
||||||
|
|
||||||
|
if aur_results:
|
||||||
if dep_name == dep_exp:
|
if dep_name == dep_exp:
|
||||||
version_required, exp_op = None, None
|
version_required, exp_op = None, None
|
||||||
else:
|
else:
|
||||||
@@ -271,8 +274,7 @@ class DependenciesAnalyser:
|
|||||||
version_required = split_informed_dep[2]
|
version_required = split_informed_dep[2]
|
||||||
exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '=='
|
exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '=='
|
||||||
|
|
||||||
for pkgname, pkgdata in self.aur_client.gen_updates_data(
|
for pkgname, pkgdata in self.aur_client.gen_updates_data((aur_res['Name'] for aur_res in aur_results)):
|
||||||
(aur_res['Name'] for aur_res in aur_search['results'])):
|
|
||||||
if pkgname == dep_name or (dep_name in pkgdata['p']):
|
if pkgname == dep_name or (dep_name in pkgdata['p']):
|
||||||
try:
|
try:
|
||||||
if not version_required or match_required_version(pkgdata['v'], exp_op,
|
if not version_required or match_required_version(pkgdata['v'], exp_op,
|
||||||
@@ -382,6 +384,7 @@ class DependenciesAnalyser:
|
|||||||
raise PackageNotFoundException(dep_exp)
|
raise PackageNotFoundException(dep_exp)
|
||||||
|
|
||||||
def _fill_aur_updates_data(self, pkgnames: Iterable[str], output_data: dict):
|
def _fill_aur_updates_data(self, pkgnames: Iterable[str], output_data: dict):
|
||||||
|
if pkgnames:
|
||||||
for pkgname, pkgdata in self.aur_client.gen_updates_data(pkgnames):
|
for pkgname, pkgdata in self.aur_client.gen_updates_data(pkgnames):
|
||||||
output_data[pkgname] = pkgdata
|
output_data[pkgname] = pkgdata
|
||||||
|
|
||||||
@@ -516,9 +519,6 @@ class DependenciesAnalyser:
|
|||||||
if repo_providers_data:
|
if repo_providers_data:
|
||||||
deps_data.update(repo_providers_data)
|
deps_data.update(repo_providers_data)
|
||||||
|
|
||||||
for pkgname, pkgdata in self.aur_client.gen_updates_data(aur_providers_no_data):
|
|
||||||
deps_data[pkgname] = pkgdata
|
|
||||||
|
|
||||||
if aur_data_filler:
|
if aur_data_filler:
|
||||||
aur_data_filler.join()
|
aur_data_filler.join()
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class TransactionStatusHandler(Thread):
|
|||||||
def gen_percentage(self) -> str:
|
def gen_percentage(self) -> str:
|
||||||
if self.percentage:
|
if self.percentage:
|
||||||
performed = self.downloading + self.upgrading + self.installing
|
performed = self.downloading + self.upgrading + self.installing
|
||||||
return '({0:.2f}%) '.format((performed / (2 * self.pkgs_to_sync)) * 100)
|
return f'({(performed / (2 * self.pkgs_to_sync)) * 100:.2f}%) '
|
||||||
else:
|
else:
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
@@ -52,18 +52,19 @@ class TransactionStatusHandler(Thread):
|
|||||||
if self.pkgs_to_remove > 0:
|
if self.pkgs_to_remove > 0:
|
||||||
self.removing += 1
|
self.removing += 1
|
||||||
|
|
||||||
self.watcher.change_substatus('[{}/{}] {} {}'.format(self.removing, self.pkgs_to_remove,
|
self.watcher.change_substatus(f"[{self.removing}/{self.pkgs_to_remove}] "
|
||||||
self.i18n['uninstalling'].capitalize(), output.split(' ')[1].strip()))
|
f"{self.i18n['uninstalling'].capitalize()} {output.split(' ')[1].strip()}")
|
||||||
else:
|
else:
|
||||||
self.watcher.change_substatus('{} {}'.format(self.i18n['uninstalling'].capitalize(), output_split[1].strip()))
|
self.watcher.change_substatus(f"{self.i18n['uninstalling'].capitalize()} {output_split[1].strip()}")
|
||||||
|
|
||||||
elif output_split[1].lower().startswith('downloading') and (not self.names or (n for n in self.names if output_split[0].startswith(n))):
|
elif len(output_split) >= 2 and output_split[1].lower().startswith('downloading') and (not self.names or (n for n in self.names if output_split[0].startswith(n))):
|
||||||
if self.downloading < self.pkgs_to_sync:
|
if self.downloading < self.pkgs_to_sync:
|
||||||
perc = self.gen_percentage()
|
perc = self.gen_percentage()
|
||||||
self.downloading += 1
|
self.downloading += 1
|
||||||
|
|
||||||
self.watcher.change_substatus('{}[{}/{}] {} {} {}'.format(perc, self.downloading, self.pkgs_to_sync, bold('[pacman]'),
|
self.watcher.change_substatus(f"{perc}[{self.downloading}/{self.pkgs_to_sync}] {bold('[pacman]')} "
|
||||||
self.i18n['downloading'].capitalize(), output_split[0].strip()))
|
f"{self.i18n['downloading'].capitalize()} {output_split[0].strip()}")
|
||||||
|
|
||||||
elif output_split[0].lower() == 'upgrading' and (not self.names or output_split[1].split('.')[0] in self.names):
|
elif output_split[0].lower() == 'upgrading' and (not self.names or output_split[1].split('.')[0] in self.names):
|
||||||
if self.get_performed() < self.pkgs_to_sync:
|
if self.get_performed() < self.pkgs_to_sync:
|
||||||
perc = self.gen_percentage()
|
perc = self.gen_percentage()
|
||||||
@@ -72,8 +73,9 @@ class TransactionStatusHandler(Thread):
|
|||||||
performed = self.upgrading + self.installing
|
performed = self.upgrading + self.installing
|
||||||
|
|
||||||
if performed <= self.pkgs_to_sync:
|
if performed <= self.pkgs_to_sync:
|
||||||
self.watcher.change_substatus('{}[{}/{}] {} {}'.format(perc, performed, self.pkgs_to_sync,
|
self.watcher.change_substatus(f"{perc}[{performed}/{self.pkgs_to_sync}] "
|
||||||
self.i18n['manage_window.status.upgrading'].capitalize(), output_split[1].strip()))
|
f"{self.i18n['manage_window.status.upgrading'].capitalize()} {output_split[1].strip()}")
|
||||||
|
|
||||||
elif output_split[0].lower() == 'installing' and (not self.names or output_split[1].split('.')[0] in self.names):
|
elif output_split[0].lower() == 'installing' and (not self.names or output_split[1].split('.')[0] in self.names):
|
||||||
if self.get_performed() < self.pkgs_to_sync:
|
if self.get_performed() < self.pkgs_to_sync:
|
||||||
perc = self.gen_percentage()
|
perc = self.gen_percentage()
|
||||||
@@ -82,15 +84,14 @@ class TransactionStatusHandler(Thread):
|
|||||||
performed = self.upgrading + self.installing
|
performed = self.upgrading + self.installing
|
||||||
|
|
||||||
if performed <= self.pkgs_to_sync:
|
if performed <= self.pkgs_to_sync:
|
||||||
self.watcher.change_substatus('{}[{}/{}] {} {}'.format(perc, performed, self.pkgs_to_sync,
|
self.watcher.change_substatus(f"{perc}[{performed}/{self.pkgs_to_sync}] "
|
||||||
self.i18n['manage_window.status.installing'].capitalize(),
|
f"{self.i18n['manage_window.status.installing'].capitalize()} {output_split[1].strip()}")
|
||||||
output_split[1].strip()))
|
|
||||||
else:
|
else:
|
||||||
substatus_found = False
|
substatus_found = False
|
||||||
lower_output = output.lower().strip()
|
lower_output = output.lower().strip()
|
||||||
for msg, key in self.accepted.items():
|
for msg, key in self.accepted.items():
|
||||||
if lower_output.startswith(msg):
|
if lower_output.startswith(msg):
|
||||||
self.watcher.change_substatus(self.i18n['arch.substatus.{}'.format(key)].capitalize())
|
self.watcher.change_substatus(self.i18n[f'arch.substatus.{key}'].capitalize())
|
||||||
substatus_found = True
|
substatus_found = True
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,14 @@ version: 1
|
|||||||
script:
|
script:
|
||||||
- rm -rf AppDir appimage-builder-cache *.AppImage *.zsync |true
|
- rm -rf AppDir appimage-builder-cache *.AppImage *.zsync |true
|
||||||
- mkdir -p AppDir/usr
|
- mkdir -p AppDir/usr
|
||||||
|
- mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
|
||||||
|
- mkdir -p AppDir/usr/share/applications
|
||||||
|
- wget https://github.com/vinifmor/bauh/archive/${BAUH_VERSION}.tar.gz || exit 1
|
||||||
|
- BAUH_SETUP_NO_REQS=1 pip3 install ${BAUH_VERSION}.tar.gz --prefix=/usr --root=AppDir || exit 1
|
||||||
|
- tar -xf ${BAUH_VERSION}.tar.gz || exit 1
|
||||||
|
- cd bauh-${BAUH_VERSION} || exit 1
|
||||||
|
- cp bauh/view/resources/img/logo.svg ../AppDir/usr/share/icons/hicolor/scalable/apps/bauh.svg || exit 1
|
||||||
|
- cp bauh/desktop/bauh.desktop ../AppDir/usr/share/applications || exit 1
|
||||||
|
|
||||||
|
|
||||||
AppDir:
|
AppDir:
|
||||||
@@ -24,31 +32,40 @@ AppDir:
|
|||||||
|
|
||||||
include:
|
include:
|
||||||
- python3
|
- python3
|
||||||
- python3-pip
|
|
||||||
- python3-setuptools
|
|
||||||
- python3-wheel
|
|
||||||
- python3-requests
|
- python3-requests
|
||||||
- python3-colorama
|
- python3-colorama
|
||||||
- python3-dateutil
|
- python3-dateutil
|
||||||
- python3-yaml
|
- python3-yaml
|
||||||
- python3-packaging
|
- python3-packaging
|
||||||
- python3-pyqt5
|
|
||||||
- python3-lxml
|
- python3-lxml
|
||||||
- python3-bs4
|
- python3-bs4
|
||||||
- sqlite3
|
- sqlite3
|
||||||
- axel
|
|
||||||
- aria2
|
|
||||||
- wget
|
- wget
|
||||||
- libfreetype6
|
# - libfreetype6
|
||||||
- libfontconfig1
|
# - libfontconfig1
|
||||||
exclude: []
|
exclude:
|
||||||
|
- dpkg
|
||||||
|
- apt
|
||||||
|
- aptitude
|
||||||
|
- python3-pip
|
||||||
|
- python3-setuptools
|
||||||
|
- python3-distutils
|
||||||
|
- libc-bin
|
||||||
|
- libc-dev-bin
|
||||||
|
- libc6
|
||||||
|
- libc6-dbg
|
||||||
|
- libc6-dev
|
||||||
|
|
||||||
after_bundle:
|
after_bundle:
|
||||||
- pip3 install bauh==$BAUH_VERSION --prefix=/usr --root=AppDir
|
- pip3 install pyqt5 --prefix=/usr --root=AppDir || exit 1
|
||||||
- mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
|
- cd AppDir/usr/lib/python3.8/site-packages/PyQt5/Qt5/plugins || exit 1
|
||||||
- cp AppDir/usr/lib/python3.8/site-packages/bauh/view/resources/img/logo.svg AppDir/usr/share/icons/hicolor/scalable/apps/bauh.svg
|
- rm -rf audio gamepad gamepads geoservices printsupport sceneparsers sensorgestures sensors sqldrivers texttospeech webview || exit 1
|
||||||
- mkdir -p AppDir/usr/share/applications
|
- cd ../
|
||||||
- cp AppDir/usr/lib/python3.8/site-packages/bauh/desktop/bauh.desktop AppDir/usr/share/applications
|
- cd lib/ || exit 1
|
||||||
|
- rm libQt5Bluetooth.so.5 libQt5Designer.so.5 libQt5Multimedia.so.5 libQt5MultimediaGstTools.so.5 libQt5MultimediaWidgets.so.5 || exit 1
|
||||||
|
- rm libQt5Quick3D.so.5 libQt5Quick3DAssetImport.so.5 libQt5Quick3DRender.so.5 libQt5Quick3DRuntimeRender.so.5 libQt5QuickTest.so.5 || exit 1
|
||||||
|
- rm libQt5Quick3DUtils.so.5 libQt5PrintSupport.so.5 libQt5SerialPort.so.5 libQt5Sql.so.5 libQt5Sensors.so.5 libQt5Test.so.5 libQt5WebView.so.5 || exit 1
|
||||||
|
|
||||||
|
|
||||||
runtime:
|
runtime:
|
||||||
version: "continuous"
|
version: "continuous"
|
||||||
5
setup.py
5
setup.py
@@ -14,7 +14,10 @@ URL = "https://github.com/vinifmor/" + NAME
|
|||||||
|
|
||||||
file_dir = os.path.dirname(os.path.abspath(__file__))
|
file_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
with open(file_dir + '/requirements.txt', 'r') as f:
|
if os.getenv('BAUH_SETUP_NO_REQS'):
|
||||||
|
requirements = []
|
||||||
|
else:
|
||||||
|
with open(f'{file_dir}/requirements.txt', 'r') as f:
|
||||||
requirements = [line.strip() for line in f.readlines() if line]
|
requirements = [line.strip() for line in f.readlines() if line]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user