aboutsummaryrefslogtreecommitdiff
path: root/sbodl
diff options
context:
space:
mode:
Diffstat (limited to 'sbodl')
-rwxr-xr-xsbodl156
1 files changed, 156 insertions, 0 deletions
diff --git a/sbodl b/sbodl
new file mode 100755
index 0000000..a6cb8fc
--- /dev/null
+++ b/sbodl
@@ -0,0 +1,156 @@
+#!/bin/bash
+
+# sbodl, download slackbuilds.org source files
+
+# 20230513 bkw: move to the sbo-maintainer-tools repo, clean up for release.
+# 20191222 bkw: handle broken symlinks in current dir.
+# change default cache dir.
+# 20170306 bkw: add caching
+
+VERSION=0.8.0
+
+SELF=$( basename $0 )
+
+DEFCACHEDIR=~/sbodl-cache
+CACHEDIR=${SBODL_CACHEDIR:-$DEFCACHEDIR}
+
+ARCHIVE=https://slackware.uk/sbosrcarch
+
+RED="\033[1;31m"
+GREEN="\033[1;32m"
+COLOR_OFF="\033[0m"
+
+
+usage() {
+ cat <<EOF
+$SELF v$VERSION - Download the sources for a SlackBuilds.org build.
+(c) 2014, 2023 B. Watson (urchlay@slackware.uk)
+Licensed under the WTFPL: Do WTF you want with this.
+
+Usage: $SELF [-f] <wget-options>
+
+Execute $SELF in the directory that contains the .info and .SlackBuild
+files. If the files are not found in the current directory, they'll be
+looked for in the cache directory, and symlinked to the current dir if
+found there. If they're not in the cache, they'll be downloaded with wget.
+
+Each file's md5sum is checked against the .info file in the current directory.
+
+Options:
+
+-h, --help: Show this help message.
+
+-f: Ignore locally cached files, always download.
+
+-a: Download from sbosrcarch (Source Archive).
+
+Any other options you pass to it will be passed to wget.
+
+By default, --content-disposition is used. If you want to disable it, use
+the --no-content-disposition wget option.
+
+The default cache directory is $DEFCACHEDIR,
+but you can override this by setting SBODL_CACHEDIR in the environment.
+
+If you need to download files for a different architecture
+(e.g. 32-bit files when running on a 64-bit OS), you can override ARCH
+in the environment: "ARCH=i686 sbodl" would download the 32-bit source
+file(s).
+
+EOF
+ exit 0
+}
+
+die() {
+ echo "$SELF: $*" 2>&1
+ exit 1
+}
+
+[ -d "$CACHEDIR/" ] || mkdir -p $CACHEDIR || die "Can't create $CACHEDIR"
+
+# check for our one argument
+case "$1" in
+ -h|-help|-\?|--help) usage ;;
+ -f) FORCEDL="yes" ; shift ;;
+ -a) USEARCHIVE="yes" ; shift ;;
+esac
+
+source ./$( basename $( pwd ) ).info \
+ || die "No .info file, are you sure this is a SBo directory? Try '$SELF --help'"
+
+# This stanza copied from the SBo template for 14.1:
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ "$ARCH" = "x86_64" ]; then
+ DL=${DOWNLOAD_x86_64:-$DOWNLOAD}
+ SUM=${MD5SUM_x86_64:-$MD5SUM}
+else
+ DL=$DOWNLOAD
+ SUM=${MD5SUM}
+fi
+
+if [ -z "$DL" ]; then
+ die "Bad .info file (no DOWNLOAD= or DOWNLOAD_x86_64=)."
+fi
+
+# save passed-in command line args for use with wget
+WGETARGS="$@"
+
+set $SUM
+
+for dl in $DL; do
+ if [ "$USEARCHIVE" = "yes" ]; then
+ file="$( echo "$dl" | sed 's,.*/,,' )"
+ a=$( echo $1 | cut -b1 )
+ b=$( echo $1 | cut -b2 )
+ dl="$ARCHIVE/by-md5/$a/$b/$1/$file"
+ fi
+
+ EXTRAWGETARGS="--content-disposition "
+ case "$dl" in
+ *sourceforge.net/*|*.sf.net/*) EXTRAWGETARGS="--user-agent wget" ;;
+ *) ;;
+ esac
+
+ FILE=$( echo "$dl" | sed 's,.*/,,' )
+
+ # ignore (rm) broken symlinks
+ [ -L "$FILE" ] && ! [ -e "$FILE" ] && FORCEDL=yes
+
+ [ "$FORCEDL" = "yes" ] && rm -f "$FILE"
+
+ if [ -f "$FILE" -a ! -L "$FILE" ]; then
+ # file exists and is a regular file, cache it
+ mv -b "$FILE" "$CACHEDIR"
+ ln -s "$CACHEDIR/$FILE" "$FILE"
+ elif [ -e "$FILE" ]; then
+ # don't do anything
+ :
+ elif [ "$FORCEDL" != "yes" ] && [ -e "$CACHEDIR/$FILE" ]; then
+ ln -s "$CACHEDIR/$FILE" "$FILE"
+ else
+ wget $EXTRAWGETARGS $WGETARGS "$dl" || die "Download failed"
+ if [ -e "$FILE" ]; then
+ mv -b "$FILE" "$CACHEDIR"
+ ln -s "$CACHEDIR/$FILE" "$FILE"
+ fi
+ fi
+
+ if [ -e "$FILE" ]; then
+ GOTSUM="$( md5sum "$FILE" | cut -d' ' -f1 )"
+ if [ "$1" != "$GOTSUM" ]; then
+ echo -e "${RED}WARN: md5sum doesn't match${COLOR_OFF}\\n expected: $1\\n got: $GOTSUM"
+ else
+ echo -e "${GREEN}md5sum matches OK${COLOR_OFF}: $1"
+ fi
+ else
+ echo -e "${RED}WARN${COLOR_OFF}: can't find downloaded file $FILE"
+ fi
+ shift
+done