From d6f62ba22d5c6da484f4a7f0876b203ad545342a Mon Sep 17 00:00:00 2001 From: Xavier Chantry Date: Sat, 23 Aug 2008 16:34:42 +0200 Subject: 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 Signed-off-by: Dan McGee --- doc/PKGBUILD.5.txt | 4 ++++ doc/makepkg.conf.5.txt | 13 +++++----- scripts/makepkg.sh.in | 65 ++++++++++++++++++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt index 0b1ce649..9db10576 100644 --- a/doc/PKGBUILD.5.txt +++ b/doc/PKGBUILD.5.txt @@ -87,6 +87,10 @@ similar to `$_basekernver`. variables if possible when specifying the download location. Any files that are compressed will automatically be extracted, unless found in 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)*:: An array of filenames corresponding to those from the source array. Files diff --git a/doc/makepkg.conf.5.txt b/doc/makepkg.conf.5.txt index 8b39c467..b5398af7 100644 --- a/doc/makepkg.conf.5.txt +++ b/doc/makepkg.conf.5.txt @@ -34,12 +34,13 @@ Options **DLAGENTS=(**\'protocol::/path/to/command [options]' ...**)**:: 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 - well; the download URL is placed on the end of the command. This is more - flexible than the former `FTPAGENT` variable, as any protocol can have a - download agent. Several examples are provided in the default makepkg.conf. - All instances of `%u` will be replaced with the download URL. If present, - instances of `%o` will be replaced with the local filename, plus a ``.part'' - extension, which allows to do file resumes properly. + well, and any protocol can have a download agent. Several examples are provided + in the default makepkg.conf. + + + If present, `%u` will be replaced with the download URL. Otherwise, the + download URL will be placed on the end of the command. If present, `%o` will + be replaced with the local filename, plus a ``.part'' extension, which allows + makepkg to handle resuming file downloads. **CARCH=**"carch":: Specifies your computer architecture; possible values include such things diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index d127d164..1d70f39b 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -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 "An unknown error has occured. Exiting...")"' ERR - -strip_url() { - echo "$1" | sed 's|^.*://.*/||g' +# a source entry can have two forms : +# 1) "filename::http://path/to/file" +# 2) "http://path/to/file" + +# extract the filename from a source entry +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; @@ -284,18 +296,33 @@ get_downloadclient() { } download_file() { + # download command local dlcmd=$1 - local netfile=$2 + # url of the file + local url=$2 + # destination file 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//%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 - dlcmd="$dlcmd $netfile" + dlcmd="$dlcmd $url" 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() { @@ -418,7 +445,8 @@ download_sources() { local netfile 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 msg2 "$(gettext "Found %s in build dir")" "$file" rm -f "$srcdir/$file" @@ -432,26 +460,23 @@ download_sources() { fi # if we get here, check to make sure it was a URL, else fail - if [ "$file" = "$netfile" ]; then - error "$(gettext "%s was not found in the build directory and is not a URL.")" "$netfile" + if [ "$file" = "$url" ]; then + error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file" exit 1 # $E_MISSING_FILE fi # 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" # fix flyspray bug #3289 local ret=0 - download_file "$dlclient" "$netfile" "$file" || ret=$? + download_file "$dlclient" "$url" "$file" || ret=$? if [ $ret -gt 0 ]; then error "$(gettext "Failure while downloading %s")" "$file" plain "$(gettext "Aborting...")" exit 1 fi - if echo "$dlclient" | grep -q "%o" ; then - mv -f "$SRCDEST/$file.part" "$SRCDEST/$file" - fi rm -f "$srcdir/$file" ln -s "$SRCDEST/$file" "$srcdir/" done @@ -491,7 +516,7 @@ generate_checksums() { local netfile for netfile in "${source[@]}"; do - local file="$(strip_url "$netfile")" + local file="$(get_filename "$netfile")" if [ ! -f "$file" ] ; then if [ ! -f "$SRCDEST/$file" ] ; then @@ -537,7 +562,7 @@ check_checksums() { local idx=0 local file for file in "${source[@]}"; do - file="$(strip_url "$file")" + file="$(get_filename "$file")" echo -n " $file ... " >&2 if [ ! -f "$file" ] ; then @@ -576,7 +601,7 @@ extract_sources() { msg "$(gettext "Extracting Sources...")" local netfile for netfile in "${source[@]}"; do - file=$(strip_url "$netfile") + file=$(get_filename "$netfile") if in_array "$file" ${noextract[@]}; then #skip source files in the noextract=() array # these are marked explicitly to NOT be extracted @@ -959,7 +984,7 @@ create_srcpackage() { local netfile for netfile in "${source[@]}"; do - local file=$(strip_url "$netfile") + local file=$(get_filename "$netfile") if [ -f "$netfile" ]; then msg2 "$(gettext "Adding %s...")" "$netfile" ln -s "${startdir}/$netfile" "${srclinks}/${pkgname}" -- cgit v1.2.3-24-g4f1b