[dbscripts,v3,5/5] Globally set $PKGEXT to a bash extended glob representing valid choices.

Message ID 20180220015850.29991-1-eschwartz@archlinux.org
State Accepted
Headers show
Series None | expand

Commit Message

Emil Velikov via arch-projects Feb. 20, 2018, 1:58 a.m. UTC
The current glob `*.pkg.tar.?z` is both less restrictive and more
restrictive than makepkg, as it accepts any valid unicode character.

To be more exact, it's almost completely orthogonal to the one in makepkg.

makepkg only accepts .tar.gz, .tar.bz2, .tar.xz, .tar.lzo, .tar.lrz, and
.tar.Z and most of those fail to match against a two-char compression type.

dbscripts accepts .pkg.tar.💩z which incidentally is what I think of
cherry-picking xz and gz as supported methods.

Since this can be anything makepkg.conf accepts, it needs to be able to
match all that, unless we decide to perform additional restrictions in
which case we should still explicitly list each allowed extension. Using
bash extended globbing allows us to do this relatively painlessly.

Document the fact that this has *always* been some sort of glob, and
update the two cases where this was (not!) being evaluated by bash
[[ ... ]], to use a not-elegant-at-all proxy function is_globfile() to
evaluate globs *before* testing if they exist.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>

v3: add comment describing the purpose of is_globfile()

 config       |  3 ++-
 db-functions | 14 +++++++++++---
 2 files changed, 13 insertions(+), 4 deletions(-)


diff --git a/config b/config
index 5bb3b16..0d33de0 100644
--- a/config
+++ b/config
@@ -25,7 +25,8 @@  TMPDIR="/var/tmp"
+# bash glob listing allowed extensions. Note that db-functions turns on extglob.
 # Allowed licenses: get sourceballs only for licenses in this array
diff --git a/db-functions b/db-functions
index 394c7a2..8b71cae 100644
--- a/db-functions
+++ b/db-functions
@@ -3,7 +3,7 @@ 
 . /usr/share/makepkg/util.sh
 # global shell options for enhanced bash scripting
-shopt -s globstar nullglob
+shopt -s extglob globstar nullglob
 # Some PKGBUILDs need CARCH to be set
@@ -20,6 +20,14 @@  restore_umask () {
 	umask $UMASK >/dev/null
+# Proxy function to check if a file exists. Using [[ -f ... ]] directly is not
+# always wanted because we might want to expand bash globs first. This way we
+# can pass unquoted globs to is_globfile() and have them expanded as function
+# arguments before being checked.
+is_globfile() {
+	[[ -f $1 ]]
 # just like mv -f, but we touch the file and then copy the content so
 # default ACLs in the target dir will be applied
 mv_acl() {
@@ -378,8 +386,8 @@  check_pkgrepos() {
 	local pkgver="$(getpkgver ${pkgfile})" || return 1
 	local pkgarch="$(getpkgarch ${pkgfile})" || return 1
-	[[ -f ${FTP_BASE}/${PKGPOOL}/${pkgname}-${pkgver}-${pkgarch}${PKGEXTS} ]] && return 1
-	[[ -f ${FTP_BASE}/${PKGPOOL}/${pkgname}-${pkgver}-${pkgarch}${PKGEXTS}.sig ]] && return 1
+	is_globfile "${FTP_BASE}/${PKGPOOL}/${pkgname}-${pkgver}-${pkgarch}"${PKGEXTS} && return 1
+	is_globfile "${FTP_BASE}/${PKGPOOL}/${pkgname}-${pkgver}-${pkgarch}"${PKGEXTS}.sig && return 1
 	[[ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile##*/} ]] && return 1
 	[[ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile##*/}.sig ]] && return 1