[aur][feature] reading package categories

This commit is contained in:
Vinicius Moreira
2019-10-10 19:01:27 -03:00
parent 25ef3fd98a
commit cbc9080cb8
5 changed files with 58 additions and 7 deletions

View File

@@ -16,14 +16,19 @@ class HttpClient:
self.sleep = sleep self.sleep = sleep
self.logger = logger self.logger = logger
def get(self, url: str): def get(self, url: str, headers: dict = None):
cur_attempts = 1 cur_attempts = 1
while cur_attempts <= self.max_attempts: while cur_attempts <= self.max_attempts:
cur_attempts += 1 cur_attempts += 1
try: try:
res = self.session.get(url, timeout=self.timeout) args = {'timeout': self.timeout}
if headers:
args['headers'] = headers
res = self.session.get(url, **args)
if res.status_code == 200: if res.status_code == 200:
return res return res
@@ -41,8 +46,8 @@ class HttpClient:
self.logger.warning("Could not retrieve data from '{}'".format(url)) self.logger.warning("Could not retrieve data from '{}'".format(url))
def get_json(self, url: str): def get_json(self, url: str, headers: dict = None):
res = self.get(url) res = self.get(url, headers=headers)
return res.json() if res else None return res.json() if res else None
def get_content_length(self, url: str) -> str: def get_content_length(self, url: str) -> str:

View File

@@ -22,7 +22,7 @@ from bauh.gems.arch import BUILD_DIR, aur, pacman, makepkg, pkgbuild, message, c
from bauh.gems.arch.aur import AURClient from bauh.gems.arch.aur import AURClient
from bauh.gems.arch.mapper import ArchDataMapper from bauh.gems.arch.mapper import ArchDataMapper
from bauh.gems.arch.model import ArchPackage from bauh.gems.arch.model import ArchPackage
from bauh.gems.arch.worker import AURIndexUpdater, ArchDiskCacheUpdater, ArchCompilationOptimizer from bauh.gems.arch.worker import AURIndexUpdater, ArchDiskCacheUpdater, ArchCompilationOptimizer, CategoriesDownloader
URL_GIT = 'https://aur.archlinux.org/{}.git' URL_GIT = 'https://aur.archlinux.org/{}.git'
URL_PKG_DOWNLOAD = 'https://aur.archlinux.org/cgit/aur.git/snapshot/{}.tar.gz' URL_PKG_DOWNLOAD = 'https://aur.archlinux.org/cgit/aur.git/snapshot/{}.tar.gz'
@@ -51,6 +51,8 @@ class ArchManager(SoftwareManager):
self.logger = context.logger self.logger = context.logger
self.enabled = True self.enabled = True
self.arch_distro = context.distro == 'arch' self.arch_distro = context.distro == 'arch'
self.categories_downloader = CategoriesDownloader(context.http_client, context.logger)
self.categories_map = {}
def _upgrade_search_result(self, apidata: dict, installed_pkgs: dict, downgrade_enabled: bool, res: SearchResult, disk_loader: DiskCacheLoader): def _upgrade_search_result(self, apidata: dict, installed_pkgs: dict, downgrade_enabled: bool, res: SearchResult, disk_loader: DiskCacheLoader):
app = self.mapper.map_api_data(apidata, installed_pkgs['not_signed']) app = self.mapper.map_api_data(apidata, installed_pkgs['not_signed'])
@@ -117,6 +119,7 @@ class ArchManager(SoftwareManager):
for pkgdata in pkgsinfo: for pkgdata in pkgsinfo:
pkg = self.mapper.map_api_data(pkgdata, not_signed) pkg = self.mapper.map_api_data(pkgdata, not_signed)
pkg.downgrade_enabled = downgrade_enabled pkg.downgrade_enabled = downgrade_enabled
pkg.categories = self.categories_map.get(pkg.name)
if disk_loader: if disk_loader:
disk_loader.fill(pkg) disk_loader.fill(pkg)
@@ -133,6 +136,8 @@ class ArchManager(SoftwareManager):
pkg = ArchPackage(name=name, version=data.get('version'), pkg = ArchPackage(name=name, version=data.get('version'),
latest_version=data.get('version'), description=data.get('description'), latest_version=data.get('version'), description=data.get('description'),
installed=True, mirror='aur') installed=True, mirror='aur')
pkg.categories = self.categories_map.get(pkg.name)
pkg.downgrade_enabled = downgrade_enabled pkg.downgrade_enabled = downgrade_enabled
if disk_loader: if disk_loader:
@@ -685,6 +690,7 @@ class ArchManager(SoftwareManager):
self.dcache_updater.start() self.dcache_updater.start()
self.comp_optimizer.start() self.comp_optimizer.start()
self.aur_index_updater.start() self.aur_index_updater.start()
self.categories_map = self.categories_downloader.get_categories()
def list_updates(self, internet_available: bool) -> List[PackageUpdate]: def list_updates(self, internet_available: bool) -> List[PackageUpdate]:
installed = self.read_installed(disk_loader=None, internet_available=internet_available).installed installed = self.read_installed(disk_loader=None, internet_available=internet_available).installed

View File

@@ -5,10 +5,14 @@ import time
from math import ceil from math import ceil
from multiprocessing import Process from multiprocessing import Process
from threading import Thread from threading import Thread
from typing import Dict, List
import requests
from bauh.api.abstract.context import ApplicationContext from bauh.api.abstract.context import ApplicationContext
from bauh.api.abstract.controller import SoftwareManager from bauh.api.abstract.controller import SoftwareManager
from bauh.api.constants import HOME_PATH from bauh.api.constants import HOME_PATH
from bauh.api.http import HttpClient
from bauh.gems.arch import pacman, disk from bauh.gems.arch import pacman, disk
URL_INDEX = 'https://aur.archlinux.org/packages.gz' URL_INDEX = 'https://aur.archlinux.org/packages.gz'
@@ -128,3 +132,29 @@ class ArchCompilationOptimizer(Thread if bool(os.getenv('BAUH_DEBUG', 0)) else P
self.logger.info("A custom optimized 'makepkg.conf' was generated at '{}'".format(HOME_PATH)) self.logger.info("A custom optimized 'makepkg.conf' was generated at '{}'".format(HOME_PATH))
else: else:
self.logger.warning("A custom 'makepkg.conf' is already defined at '{}'".format(HOME_PATH)) self.logger.warning("A custom 'makepkg.conf' is already defined at '{}'".format(HOME_PATH))
class CategoriesDownloader:
URL_CATEGORIES_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/aur/categories.txt'
def __init__(self, http_client: HttpClient, logger: logging.Logger):
self.http_client = http_client
self.logger = logger
def get_categories(self) -> Dict[str, List[str]]:
self.logger.info('Downloading AUR category definitions from {}'.format(self.URL_CATEGORIES_FILE))
res = self.http_client.get(self.URL_CATEGORIES_FILE, headers={'Authorization': 'token {}'.format(os.getenv('GITHUB_TOKEN'))})
if res:
categories_map = {}
for l in res.text.split('\n'):
if l:
data = l.split('=')
categories_map[data[0]] = [c.strip() for c in data[1].split(',') if c]
self.logger.info('Loaded categories for {} AUR packages'.format(len(categories_map)))
return categories_map
else:
self.logger.info('Could not download {}'.format(self.URL_CATEGORIES_FILE))

View File

@@ -142,3 +142,7 @@ utility=utilidad
terminalemulator=terminal terminalemulator=terminal
database=base de datos database=base de datos
databases=bases de datos databases=bases de datos
movies=películas
movie=película
library=biblioteca
books=libros

View File

@@ -142,3 +142,9 @@ utility=utilidade
terminalemulator=terminal terminalemulator=terminal
database=banco de dados database=banco de dados
databases=bancos de dados databases=bancos de dados
text editor=editor de texto
movies=filmes
movie=filme
media=mídia
library=biblioteca
books=livros