From 32a3ee5c1c199cc2cc0958d72ebd9001b2da7f6b Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 11 Sep 2023 04:30:55 +0200 Subject: [PATCH 1/2] setup/git.sh: fix non-portable sed invocation This lets xbps-src work in non-GNU environments. --- common/environment/setup/git.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index bd72f2eae3f07..3417e9ec1898a 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -18,7 +18,7 @@ elif [ -z "${SOURCE_DATE_EPOCH}" ]; then export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" else export SOURCE_DATE_EPOCH=$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} cat-file commit HEAD | - sed -n '/^committer /{s/.*> \([0-9][0-9]*\) [-+][0-9].*/\1/p;q}') + grep '^committer '|sed 's/.*> \([0-9][0-9]*\) [-+][0-9].*/\1/') fi fi From fa32742e6e9639cd7d967e5c718e53a93498f177 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 11 Sep 2023 04:30:55 +0200 Subject: [PATCH 2/2] xbps-src: abstract away non-portable stat(1) This implements semi-portable abstractions for both GNU and BSD flavors of stat. --- common/environment/setup/git.sh | 2 +- common/hooks/do-fetch/00-distfiles.sh | 2 +- common/xbps-src/shutils/common.sh | 36 ++++++++++++++++++++++ common/xbps-src/shutils/cross.sh | 2 +- common/xbps-src/shutils/pkgtarget.sh | 4 +-- common/xbps-src/shutils/purge_distfiles.sh | 4 +-- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index 3417e9ec1898a..b237b5372d232 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -15,7 +15,7 @@ elif [ -z "${SOURCE_DATE_EPOCH}" ]; then fi # check if the template is under version control: if [ -n "$basepkg" -a -z "$($XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then - export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" + export SOURCE_DATE_EPOCH="$(stat_mtime ${XBPS_SRCPKGDIR}/${basepkg}/template)" else export SOURCE_DATE_EPOCH=$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} cat-file commit HEAD | grep '^committer '|sed 's/.*> \([0-9][0-9]*\) [-+][0-9].*/\1/') diff --git a/common/hooks/do-fetch/00-distfiles.sh b/common/hooks/do-fetch/00-distfiles.sh index 9ce2a1895bd0a..1adb86a516782 100644 --- a/common/hooks/do-fetch/00-distfiles.sh +++ b/common/hooks/do-fetch/00-distfiles.sh @@ -253,7 +253,7 @@ hook() { if [[ $cksum = $filesum ]]; then dfgood=$((dfgood + 1)) else - inode=$(stat "$distfile" --printf "%i") + inode=$(stat_inode "$distfile") msg_warn "$pkgver: wrong checksum found for ${curfile} - purging\n" find ${XBPS_SRCDISTDIR} -inum ${inode} -delete -print fi diff --git a/common/xbps-src/shutils/common.sh b/common/xbps-src/shutils/common.sh index fec84c8f85e0d..04247942decf2 100644 --- a/common/xbps-src/shutils/common.sh +++ b/common/xbps-src/shutils/common.sh @@ -1,5 +1,41 @@ # vim: set ts=4 sw=4 et: +# A portable abstraction for stat(1) +# +# The stat(1) command has different syntaxes between GNU flavor +# and BSD flavor; implementations generally follow one or the other +# +if ! stat -c "%s" / > /dev/null 2>&1; then + # BSD stat + + stat_size() { + stat -f %z "$1" + } + + stat_inode() { + stat -f %i "$1" + } + + stat_mtime() { + stat -f %m "$1" + } +else + # GNU stat + + stat_size() { + stat -c %s "$1" + } + + stat_inode() { + stat -c %i "$1" + } + + stat_mtime() { + stat -c %Y "$1" + } +fi + + run_func() { local func="$1" desc="$2" funcname="$3" restoretrap= logpipe= logfile= teepid= diff --git a/common/xbps-src/shutils/cross.sh b/common/xbps-src/shutils/cross.sh index fbf22f92b9f5b..c21bab1747875 100644 --- a/common/xbps-src/shutils/cross.sh +++ b/common/xbps-src/shutils/cross.sh @@ -16,7 +16,7 @@ remove_pkg_cross_deps() { $XBPS_REMOVE_XCMD -Ryo > $tmplogf 2>&1 rval=$? while [ $rval -eq 0 ]; do - local curs=$(stat -c %s $tmplogf) + local curs=$(stat_size $tmplogf) if [ $curs -eq $prevs ]; then break fi diff --git a/common/xbps-src/shutils/pkgtarget.sh b/common/xbps-src/shutils/pkgtarget.sh index 54b7c3429c2ff..1e76a1b93b19e 100644 --- a/common/xbps-src/shutils/pkgtarget.sh +++ b/common/xbps-src/shutils/pkgtarget.sh @@ -65,11 +65,11 @@ remove_pkg_autodeps() { remove_pkg_cross_deps $XBPS_RECONFIGURE_CMD -a >> $tmplogf 2>&1 - prevs=$(stat -c %s $tmplogf) + prevs=$(stat_size $tmplogf) echo yes | $XBPS_REMOVE_CMD -Ryod 2>> $errlogf 1>> $tmplogf rval=$? while [ $rval -eq 0 ]; do - local curs=$(stat -c %s $tmplogf) + local curs=$(stat_size $tmplogf) if [ $curs -eq $prevs ]; then break fi diff --git a/common/xbps-src/shutils/purge_distfiles.sh b/common/xbps-src/shutils/purge_distfiles.sh index 838ac751684b4..4bd921aa2d469 100644 --- a/common/xbps-src/shutils/purge_distfiles.sh +++ b/common/xbps-src/shutils/purge_distfiles.sh @@ -57,7 +57,7 @@ purge_distfiles() { cur=0 percent=-1 for distfile in ${distfiles[@]}; do - inode=$(stat "$distfile" --printf "%i") + inode=$(stat_inode "$distfile") if [ -z "${inodes[$inode]}" ]; then inodes[$inode]="$distfile" else @@ -77,7 +77,7 @@ purge_distfiles() { hash_distfile=${file##*/} hash=${hash_distfile:0:$HASHLEN} [ -n "${my_hashes[$hash]}" ] && continue - inode=$(stat "$file" --printf "%i") + inode=$(stat_inode "$file") echo "Obsolete $hash (inode: $inode)" ( IFS="|"; for f in ${inodes[$inode]}; do rm -vf "$f"; rmdir "${f%/*}" 2>/dev/null; done ) done