From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk
Subject: Re: _canonical_path not working on *BSD
Date: Wed, 26 Mar 2008 16:21:51 +0000 [thread overview]
Message-ID: <200803261621.m2QGLptV017966@news01.csr.com> (raw)
In-Reply-To: <200803261604.m2QG41Ke017772@news01.csr.com>
Peter Stephenson wrote:
> Hmm... sorry about all the traffic... actually, it still doesn't
> guarantee to give a canonical path as "readlink -f" does, since it
> doesn't check if the value returned is itself a symbolic link, and also
> it returns empty instead of the original file if it wasn't a link. We would
> need to do something like the following... if I've correctly divined
> that the intention in both cases is that if a file exists at all we
> should always use the name, but converted to the canonical form.
Sigh. Or even this. This time, I've guarded against loops in the
symbolic links.
I'm still not quite sure what the test of the status from readlink in
the second case was for, seeing as "readlink -qf /nonexistent" returns
status 0. I've interpreted it as a test for a file that actually
exists. In the present context it may not matter.
Index: Completion/Unix/Type/_canonical_paths
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_canonical_paths,v
retrieving revision 1.1
diff -u -r1.1 _canonical_paths
--- Completion/Unix/Type/_canonical_paths 28 May 2006 18:36:06 -0000 1.1
+++ Completion/Unix/Type/_canonical_paths 26 Mar 2008 16:16:14 -0000
@@ -27,18 +27,38 @@
shift 2
-if (( ! $+commands[readlink] )); then
+if ! zmodload -F zsh/stat b:zstat 2>/dev/null; then
_wanted "$tag" expl "$desc" compadd $__gopts $@ && ret=0
return ret
fi
+typeset REPLY
typeset -a matches files
+_canonical_paths_get_canonical_path() {
+ typeset newfile
+ typeset -A seen
+
+ REPLY=$1
+ # Guard against loops.
+ while [[ -z ${seen[$REPLY]} ]]; do
+ seen[$REPLY]=1
+ newfile=$(zstat +link $REPLY 2>/dev/null)
+ if [[ -n $newfile ]]; then
+ REPLY=$newfile
+ else
+ break
+ fi
+ done
+}
+
+
if (( $__opts[(I)-N] )); then
files=($@)
else
for __index in $@; do
- files+=$(readlink -qf $__index)
+ _canonical_paths_get_canonical_path $__index
+ files+=($REPLY)
done
fi
@@ -48,8 +68,9 @@
expref=${~origpref}
[[ $origpref == (|*/). ]] && rltrim=.
curpref=${${expref%$rltrim}:-./}
- canpref=$(readlink -qf $curpref)
- if [[ $? -eq 0 ]]; then
+ if zstat $curpref >&/dev/null; then
+ _canonical_paths_get_canonical_path $curpref
+ canpref=$REPLY
[[ $curpref == */ && $canpref == *[^/] ]] && canpref+=/
canpref+=$rltrim
[[ $expref == *[^/] && $canpref == */ ]] && origpref+=/
--
Peter Stephenson <pws@csr.com> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
next prev parent reply other threads:[~2008-03-26 16:22 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-26 10:44 Baptiste Daroussin
2008-03-26 15:01 ` Debian bugs (Re: _canonical_path not working on *BSD) Bart Schaefer
2008-03-26 15:25 ` Clint Adams
2008-03-26 15:05 ` _canonical_path not working on *BSD Peter Stephenson
2008-03-26 15:27 ` Baptiste Daroussin
2008-03-26 15:34 ` Peter Stephenson
2008-03-26 15:51 ` Pea
2008-03-26 15:59 ` Clint Adams
2008-03-26 15:21 ` Pea
2008-03-26 15:36 ` Bart Schaefer
2008-03-26 15:40 ` Peter Stephenson
2008-03-26 16:04 ` Peter Stephenson
2008-03-26 16:18 ` Bart Schaefer
2008-03-26 16:21 ` Peter Stephenson [this message]
2008-03-26 16:38 ` Pea
2008-03-26 16:46 ` Peter Stephenson
2008-03-26 17:08 ` Pea
2008-03-26 17:17 ` Baptiste Daroussin
2008-03-27 10:23 ` Peter Stephenson
2008-03-27 11:08 ` Pea
2008-03-27 11:25 ` Peter Stephenson
2008-03-27 12:15 ` PATCH: cd -q (was Re: _canonical_path ...) Peter Stephenson
2008-03-27 12:25 ` Stephane Chazelas
2008-03-27 12:35 ` Mikael Magnusson
2008-03-27 12:48 ` Peter Stephenson
2008-03-27 12:56 ` Mikael Magnusson
2008-03-27 18:45 ` Peter Stephenson
2008-03-28 8:16 ` Pea
2008-03-28 11:01 ` Mikael Magnusson
2008-03-28 14:35 ` Peter Stephenson
2008-03-27 12:31 ` _canonical_path not working on *BSD Pea
2008-03-27 15:39 ` Bart Schaefer
2008-03-27 18:06 ` Peter Stephenson
2008-03-28 1:01 ` Bart Schaefer
2008-03-28 7:51 ` Mikael Magnusson
2008-03-28 10:01 ` Peter Stephenson
2008-03-26 16:25 ` Pea
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200803261621.m2QGLptV017966@news01.csr.com \
--to=pws@csr.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).