[arch-projects] [devtools][patch][makechrootpkg] Actually pass extra arguments to makepkg
Currently, if a user has extra arguments on the end of their makechrootpkg command it prints an error and does not add those arguments to the makepkg command line as expected. As far as I can tell it would have never worked this way because according to the specifications for getopts[1] if there is no ":" at the start of the argument list $OPTARG will not be set and $arg will be set to "?", but if there is a ":" $OPTARG will be set to the unknown argument. Unfortunately this means we can not easily get the argument to an unknown option. [1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html --- makechrootpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index d03b703..7e5f8e8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -66,7 +66,7 @@ usage() { exit 1 } -while getopts 'hcur:I:l:nTD:d:' arg; do +while getopts ':hcur:I:l:nTD:d:' arg; do case "$arg" in h) usage ;; c) clean_first=true ;; @@ -78,7 +78,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do l) copy="$OPTARG" ;; n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; T) temp_chroot=true; copy+="-$" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; + *) makepkg_args="$makepkg_args -$OPTARG" ;; esac done -- 1.9.0
On Mar 16, 2014 12:36 AM, "Joel Teichroeb" <joel@teichroeb.net> wrote:
Currently, if a user has extra arguments on the end of their
makechrootpkg command it prints an error and does not add those arguments to the makepkg command line as expected. As far as I can tell it would have never worked this way because according to the specifications for getopts[1] if there is no ":" at the start of the argument list $OPTARG will not be set and $arg will be set to "?", but if there is a ":" $OPTARG will be set to the unknown argument. Unfortunately this means we can not easily get the argument to an unknown option. This works just fine if you use the end-of-options delimiter to exit the getopts loop, e.g.: makechrootpkg /path/to/chroot -- -R
[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html --- makechrootpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/makechrootpkg.in b/makechrootpkg.in index d03b703..7e5f8e8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -66,7 +66,7 @@ usage() { exit 1 }
-while getopts 'hcur:I:l:nTD:d:' arg; do +while getopts ':hcur:I:l:nTD:d:' arg; do case "$arg" in h) usage ;; c) clean_first=true ;; @@ -78,7 +78,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do l) copy="$OPTARG" ;; n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; T) temp_chroot=true; copy+="-$" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; + *) makepkg_args="$makepkg_args -$OPTARG" ;; esac done
-- 1.9.0
I didn't know that -- would work. The documentation didn't mention that. The line "*) makepkg_args="$makepkg_args -$arg $OPTARG" ;;" is still wrong though as doing "--" will end getopt and then makepkg is called with ${*:$OPTIND} meaning that the parameters aren't handled by the getopts loop. Instead, how about this patch? It fixes the usage and removes the broken line. --- makechrootpkg.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index d03b703..fc17b8a 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -35,7 +35,7 @@ src_owner=${SUDO_USER:-$USER} usage() { echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]" echo ' Run this script in a PKGBUILD dir to build a package inside a' - echo ' clean chroot. All unrecognized arguments passed to this script' + echo ' clean chroot. All arguments passed to this script after --' echo ' will be passed to makepkg.' echo '' echo ' The chroot dir consists of the following directories:' @@ -78,7 +78,6 @@ while getopts 'hcur:I:l:nTD:d:' arg; do l) copy="$OPTARG" ;; n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; T) temp_chroot=true; copy+="-$$" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done -- 1.9.0 On Sat, Mar 15, 2014 at 9:48 PM, Dave Reisner <d@falconindy.com> wrote:
On Mar 16, 2014 12:36 AM, "Joel Teichroeb" <joel@teichroeb.net> wrote:
Currently, if a user has extra arguments on the end of their
makechrootpkg command it prints an error and does not add those arguments to the makepkg command line as expected. As far as I can tell it would have never worked this way because according to the specifications for getopts[1] if there is no ":" at the start of the argument list $OPTARG will not be set and $arg will be set to "?", but if there is a ":" $OPTARG will be set to the unknown argument. Unfortunately this means we can not easily get the argument to an unknown option.
This works just fine if you use the end-of-options delimiter to exit the getopts loop, e.g.:
makechrootpkg /path/to/chroot -- -R
[1]
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html
--- makechrootpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/makechrootpkg.in b/makechrootpkg.in index d03b703..7e5f8e8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -66,7 +66,7 @@ usage() { exit 1 }
-while getopts 'hcur:I:l:nTD:d:' arg; do +while getopts ':hcur:I:l:nTD:d:' arg; do case "$arg" in h) usage ;; c) clean_first=true ;; @@ -78,7 +78,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do l) copy="$OPTARG" ;; n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; T) temp_chroot=true; copy+="-$" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; + *) makepkg_args="$makepkg_args -$OPTARG" ;; esac done
-- 1.9.0
On Sat, Mar 15, 2014 at 10:09:30PM -0700, Joel Teichroeb wrote:
I didn't know that -- would work. The documentation didn't mention that.
The line "*) makepkg_args="$makepkg_args -$arg $OPTARG" ;;" is still wrong though as doing "--" will end getopt and then makepkg is called with $ {*:$OPTIND} meaning that the parameters aren't handled by the getopts loop. Instead, how about this patch? It fixes the usage and removes the broken line.
Sure, the code is clearly wrong here.
--- makechrootpkg.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/makechrootpkg.in b/makechrootpkg.in index d03b703..fc17b8a 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -35,7 +35,7 @@ src_owner=${SUDO_USER:-$USER} usage() { echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]" echo ' Run this script in a PKGBUILD dir to build a package inside a' - echo ' clean chroot. All unrecognized arguments passed to this script' + echo ' clean chroot. All arguments passed to this script after --'
This might be confusing if you're not familiar with the syntax for the end of options marker. You might want to reword this to make it more clear what you're referring to. Perhaps something like: Arguments passed to this script after the end-of-options marker (--), will be passed to makepkg.
echo ' will be passed to makepkg.' echo '' echo ' The chroot dir consists of the following directories:' @@ -78,7 +78,6 @@ while getopts 'hcur:I:l:nTD:d:' arg; do l) copy="$OPTARG" ;; n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; T) temp_chroot=true; copy+="-$$" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done -- 1.9.0
On Sat, Mar 15, 2014 at 9:48 PM, Dave Reisner <d@falconindy.com> wrote:
On Mar 16, 2014 12:36 AM, "Joel Teichroeb" <joel@teichroeb.net> wrote: > > Currently, if a user has extra arguments on the end of their makechrootpkg command it prints an error and does not add those arguments to the makepkg command line as expected. As far as I can tell it would have never worked this way because according to the specifications for getopts [1] if there is no ":" at the start of the argument list $OPTARG will not be set and $arg will be set to "?", but if there is a ":" $OPTARG will be set to the unknown argument. Unfortunately this means we can not easily get the argument to an unknown option.
This works just fine if you use the end-of-options delimiter to exit the getopts loop, e.g.:
makechrootpkg /path/to/chroot -- -R
> > [1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ getopts.html > --- > makechrootpkg.in | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/makechrootpkg.in b/makechrootpkg.in > index d03b703..7e5f8e8 100644 > --- a/makechrootpkg.in > +++ b/makechrootpkg.in > @@ -66,7 +66,7 @@ usage() { > exit 1 > } > > -while getopts 'hcur:I:l:nTD:d:' arg; do > +while getopts ':hcur:I:l:nTD:d:' arg; do > case "$arg" in > h) usage ;; > c) clean_first=true ;; > @@ -78,7 +78,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do > l) copy="$OPTARG" ;; > n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; > T) temp_chroot=true; copy+="-$" ;; > - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; > + *) makepkg_args="$makepkg_args -$OPTARG" ;; > esac > done > > -- > 1.9.0
participants (2)
-
Dave Reisner
-
Joel Teichroeb