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<[email protected]>  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<[email protected]>
---
  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

Reply via email to