[pacman-dev] [PATCH] makepkg: canonicalize paths from environmental variables

Allan McRae allan at archlinux.org
Tue Oct 5 01:22:23 EDT 2010


On 04/10/10 23:11, Dave Reisner wrote:
> On Mon, Oct 04, 2010 at 06:57:17AM -0500, Dan McGee wrote:
>> On Mon, Oct 4, 2010 at 5:28 AM, Dave Reisner<d at falconindy.com>  wrote:
>>> On Mon, Oct 04, 2010 at 03:01:50PM +1000, Allan McRae wrote:
>>>> This prevents circular symlinks and weird final package locations
>>>> when using commands like  'PKGDEST="." makepkg'.
>>>>
>>>> Fixes FS#20922.
>>>>
>>>> Signed-off-by: Allan McRae<allan at archlinux.org>
>>>> ---
>>>>   scripts/makepkg.sh.in |   21 +++++++++++++++++----
>>>>   1 files changed, 17 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
>>>> index 9bcd446..ccf4213 100644
>>>> --- a/scripts/makepkg.sh.in
>>>> +++ b/scripts/makepkg.sh.in
>>>> @@ -1410,6 +1410,19 @@ run_split_packaging() {
>>>>        done
>>>>   }
>>>>
>>>> +# Canonicalize a path if it exists
>>>> +canonicalize_path() {
>>>> +     local path=$1;
>>>> +
>>>> +     if [[ -d $path ]]; then
>>>> +             cd $path
>>>> +             path=$(pwd)
>>>> +             cd -&>/dev/null
>>>> +     fi
>>>> +
>>>> +     echo $path
>>>> +}
>>>> +
>>>>   # getopt like parser
>>>>   parse_options() {
>>>>        local short_options=$1; shift;
>>>> @@ -1615,10 +1628,10 @@ while true; do
>>>>        shift
>>>>   done
>>>>
>>>> -#preserve environment variables
>>>> -_PKGDEST=${PKGDEST}
>>>> -_SRCDEST=${SRCDEST}
>>>> -_SRCPKGDEST=${SRCPKGDEST}
>>>> +# preserve environment variables and canonicalize path
>>>> +[[ -n ${PKGDEST} ]]&&  _PKGDEST=$(canonicalize_path ${PKGDEST})
>>>> +[[ -n ${SRCDEST} ]]&&  _SRCDEST=$(canonicalize_path ${SRCDEST})
>>>> +[[ -n ${SRCPKGDEST} ]]&&  _SRCPKGDEST=$(canonicalize_path ${SRCPKGDEST})
>>>>
>>>>   # default config is makepkg.conf
>>>>   MAKEPKG_CONF=${MAKEPKG_CONF:-$confdir/makepkg.conf}
>>>> --
>>>> 1.7.3.1
>>>>
>>>>
>>>>
>>>
>>> Your cd inside the if needs quoting, and you can get away with just
>>> referencing $PWD instead of forking to pwd (GNU coreutils just returns
>>> $PWD anyways). However, using pwd might have an advantage. The -P flag
>>> will resolve symlinks, and it seems to be common in other 'nixes. This
>>> would solve the case of multiple nested symlinks.
>>
>> pwd is actually a shell builtin, no? I agree with the quoting
>> suggestions, and also wonder if it is worth using a subshell construct
>> here so you don't even have to worry about the 'cd -' business.
>>
>> $ type pwd
>> pwd is a shell builtin
>>
>> -Dan
>>
>
> Hmm, I might have interpreted things incorrectly based on the man pages
> I found. If it's a builtin, that's even better.
>
> Using a subshell would destroy any variable set inside of it. You'd need
> to alter Allan's solution slightly, e.g.
>
> canonicalize_path() {
>    path=$1
>
>    if [[ -d $path ]]; then
>      (
>        cd "$path"
>        pwd -P
>      )
>    else
>      echo "$path"
>    fi
> }

Updated patch taking this approach:
http://projects.archlinux.org/users/allan/pacman.git/commit/?h=working&id=8c3d2959

Allan


More information about the pacman-dev mailing list