aboutsummaryrefslogtreecommitdiff
path: root/sbodl
blob: d8635009e69396b94b0535c5d401910b641dabcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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, try '$SELF -a'."
		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, try '$SELF -a'?"
	fi
	shift
done