From b98887e1a4f044e13ba15a09486f615672ba472a Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 19 Sep 2024 15:23:25 +0200 Subject: can read package list from the AUR, also checking if missing pacakges have been dropped to the AUR --- bin/check | 13 +++++- bin/setup | 7 ++++ bin/update | 131 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 124 insertions(+), 27 deletions(-) (limited to 'bin') diff --git a/bin/check b/bin/check index 9e187cf..3acb635 100755 --- a/bin/check +++ b/bin/check @@ -15,11 +15,13 @@ fi find "${state_dir}"/{core,extra}-{any,x86_64} -type f > /tmp/update_packages.$$ nof_packages=`cat /tmp/update_packages.$$ | wc -l` +nof_aur_packages=`wc -l ${aur_state_dir}/packages | cut -f 1 -d ' '` nof_checked_out_packages=`find "${packages_dir}" -type f -name PKGBUILD | wc -l` echo "${nof_packages} packages in state repo" echo "${nof_checked_out_packages} packages are checked out" +echo "${nof_aur_packages} packages in AUR" > "${data_dir}/stats" echo "packages_state\t${nof_packages}" >> "${data_dir}/stats" @@ -43,9 +45,18 @@ done > "${data_dir}/missing_state_file" for pkgfile in `find "${packages_dir}" -type f -name PKGBUILD`; do repo_in_pkgfile=`echo $pkgfile | rev | cut -f 2-3 -d / | rev` + pkgname_in_pkgfile=`echo $pkgfile | rev | cut -f 2 -d / | rev` state_file="${state_dir}/${repo_in_pkgfile}" if test ! -f "${state_file}"; then - echo "${repo_in_pkgfile}\tnot in state repo anymore" >> "${data_dir}/missing_state_file" + grep "^${pkgname_in_pkgfile}$" "${aur_state_dir}/packages" 2>&1 >/dev/null + if test $? = 0; then + state='missing' + aur_state="${pkgname_in_pkgfile}" + else + state='missing' + aur_state='missing' + fi + echo "${repo_in_pkgfile}\t${state}\t${aur_state}" >> "${data_dir}/missing_state_file" fi done nof_missing_state_files=`cat ${data_dir}/missing_state_file | wc -l` diff --git a/bin/setup b/bin/setup index 150e168..fcb8c87 100755 --- a/bin/setup +++ b/bin/setup @@ -41,4 +41,11 @@ else echo "data directory exists" fi +if test ! -d "${aur_state_dir}"; then + echo "no AUR state information directory exists.. creating it.." + mkdir "${aur_state_dir}" +else + echo "AUR state information directory exists." +fi + # TODO: AUR directory diff --git a/bin/update b/bin/update index 7be65a1..99fea78 100755 --- a/bin/update +++ b/bin/update @@ -3,6 +3,54 @@ BASE="${0%/*}/.." . "${BASE}/conf/default.conf" +UPATE_UPSTREAM=0 +UPDATE_AUR=0 +STATS=0 +OPTIONS=`getopt -n update -o huas -l help,upstream,aur,stats -- "$@"` +if test $? != 0; then + echo "ERROR: internal error which using getopt.." >&2; + exit 1 +fi +eval set -- "$OPTIONS" +while true; do + case "$1" in + -h|--help) + echo "update [options]" + echo "" + echo "-u --upstream update from update git state and package repo" + echo "-a --aur update from the AUR" + echo "-s --stats compute and print statistics" + exit 0 + ;; + + -u|--uptream) + UPDATE_UPSTREAM=1 + shift + ;; + + -a|--aur) + UPDATE_AUR=1 + shift + ;; + + -s|--status) + STATS=1 + shift + ;; + + --) + shift + break + ;; + + *) + echo "ERROR: Internal error in getopt" >&2 + exit 1 + esac +done + +shift `expr $OPTIND - 1` + if test ! -d "${state_dir}"; then echo "no upstream git state repo of packages.. exiting.." exit 1 @@ -13,38 +61,69 @@ if test ! -d "${packages_dir}"; then exit 1 fi -echo "Updating main state git repo.." +if test ! -d "${aur_state_dir}"; then + echo "no AUR state directory exists of .. exiting.." + exit 1 +fi + +if test "${UPDATE_UPSTREAM}" = 1; then + echo "Updating main state git repo.." + + git -C "${state_dir}" pull -git -C "${state_dir}" pull + if test "${STATS}" = 1; then + echo "Checking statistics.." -echo "Checking statistics.." + find "${state_dir}"/{core,extra}-{any,x86_64} -type f > /tmp/update_packages.$$ + nof_packages=`cat /tmp/update_packages.$$ | wc -l` + nof_checked_out_packages=`find "${packages_dir}" -type f -name PKGBUILD | wc -l` -find "${state_dir}"/{core,extra}-{any,x86_64} -type f > /tmp/update_packages.$$ -nof_packages=`cat /tmp/update_packages.$$ | wc -l` + echo "${nof_packages} packages in state repo" + echo "${nof_checked_out_packages} packages are checked out" -nof_checked_out_packages=`find "${packages_dir}" -type f -name PKGBUILD | wc -l` + sleep 10 + fi -echo "${nof_packages} packages in state repo" -echo "${nof_checked_out_packages} packages are checked out" + for pkgfile in `cat /tmp/update_packages.$$`; do + repo=`echo "${pkgfile}" | rev | cut -f 2 -d / | rev` + OLDIFS="$IFS" + IFS=" " + while read pkgname pkgver tag revision; do + echo "${repo} ${pkgname}" + if test ! -d "${packages_dir}/${repo}/${pkgname}"; then + cd "${packages_dir}/${repo}" || exit 1 + pkgctl repo clone --protocol=https "${pkgname}" + sleep 10 + else + true +# TODO: find a way to find out whether the reference revision is in out +# current state repo and update only when we miss it. We can still +# do a full update when we need it, but here it just creates a lot +# of load.. +# git -C "${packages_dir}/${repo}/${pkgname}" pull + fi + done < $pkgfile + IFS="$OLDIFS" + done +fi -sleep 10 +if test "${UPDATE_AUR}" = 1; then + echo "Updating AUR state.." + + rm -f "${aur_state_dir}/packages" + wget --quiet -O "${aur_state_dir}/packages.gz" https://aur.archlinux.org/packages.gz + gunzip "${aur_state_dir}/packages.gz" + + if test "${STATS}" = 1; then + echo "Checking statistics.." + + nof_aur_packages=`wc -l ${aur_state_dir}/packages | cut -f 1 -d ' '` + + echo "${nof_aur_packages} packages in AUR" + + sleep 10 + fi +fi -for pkgfile in `cat /tmp/update_packages.$$`; do - repo=`echo "${pkgfile}" | rev | cut -f 2 -d / | rev` - OLDIFS="$IFS" - IFS=" " - while read pkgname pkgver tag revision; do - echo "${repo} ${pkgname}" - if test ! -d "${packages_dir}/${repo}/${pkgname}"; then - cd "${packages_dir}/${repo}" || exit 1 - pkgctl repo clone --protocol=https "${pkgname}" - sleep 10 - else - true -# git -C "${packages_dir}/${repo}/${pkgname}" pull - fi - done < $pkgfile - IFS="$OLDIFS" -done # TODO: update all single package directories # TODO: update all AUR package directories -- cgit v1.2.3-70-g09d2