[pacman-dev] [PATCH 2/3] makepkg: use extglob in place of regex
Allan McRae
allan at archlinux.org
Tue Sep 6 03:23:06 EDT 2011
On 05/09/11 14:57, Dave Reisner wrote:
> We seem to enjoy using bash regex capabilities, but never referencing
> the result with BASH_REMATCH. Replace almost all regexes with equivalent
> extglobs which are faster and functionally equivalent in these cases.
>
> Signed-off-by: Dave Reisner<dreisner at archlinux.org>
I have no objections to this. So ack with minor comments below.
> ---
> The only remaining regexes are in lib{depends,provides} logic and I'm not
> really comfortable touching those. There's a lot of cleanup that should
> be done separately for that code where removal of those regexes can be
> handled accordingly...
One day I will get to finishing my adjustments there... honest!
>
> scripts/makepkg.sh.in | 16 +++++++++-------
> 1 files changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 2f06b9b..75d168b 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -81,6 +81,8 @@ FORCE_VER=""
>
> PACMAN_OPTS=
>
> +shopt -s extglob
> +
> ### SUBROUTINES ###
>
> plain() {
> @@ -341,7 +343,7 @@ in_array() {
> source_has_signatures(){
> local file
> for file in "${source[@]}"; do
> - if [[ $file =~ \.(sig|asc)$ ]]; then
> + if [[ $file = *.@(sig|asc) ]]; then
> return 0
> fi
> done
> @@ -420,7 +422,7 @@ download_file() {
> run_pacman() {
> local cmd
> printf -v cmd "%q " "$PACMAN" $PACMAN_OPTS "$@"
> - if (( ! ASROOT ))&& [[ ! $1 =~ ^-(T|Qq)$ ]]; then
> + if (( ! ASROOT ))&& [[ ! $1 = -@(T|Qq) ]]; then
> if type -p sudo>/dev/null; then
> cmd="sudo $cmd"
> else
> @@ -709,7 +711,7 @@ check_pgpsigs() {
>
> for file in "${source[@]}"; do
> file="$(get_filename "$file")"
> - if [[ ! $file =~ \.(sig|asc)$ ]]; then
> + if [[ ! $file = *.@(sig|asc) ]]; then
> continue
> fi
>
> @@ -1451,7 +1453,7 @@ check_sanity() {
> awk -F'=' '/^[[:space:]]*pkgver=/ { $1=""; print $0 }' "$BUILDFILE" |
> while read -r i; do
> eval i=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/'<<< "$i")\"
> - if [[ $i =~ [[:space:]:-] ]]; then
> + if [[ $i = *+([[:space:]:-])* ]]; then
> error "$(gettext "%s is not allowed to contain colons, hyphens or whitespace.")" "pkgver"
> return 1
> fi
> @@ -1460,7 +1462,7 @@ check_sanity() {
> awk -F'=' '/^[[:space:]]*pkgrel=/ { $1=""; print $0 }' "$BUILDFILE" |
> while read -r i; do
> eval i=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/'<<< "$i")\"
> - if [[ $i =~ [[:space:]-] ]]; then
> + if [[ $i = *+([[:space:]-])* ]]; then
> error "$(gettext "%s is not allowed to contain hyphens or whitespace.")" "pkgrel"
> return 1
> fi
> @@ -1469,7 +1471,7 @@ check_sanity() {
> awk -F'=' '/^[[:space:]]*epoch=/ { $1=""; print $0 }' "$BUILDFILE" |
> while read -r i; do
> eval i=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/'<<< "$i")\"
> - if [[ ! $i =~ ^[0-9]*$ ]]; then
> + if [[ $i&& $i != +([0-9]) ]]; then
Do we need the test for $i there given it should be non-null for us not
to exit the while loop? Also, should we use [:digit:] rather than [0-9]?
> error "$(gettext "%s must be an integer.")" "epoch"
> return 1
> fi
> @@ -1526,7 +1528,7 @@ check_sanity() {
> sed -e "s/optdepends=/optdepends_list+=/" -e "s/#.*//" -e 's/\\$//')
> for i in "${optdepends_list[@]}"; do
> local pkg=${i%%:*}
> - if [[ ! $pkg =~ ^[[:alnum:]\>\<\=\.\+\_\-]+$ ]]; then
> + if [[ $pkg != +([[:alnum:]><=.+_-]) ]]; then
Any chance you want to fix this for versioned optdepends containing an
epoch at the same time? The optdepends work requires a colon followed
by a space before the description. So I guess:
local pkg=${i%%: *}
if [[ $pkg != +([[:alnum:]><=.+_-:]) ]]; then
should do that?
> error "$(gettext "Invalid syntax for %s : '%s'")" "optdepend" "$i"
> ret=1
> fi
More information about the pacman-dev
mailing list