2016-07-25 12:25:05 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import os
2016-07-25 12:31:31 +02:00
import pyalpm
2016-07-25 12:25:05 +02:00
from arch import ArchDatabase , ArchPackage
2021-09-21 23:51:25 +02:00
from aur import AURPackage , AURLoader
2016-07-25 12:25:05 +02:00
class Styling :
""" Output styling constants. """
2016-07-26 22:51:12 +02:00
ENDC = ' \x1b [0m '
BOLD = ' \x1b [1m '
UPTODATE = ' \x1b [38;2;0;200;0m '
NEEDS_UPDATE = ' \x1b [38;2;200;0;0m '
FLAGGED = ' \x1b [38;2;200;200;0m '
NEEDS_DOWNGRADE = ' \x1b [38;2;0;0;200m '
2017-04-22 10:56:24 +02:00
DELETED = ' \x1b [38;2;200;0;0m '
2016-07-26 22:51:12 +02:00
URL = ' \x1b [38;2;200;200;200m '
2016-07-25 12:25:05 +02:00
class AURChecker :
"""
Read local Arch Linux package databases / repositories and compare the
version of each containing package against the AUR package with the same
name to determine and print a status for each package .
"""
STATUS_UPTODATE = " uptodate "
STATUS_NEEDS_UPDATE = " needs update "
STATUS_NEEDS_DOWNGRADE = " needs downgrade "
2017-04-22 10:56:24 +02:00
STATUS_DELETED = " deleted "
2016-07-25 12:25:05 +02:00
def check ( directory ) :
""" Check all databases/repositories in a directory. """
databases = ArchDatabase . find_databases ( directory )
for database in databases :
AURChecker . check_database ( database )
def check_database ( database ) :
""" Check a database/repository. """
print ( Styling . BOLD + " # repository {} " . format ( database . get_name ( ) ) + Styling . ENDC )
2021-09-21 23:51:25 +02:00
# Load AUR data
aur_data = AURLoader . load_package_data ( [ p . get_name ( ) for p in database . get_packages ( ) ] )
# Convert AUR data to AUR packages
aur_packages = { }
for values in aur_data :
aur_package = AURChecker . create_aur_package ( values )
aur_packages [ aur_package . get_name ( ) ] = aur_package
# Compare database packages with AUR packages
2016-07-25 12:25:05 +02:00
for package in database . get_packages ( ) :
2022-10-25 12:09:52 +02:00
status_messages = { }
if package . get_name ( ) in aur_packages :
aur_package = aur_packages [ package . get_name ( ) ]
2017-04-22 10:56:24 +02:00
status = AURChecker . compare ( package , aur_package )
2022-10-25 12:09:52 +02:00
status_messages [ AURChecker . STATUS_UPTODATE ] = Styling . UPTODATE + " up-do-date " + Styling . ENDC
status_messages [ AURChecker . STATUS_NEEDS_UPDATE ] = Styling . NEEDS_UPDATE + " needs update to {} \n " . format ( aur_package . get_version ( ) ) + Styling . URL + " {} {} " . format ( AURLoader . AUR_URL , aur_package . get_url_path ( ) ) + Styling . ENDC
status_messages [ AURChecker . STATUS_NEEDS_DOWNGRADE ] = Styling . NEEDS_DOWNGRADE + " local is newer " + Styling . ENDC
2017-04-22 10:56:24 +02:00
else :
status = AURChecker . STATUS_DELETED
2022-10-25 12:09:52 +02:00
status_messages [ AURChecker . STATUS_DELETED ] = Styling . DELETED + " deleted " + Styling . ENDC
2016-07-25 12:25:05 +02:00
message = " – {} {} : {} " . format ( package . get_name ( ) , package . get_version ( ) , status_messages [ status ] )
2021-09-21 23:51:25 +02:00
if aur_package and aur_package . get_out_of_date ( ) :
2016-07-25 12:25:05 +02:00
message = Styling . FLAGGED + " {} (flagged) " . format ( message ) + Styling . ENDC
print ( message )
def compare ( package , aur_package ) :
""" Compare package two versions and return status. """
2016-07-25 12:31:31 +02:00
result = pyalpm . vercmp ( package . get_version ( ) , aur_package . get_version ( ) )
2016-07-25 12:25:05 +02:00
if result < 0 :
return AURChecker . STATUS_NEEDS_UPDATE
elif result > 0 :
return AURChecker . STATUS_NEEDS_DOWNGRADE
else :
return AURChecker . STATUS_UPTODATE
2021-09-21 23:51:25 +02:00
def create_aur_package ( values ) :
aur_package = AURPackage ( values [ ' Name ' ] )
aur_package . set_version ( values [ ' Version ' ] )
aur_package . set_desc ( values [ ' Description ' ] )
aur_package . set_url ( values [ ' URL ' ] )
aur_package . set_license ( values [ ' License ' ] )
aur_package . set_maintainer ( values [ ' Maintainer ' ] )
aur_package . set_votes ( values [ ' NumVotes ' ] )
aur_package . set_url_path ( values [ ' URLPath ' ] )
aur_package . set_package_base ( values [ ' PackageBase ' ] )
aur_package . set_out_of_date ( values [ ' OutOfDate ' ] )
aur_package . set_last_modified ( values [ ' LastModified ' ] )
return aur_package
2016-07-25 12:25:05 +02:00
if __name__ == " __main__ " :
parser = argparse . ArgumentParser ( " Read local Arch Linux package databases/repositories and compare the version of each containing package against the AUR package with the same name to determine and print a status for each package. " )
parser . add_argument ( ' folder ' , help = " source folder containing one or several databases/repositories (subdirectories possible) " )
args = parser . parse_args ( )
AURChecker . check ( args . folder )