81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
|
# KTO ArchRepo update script
|
||
|
# version 2.0
|
||
|
|
||
|
# The purpose of this script is to automate the maintenance of a custom pacman (Arch Linux) repository, whose goal is to
|
||
|
# provide already built packages of AUR software.
|
||
|
|
||
|
# This version 2 aims at 2 major evolutions:
|
||
|
# * manage dependencies (hence Python and object-oriented programming);
|
||
|
# * run this script in a stateless Arch container, rather than a full VM as in version 1.
|
||
|
# Additionaly, we may like to manage working directory in a better way (check available storage space, and existing
|
||
|
# directories).
|
||
|
|
||
|
# This script should NOT be run as root. Or should it?
|
||
|
# * We are in a stateless container, but I don't think we can run makepkg as root...
|
||
|
|
||
|
# Imports
|
||
|
import os
|
||
|
|
||
|
# Class for AUR package
|
||
|
class Package:
|
||
|
def __init__(self, name):
|
||
|
self.name = name
|
||
|
# + version, dependencies (which should contain version as well)
|
||
|
|
||
|
def parseDb(db_path):
|
||
|
# here we should use AWK to parse our repo database file and populate the collection a collection of packages to build
|
||
|
# that we then return
|
||
|
|
||
|
def checkUpdates(packages_to_build): # or checkDependencies?
|
||
|
# here we should check for all packages in packages_to_build if they need an update and:
|
||
|
# * remove those which do not from the collection
|
||
|
# * check (recursively) for all these packages_to_build if they have dependencies
|
||
|
# * if AUR dependencies, add them to this collection
|
||
|
# * if Arch dependencies, add them to another collection arch_packages_to_install
|
||
|
|
||
|
def installArchPackages(packages):
|
||
|
# packages is a collection of packages (objects or names?) to install
|
||
|
os.system("sudo pacman -Syu " + packages.toSpaceString()) # [].toSpaceString() being to define...
|
||
|
|
||
|
def buildAurPackage(package):
|
||
|
# Fetch package (git clone)
|
||
|
# cd to directory
|
||
|
os.system("makepkg -s --no-confirm --no-progress-bar")
|
||
|
|
||
|
def addPackageToRepo(package, repo):
|
||
|
os.system("cp...")
|
||
|
os.system("repo-add...")
|
||
|
|
||
|
def sortByDependencies():
|
||
|
# packages_to_build should be sorted by dependencies here
|
||
|
# packages that are dependencies should be tagged adequately
|
||
|
|
||
|
def init():
|
||
|
# Check for main dependencies:
|
||
|
deps = ['git', 'awk', 'package-query']
|
||
|
installArchPackages(deps)
|
||
|
|
||
|
# This function is a "main" function
|
||
|
def updateRepo():
|
||
|
init()
|
||
|
packages_to_build = parseDb(db_path)
|
||
|
checkUpdates() # ideally, this should directly edit packages_to_build AND arch_packages_to_install (I believe we can return tuples in Python)
|
||
|
installArchPackages(arch_packages_to_install)
|
||
|
sortByDependencies()
|
||
|
for package in packages_to_build:
|
||
|
buildAurPackage(package)
|
||
|
addPackageToRepo(package, repo)
|
||
|
if package.isDependency:
|
||
|
installArchPackages([package])
|
||
|
|
||
|
def newPackage(package):
|
||
|
init()
|
||
|
checkUpdates([package])
|
||
|
installArchPackages(arch_packages_to_install)
|
||
|
sortByDependencies()
|
||
|
for package in packages_to_build:
|
||
|
buildAurPackage(package)
|
||
|
addPackageToRepo(package, repo)
|
||
|
if package.isDependency:
|
||
|
installArchPackages([package])
|