makepkg : allow to specify a download filename

A source entry can now have the following form, to specify a different
filename :
"filename::http://path/to/file"

Of course, the old syntax is still supported :
"http://path/to/file"

And as before, in the second case, the filename used is simply "file".

This fixes FS#11292, because handling multiple source files with the same
name is now possible (just choose a different filename).

But it will also allow to deal much more nicely with funny url like this by
using a sane filename (and unfortunately, there are quite a few) :
http://www.vim.org/scripts/download_script.php?src_id=6992

Signed-off-by: Xavier Chantry <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Xavier Chantry 2008-08-23 16:34:42 +02:00 committed by Dan McGee
parent 24d7c6a372
commit d6f62ba22d
3 changed files with 55 additions and 25 deletions

View file

@ -87,6 +87,10 @@ similar to `$_basekernver`.
variables if possible when specifying the download location. Any files variables if possible when specifying the download location. Any files
that are compressed will automatically be extracted, unless found in that are compressed will automatically be extracted, unless found in
the noextract array listed below. the noextract array listed below.
+
It is also possible to specify an optional filename, which is helpful
with weird URLs and for handling multiple source files with the same
name. The syntax is: `source=('filename::url')`
*noextract (array)*:: *noextract (array)*::
An array of filenames corresponding to those from the source array. Files An array of filenames corresponding to those from the source array. Files

View file

@ -34,12 +34,13 @@ Options
**DLAGENTS=(**\'protocol::/path/to/command [options]' ...**)**:: **DLAGENTS=(**\'protocol::/path/to/command [options]' ...**)**::
Sets the download agents used to fetch source files specified with a URL in Sets the download agents used to fetch source files specified with a URL in
the linkman:PKGBUILD[5] file. Options can be specified for each command as the linkman:PKGBUILD[5] file. Options can be specified for each command as
well; the download URL is placed on the end of the command. This is more well, and any protocol can have a download agent. Several examples are provided
flexible than the former `FTPAGENT` variable, as any protocol can have a in the default makepkg.conf.
download agent. Several examples are provided in the default makepkg.conf. +
All instances of `%u` will be replaced with the download URL. If present, If present, `%u` will be replaced with the download URL. Otherwise, the
instances of `%o` will be replaced with the local filename, plus a ``.part'' download URL will be placed on the end of the command. If present, `%o` will
extension, which allows to do file resumes properly. be replaced with the local filename, plus a ``.part'' extension, which allows
makepkg to handle resuming file downloads.
**CARCH=**"carch":: **CARCH=**"carch"::
Specifies your computer architecture; possible values include such things Specifies your computer architecture; possible values include such things

View file

@ -163,11 +163,23 @@ trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit "$(gettext "An unknown error has occured. Exiting...")"' ERR trap 'trap_exit "$(gettext "An unknown error has occured. Exiting...")"' ERR
# a source entry can have two forms :
# 1) "filename::http://path/to/file"
# 2) "http://path/to/file"
strip_url() { # extract the filename from a source entry
echo "$1" | sed 's|^.*://.*/||g' get_filename() {
# if a filename is specified, use it
local filename=$(echo $1 | sed 's|::.*||')
# if it is just an url, we only keep the last component
echo "$filename" | sed 's|^.*://.*/||g'
} }
# extract the url from a source entry
get_url() {
# strip an eventual filename
echo $1 | sed 's|.*::||'
}
## ##
# Checks to see if options are present in makepkg.conf or PKGBUILD; # Checks to see if options are present in makepkg.conf or PKGBUILD;
@ -284,18 +296,33 @@ get_downloadclient() {
} }
download_file() { download_file() {
# download command
local dlcmd=$1 local dlcmd=$1
local netfile=$2 # url of the file
local url=$2
# destination file
local file=$3 local file=$3
# temporary download file, default to last component of the url
local dlfile=$(echo "$url" | sed 's|^.*://.*/||g')
if echo "$dlcmd" | grep -q "%u" ; then # replace %o by the temporary dlfile if it exists
if echo "$dlcmd" | grep -q "%o" ; then
dlcmd=${dlcmd//%o/$file.part} dlcmd=${dlcmd//%o/$file.part}
dlcmd=${dlcmd//%u/$netfile} dlfile="$file.part"
fi
# add the url, either in place of %u or at the end
if echo "$dlcmd" | grep -q "%u" ; then
dlcmd=${dlcmd//%u/$url}
else else
dlcmd="$dlcmd $netfile" dlcmd="$dlcmd $url"
fi fi
$dlcmd $dlcmd || return $?
# rename the temporary download file to the final destination
if [ "$dlfile" != "$file" ]; then
mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
fi
} }
check_deps() { check_deps() {
@ -418,7 +445,8 @@ download_sources() {
local netfile local netfile
for netfile in "${source[@]}"; do for netfile in "${source[@]}"; do
local file=$(strip_url "$netfile") local file=$(get_filename "$netfile")
local url=$(get_url "$netfile")
if [ -f "$startdir/$file" ]; then if [ -f "$startdir/$file" ]; then
msg2 "$(gettext "Found %s in build dir")" "$file" msg2 "$(gettext "Found %s in build dir")" "$file"
rm -f "$srcdir/$file" rm -f "$srcdir/$file"
@ -432,26 +460,23 @@ download_sources() {
fi fi
# if we get here, check to make sure it was a URL, else fail # if we get here, check to make sure it was a URL, else fail
if [ "$file" = "$netfile" ]; then if [ "$file" = "$url" ]; then
error "$(gettext "%s was not found in the build directory and is not a URL.")" "$netfile" error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file"
exit 1 # $E_MISSING_FILE exit 1 # $E_MISSING_FILE
fi fi
# find the client we should use for this URL # find the client we should use for this URL
local dlclient=$(get_downloadclient "$netfile") || exit $? local dlclient=$(get_downloadclient "$url") || exit $?
msg2 "$(gettext "Downloading %s...")" "$file" msg2 "$(gettext "Downloading %s...")" "$file"
# fix flyspray bug #3289 # fix flyspray bug #3289
local ret=0 local ret=0
download_file "$dlclient" "$netfile" "$file" || ret=$? download_file "$dlclient" "$url" "$file" || ret=$?
if [ $ret -gt 0 ]; then if [ $ret -gt 0 ]; then
error "$(gettext "Failure while downloading %s")" "$file" error "$(gettext "Failure while downloading %s")" "$file"
plain "$(gettext "Aborting...")" plain "$(gettext "Aborting...")"
exit 1 exit 1
fi fi
if echo "$dlclient" | grep -q "%o" ; then
mv -f "$SRCDEST/$file.part" "$SRCDEST/$file"
fi
rm -f "$srcdir/$file" rm -f "$srcdir/$file"
ln -s "$SRCDEST/$file" "$srcdir/" ln -s "$SRCDEST/$file" "$srcdir/"
done done
@ -491,7 +516,7 @@ generate_checksums() {
local netfile local netfile
for netfile in "${source[@]}"; do for netfile in "${source[@]}"; do
local file="$(strip_url "$netfile")" local file="$(get_filename "$netfile")"
if [ ! -f "$file" ] ; then if [ ! -f "$file" ] ; then
if [ ! -f "$SRCDEST/$file" ] ; then if [ ! -f "$SRCDEST/$file" ] ; then
@ -537,7 +562,7 @@ check_checksums() {
local idx=0 local idx=0
local file local file
for file in "${source[@]}"; do for file in "${source[@]}"; do
file="$(strip_url "$file")" file="$(get_filename "$file")"
echo -n " $file ... " >&2 echo -n " $file ... " >&2
if [ ! -f "$file" ] ; then if [ ! -f "$file" ] ; then
@ -576,7 +601,7 @@ extract_sources() {
msg "$(gettext "Extracting Sources...")" msg "$(gettext "Extracting Sources...")"
local netfile local netfile
for netfile in "${source[@]}"; do for netfile in "${source[@]}"; do
file=$(strip_url "$netfile") file=$(get_filename "$netfile")
if in_array "$file" ${noextract[@]}; then if in_array "$file" ${noextract[@]}; then
#skip source files in the noextract=() array #skip source files in the noextract=() array
# these are marked explicitly to NOT be extracted # these are marked explicitly to NOT be extracted
@ -959,7 +984,7 @@ create_srcpackage() {
local netfile local netfile
for netfile in "${source[@]}"; do for netfile in "${source[@]}"; do
local file=$(strip_url "$netfile") local file=$(get_filename "$netfile")
if [ -f "$netfile" ]; then if [ -f "$netfile" ]; then
msg2 "$(gettext "Adding %s...")" "$netfile" msg2 "$(gettext "Adding %s...")" "$netfile"
ln -s "${startdir}/$netfile" "${srclinks}/${pkgname}" ln -s "${startdir}/$netfile" "${srclinks}/${pkgname}"