чување 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:
измењених датотека: 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