mkpk

Систем за управљање пакетима који користи mk из система Plan9
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 8189aceae18dd47a8e524258dc86655427f42483
родитељ 97763f05fb7a1bd1aa0c93e47efc6f0dd017e1a5
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu,  4 Aug 2022 11:30:58 +0200

recent: Take list of versions from stdin, output most recent version on stdout; modify lib/*.mk to use recent

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
MTODO | 16+++++++++++-----
Mlib/build.mk | 10++++------
Mlib/install.mk | 10+++++-----
Mlib/listfiles.mk | 6++++--
Mlib/package.mk | 22+++++++++++-----------
Mlib/uninstall.mk | 6++++--
Mrecent | 112+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Dtestrecent | 12------------
измењених датотека: 8, додавања: 106(+), брисања: 88(-)

diff --git a/TODO b/TODO @@ -1,20 +1,26 @@ TODO ==== -[ ] More accurately locate packages based on name (currently, "gcc" refers also +[x] More accurately locate packages based on name (currently, "gcc" refers also to eg. directory "gcc-mlfs" if it happens to be under /src); keep fetched packages in a separate database? - Usage scenarios: 1. Packages from galeb-mkfiles 2. Custom local packages - - Version comparison? - Yes. Build only the latest package, if version is - not explicitly given + - Version comparison? + - Yes. Build only the latest package, if version is + not explicitly given + - Not implementing "explicitly given" part for now (TODO) -[ ] Improve recent so it takes a list of versions like testrecent; add calling +[x] Improve recent so it takes a list of versions like testrecent; add calling of recent to lib/*.mk [ ] mkpk fetch [x] mkpk update -[ ] Install dependencies (it would call `mk -f $mkpklib/install.mk`) +< > Install dependencies (it would call `mk -f $mkpklib/install.mk`) + - It would need dependencies db or dependencies file with the mkfiles; maybe + just a variable + +< > Implement explicitely passing version as a parameter diff --git a/lib/build.mk b/lib/build.mk @@ -1,16 +1,14 @@ <$mkpklib/defaults.mk build-package:V: - set -x - found=$(find ${SRCBASEDIR} -type d -name "${PKGBASE}-*" | \ - sed "/.*\/${PKGBASE}-[0-9]\+/{p;te};d;:e" | \ - sort -n -r -t- -k1,1 | sed 1q) - set +x - if [ -z "${found}" ]; then + recentver=$(find ${SRCBASEDIR} -type d -prune -name "${PKGBASE}-*" | \ + sed 's,\([^0-9]\+[^-]-\)\+\([0-9].*\),\2,' | recent) + if [ -z "${recentver}" ]; then printf "Directory %s does not exist (try fetch?)" \ "${PKGBASE}" >&2 exit 1 fi + found=${PKGBASE}-${recentver} cp -R "${SRCMKFILES}/${PKGBASE}"/* "${found}/" cd "${found}" "${MK}" package-install diff --git a/lib/install.mk b/lib/install.mk @@ -1,20 +1,20 @@ <$mkpklib/defaults.mk install-package:QV: - pkg=$(find "${PKGDIR}" -name "${PKGBASE}-*.tar.xz" | sed 1q) - if [ -z "${pkg}" ]; then + recentver=$(find ${PKGDIR} -type f -prune -name "${PKGBASE}-*" | \ + sed 's,\([^0-9]\+[^-]-\)\+\([0-9].*\)\.tar\.xz,\2,' | recent) + if [ -z "${recentver}" ]; then printf "Cannot find package %s\n" "${PKGBASE}" >&2 exit 1 elif [ -n "$(grep "^${PKGBASE}\t" "${PKGDB}" 2>/dev/null)" ]; then printf "Package %s already installed\n" "${PKGBASE}" >&2 exit 1 else + pkg=${PKGBASE}-${recentver}.tar.xz cd / printf " TAR\t%s\n" "${pkg}" xz -dc "${pkg}" | tar -xf - 2>/dev/null printf " UPD\t%s\n" "${PKGDB}" - printf "%s\t%s\t%s\n" "${PKGBASE}" \ - "$(echo "${pkg}" | \ - sed "s,.*/${PKGBASE}-,,;s,\.tar\.xz\$,,")" \ + printf "%s\t%s\t%s\n" "${PKGBASE}" "${recentver}" \ "$(date +'%Y-%m-%d %T')" >>"${PKGDB}" fi diff --git a/lib/listfiles.mk b/lib/listfiles.mk @@ -1,9 +1,11 @@ <$mkpklib/defaults.mk listfiles:QV: - pkg=$(find "$PKGDIR" -name "$PKGBASE-*.tar.xz" | sed 1q) - if [ -z "${pkg}" ]; then + recentver=$(find ${PKGDIR} -type f -prune -name "${PKGBASE}-*" | \ + sed 's,\([^0-9]\+[^-]-\)\+\([0-9].*\)\.tar\.xz,\2,' | recent) + if [ -z "${recentver}" ]; then printf "Cannot find package %s" "$PKGBASE" >&2 else + pkg=${PKGBASE}-${recentver}.tar.xz xz -dc "${pkg}" | tar -tf - fi diff --git a/lib/package.mk b/lib/package.mk @@ -1,20 +1,20 @@ package:QV: printf " MK\t%s\n" "clean" - $MK clean >/dev/null + "${MK}" clean >/dev/null printf " MK\t%s\n" "DESTDIR=pkgroot install" - $MK DESTDIR=pkgroot install >/dev/null + "${MK}" DESTDIR=pkgroot install >/dev/null printf " PROOT\t%s\n" pkgroot - $PROOT -r pkgroot -0 -b /bin/tar -b /bin/xz -b /etc -w / tar -cJnf \ - $PKG.tar.xz $(cd pkgroot; find . | sort | uniq | \ + "${PROOT}" -r pkgroot -0 -b /bin/tar -b /bin/xz -b /etc -w / tar -cJnf \ + ${PKG}.tar.xz $(cd pkgroot; find . | sort | uniq | \ sed 's,^\./,,;s,^\.$,,') - printf " MV\t%s\n" $PKG.tar.xz - mv pkgroot/$PKG.tar.xz . - $SHA512SUM $PKG.tar.xz > $PKG.sha512 + printf " MV\t%s\n" ${PKG}.tar.xz + mv pkgroot/${PKG}.tar.xz . + "${SHA512SUM}" ${PKG}.tar.xz > ${PKG}.sha512 printf " RM\t%s\n" pkgroot rm -rf pkgroot package-install:QV: package - printf " INST\t%s\n" $PKG.tar.xz - $INSTALL -Dm0644 $PKG.tar.xz $PKGDIR/$PKG.tar.xz - printf " INST\t%s\n" $PKG.sha512 - $INSTALL -Dm0644 $PKG.sha512 $PKGDIR/$PKG.sha512 + printf " INST\t%s\n" ${PKG}.tar.xz + "${INSTALL}" -Dm0644 ${PKG}.tar.xz ${PKGDIR}/${PKG}.tar.xz + printf " INST\t%s\n" ${PKG}.sha512 + "${INSTALL}" -Dm0644 ${PKG}.sha512 ${PKGDIR}/${PKG}.sha512 diff --git a/lib/uninstall.mk b/lib/uninstall.mk @@ -1,14 +1,16 @@ <$mkpklib/defaults.mk uninstall-package:QV: - pkg=$(find "${PKGDIR}" -name "${PKGBASE}-*.tar.xz" | sed 1q) - if [ -z "${pkg}" ]; then + recentver=$(find ${PKGDIR} -type f -prune -name "${PKGBASE}-*" | \ + sed 's,\([^0-9]\+[^-]-\)\+\([0-9].*\)\.tar\.xz,\2,' | recent) + if [ -z "${recentver}" ]; then printf "Cannot find package %s\n" "${PKGBASE}" >&2 exit 1 elif [ -z "$(grep "^${PKGBASE}\t" "${PKGDB}" 2>/dev/null)" ]; then printf "Package %s is not installed\n" "${PKGBASE}" >&2 exit 1 else + pkg=${PKGBASE}-${recentver}.tar.xz cd / for item in $(xz -dc "${pkg}" | tar -tf -); do if [ -d "${item}" ]; then diff --git a/recent b/recent @@ -1,47 +1,69 @@ #!/bin/sh -if [ $# -lt 2 ]; then - printf "Usage: %s [ver1] [ver2]\n" "${0##*/}" >&2 - exit 1 -fi - -ver1=$1 -ver2=$2 - -major1=$(echo $ver1 | sed 's/\([0-9]\+\)\..*/\1/') -major2=$(echo $ver2 | sed 's/\([0-9]\+\)\..*/\1/') -rest1=$(echo $ver1 | sed 's/[0-9]\+\.\(.*\)/\1/') -rest2=$(echo $ver2 | sed 's/[0-9]\+\.\(.*\)/\1/') - -if [[ $major1 -gt $major2 ]]; then - echo $ver1 - exit -elif [[ $major1 -lt $major2 ]]; then - echo $ver2 - exit -fi - -minor1=$(echo $rest1 | sed 's/\([0-9]\+\)\..*/\1/') -minor2=$(echo $rest2 | sed 's/\([0-9]\+\)\..*/\1/') -rest1=$(echo $rest1 | sed 's/[0-9]\+\.\(.*\)/\1/') -rest2=$(echo $rest2 | sed 's/[0-9]\+\.\(.*\)/\1/') - -if [[ $minor1 -gt $minor2 ]]; then - echo $ver1 - exit -elif [[ $minor1 -lt $minor2 ]]; then - echo $ver2 - exit -fi - -patch1=$(echo $rest1 | sed 's/\([0-9]\+\)\(-.*\)*/\1/') -patch2=$(echo $rest2 | sed 's/\([0-9]\+\)\(-.*\)*/\1/') -rest1=$(echo $rest1 | sed 's/[0-9]\+\(-\(.*\)\)*/\2/') -rest2=$(echo $rest2 | sed 's/[0-9]\+\(-\(.*\)\)*/\2/') - -recent=$(printf "%s\n%s\n" $rest1 $rest2 | sort -n -r | sed 1q) -if [[ "$recent" = "$rest1" ]]; then - echo $ver1 -else - echo $ver2 -fi +output_recent() +{ + local ver1=$1 ver2=$2 major1 major2 minor1 minor2 patch1 patch2 + local rest1 rest2 recent + + major1=$(echo "${ver1}" | sed 's/\([0-9]\+\)\..*/\1/') + major2=$(echo "${ver2}" | sed 's/\([0-9]\+\)\..*/\1/') + rest1=$(echo "${ver1}" | sed 's/[0-9]\+\.\(.*\)/\1/') + rest2=$(echo "${ver2}" | sed 's/[0-9]\+\.\(.*\)/\1/') + + if [ "${major1}" -gt "${major2}" ]; then + echo "${ver1}" + return + elif [ "${major1}" -lt "${major2}" ]; then + echo "${ver2}" + return + fi + + minor1=$(echo "${rest1}" | sed 's/\([0-9]\+\)\..*/\1/') + minor2=$(echo "${rest2}" | sed 's/\([0-9]\+\)\..*/\1/') + rest1=$(echo "${rest1}" | sed 's/[0-9]\+\.\(.*\)/\1/') + rest2=$(echo "${rest2}" | sed 's/[0-9]\+\.\(.*\)/\1/') + + if [ "${minor1}" -gt "${minor2}" ]; then + echo "${ver1}" + return + elif [ "${minor1}" -lt "${minor2}" ]; then + echo "${ver2}" + return + fi + + patch1=$(echo "${rest1}" | sed 's/\([0-9]\+\)\(-.*\)*/\1/') + patch2=$(echo "${rest2}" | sed 's/\([0-9]\+\)\(-.*\)*/\1/') + rest1=$(echo "${rest1}" | sed 's/[0-9]\+\(-\(.*\)\)*/\2/') + rest2=$(echo "${rest2}" | sed 's/[0-9]\+\(-\(.*\)\)*/\2/') + + if [ "${patch1}" -gt "${patch2}" ]; then + echo "${ver1}" + return + elif [ "${patch1}" -lt "${patch2}" ]; then + echo "${ver2}" + return + fi + + recent=$(printf "%s\n%s\n" "${rest1}" "${rest2}" | sort -n -r | sed 1q) + if [ "${recent}" = "${rest1}" ]; then + echo "${ver1}" + else + echo "${ver2}" + fi +} + +rec='' +prev='' +while read -r line; do + if [ -z "${prev}" ]; then + prev=$line + continue + fi + ver=${line} + cur=$(output_recent "${prev}" "${ver}") + if [ "${cur}" != "${rec}" ]; then + rec=${cur} + fi + prev=${cur} +done +echo "${rec}" diff --git a/testrecent b/testrecent @@ -1,12 +0,0 @@ -#!/bin/sh -rec= -prev=1.1.1 -for ver in 1.2.1-12-doo 1.2.1-33-zzz 1.3.1-3-df 1.3.1-12-adf ; do - cur=$(./recent $prev $ver) - printf "DEBUG: ver=%s\t\tcur=%s\t\trec=%s\n" "$ver" "$cur" "$rec" - if [[ "$cur" != "$rec" ]]; then - rec=$cur - fi - prev=$cur -done -echo $rec