[pacman-dev] [PATCH] repo-add: added a realpath implementation in bash
Allan McRae
allan at archlinux.org
Wed Feb 11 04:15:44 EST 2009
Yun Zheng Hu wrote:
> When realpath or readlink is not available it will fallback to a
> realpath implementation in bash. An extra check is also added for
> "readlink -f", because not all platforms support the -f flag.
>
> The readlink implementation in bash is borrowed from Debian's dpkg tools.
>
> Signed-off-by: Yun Zheng Hu <yunzheng.hu at gmail.com>
> ---
> scripts/repo-add.sh.in | 23 ++++++++++++++++++++---
> 1 files changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
> index c89e2a5..ea16731 100644
> --- a/scripts/repo-add.sh.in
> +++ b/scripts/repo-add.sh.in
> @@ -297,11 +297,28 @@ fi
> # check for and store the name of a realpath-like program
> if [ $(type -t realpath) ]; then
> realpath='realpath'
> -elif [ $(type -t readlink) ]; then
> +elif [ $(type -t readlink) -a "$(readlink -f . 2>/dev/null)" != "" ]; then
> realpath='readlink -f'
> else
> - error "$(gettext "Either realpath or readlink are required by repo-add.")"
> - exit 1 # $E_MISSING_PROGRAM
> + realpath_bash()
> + {
> + fname=${1%/} # strips trailing '/'
> + while [ -L "$fname" ]; do
> + oldfname="$fname"
> + fname="$(command ls -l $fname)"
> + fname="${fname#*\> }"
> + if [ "$fname" = . ] ; then
> + fname="$(dirname $oldfname)"
> + elif echo $fname | grep -vq '^/' - ; then
> + fname="$(dirname $oldfname)/$fname"
> + fi
> + done
> + pushd $(dirname $fname) > /dev/null
> + fname=$(pwd -P)/$(basename $fname)
> + popd > /dev/null
> + echo $fname
> + }
> + realpath=realpath_bash
> fi
>
> # main routine
>
I haven't looked at this in detail yet, but if this solution is more
portable and has no feature loss, why not use it by default?
Allan
More information about the pacman-dev
mailing list