From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26586 invoked from network); 26 Mar 2008 16:06:06 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.2.4 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 26 Mar 2008 16:06:06 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 16293 invoked from network); 26 Mar 2008 16:06:00 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 26 Mar 2008 16:06:00 -0000 Received: (qmail 24142 invoked by alias); 26 Mar 2008 16:05:57 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 24748 Received: (qmail 24130 invoked from network); 26 Mar 2008 16:05:56 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 26 Mar 2008 16:05:56 -0000 Received: from cluster-d.mailcontrol.com (cluster-d.mailcontrol.com [217.69.20.190]) by bifrost.dotsrc.org (Postfix) with ESMTP id 3F0CC8097826 for ; Wed, 26 Mar 2008 17:05:47 +0100 (CET) Received: from rly19d.srv.mailcontrol.com (localhost.localdomain [127.0.0.1]) by rly19d.srv.mailcontrol.com (MailControl) with ESMTP id m2QG5bbc013816 for ; Wed, 26 Mar 2008 16:05:46 GMT Received: from submission.mailcontrol.com (submission.mailcontrol.com [86.111.216.190]) by rly19d.srv.mailcontrol.com (MailControl) id m2QG4bSE011173 for zsh-workers@sunsite.dk; Wed, 26 Mar 2008 16:04:37 GMT Received: from cameurexb01.EUROPE.ROOT.PRI ([62.189.241.200]) by rly19d-eth0.srv.mailcontrol.com (envelope-sender Peter.Stephenson@csr.com) (MIMEDefang) with ESMTP id m2QG47Tu007194; Wed, 26 Mar 2008 16:04:36 +0000 (GMT) Received: from news01.csr.com ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.3959); Wed, 26 Mar 2008 16:04:00 +0000 Received: from news01.csr.com (localhost.localdomain [127.0.0.1]) by news01.csr.com (8.14.2/8.13.4) with ESMTP id m2QG41cQ017775; Wed, 26 Mar 2008 16:04:01 GMT Received: from csr.com (pws@localhost) by news01.csr.com (8.14.2/8.14.2/Submit) with ESMTP id m2QG41Ke017772; Wed, 26 Mar 2008 16:04:01 GMT Message-Id: <200803261604.m2QG41Ke017772@news01.csr.com> X-Authentication-Warning: news01.csr.com: pws owned process doing -bs To: Baptiste Daroussin , zsh-workers@sunsite.dk Subject: Re: _canonical_path not working on *BSD In-reply-to: <200803261540.m2QFeJmm017381@news01.csr.com> References: <20080326114413.80713vrmznwpnyuc@bapt.selfip.org> <080326083638.ZM16858@torch.brasslantern.com> <200803261540.m2QFeJmm017381@news01.csr.com> Comments: In-reply-to Peter Stephenson message dated "Wed, 26 Mar 2008 15:40:19 +0000." Date: Wed, 26 Mar 2008 16:04:01 +0000 From: Peter Stephenson X-OriginalArrivalTime: 26 Mar 2008 16:04:00.0948 (UTC) FILETIME=[0177BF40:01C88F5B] X-Scanned-By: MailControl A-08-00-04 (www.mailcontrol.com) on 10.68.1.129 X-Virus-Scanned: ClamAV 0.91.2/6396/Wed Mar 26 12:29:12 2008 on bifrost X-Virus-Status: Clean Peter Stephenson wrote: > Bart Schaefer wrote: > > On Mar 26, 11:44am, Baptiste Daroussin wrote: > > } > > } _canonical_path is not working on freebsd, it rely on readlink > > > > Try this. I don't actually have any mount points that are symlink > > targets so it's hard to test, but I think this is right: > > > > -if (( ! $+commands[readlink] )); then > > +if ! zmodload -F zsh/stat b:zstat 2>/dev/null; then > > That's probably a better solution; it doesn't necessarily work on all > systems, particularly if the shell is statically linked, but it should > be at least as widely applicable as, and easier to test for than, > anything involving readlink. 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. 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 15:58:52 -0000 @@ -27,18 +27,28 @@ 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 addfile newfile typeset -a matches files if (( $__opts[(I)-N] )); then files=($@) else for __index in $@; do - files+=$(readlink -qf $__index) + addfile=$__index + while true; do + newfile=$(zstat +link $addfile) + if [[ -n $newfile ]]; then + addfile=$newfile + else + break + fi + done + files+=($addfile) done fi @@ -48,8 +58,18 @@ expref=${~origpref} [[ $origpref == (|*/). ]] && rltrim=. curpref=${${expref%$rltrim}:-./} - canpref=$(readlink -qf $curpref) - if [[ $? -eq 0 ]]; then + if zstat $curpref >&/dev/null; then + canpref=$curpref + while true; do + newfile=$(zstat +link $canpref) + if [[ -n $newfile ]]; then + canpref=$newfile + else + break + fi + done + fi + if [[ -n "$canpref" ]]; then [[ $curpref == */ && $canpref == *[^/] ]] && canpref+=/ canpref+=$rltrim [[ $expref == *[^/] && $canpref == */ ]] && origpref+=/ -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070