zsh-workers
 help / color / mirror / code / Atom feed
From: Pea <zsh@raveland.org>
To: Peter Stephenson <pws@csr.com>
Cc: zsh-workers@sunsite.dk
Subject: Re: PATCH: cd -q (was Re: _canonical_path ...)
Date: Fri, 28 Mar 2008 09:16:03 +0100	[thread overview]
Message-ID: <20080328091603.4789ba27@raveland.org> (raw)
In-Reply-To: <20080327184502.09b2a535@news01>

Le Thu, 27 Mar 2008 18:45:02 +0000,
Peter Stephenson <pws@csr.com> a écrit :

> On Thu, 27 Mar 2008 12:15:25 +0000
> Peter Stephenson <pws@csr.com> wrote:
> > Any comments about the following proposal, which adds the -q option
> > to all relevant functions?  If it looks OK, I'll change the function
> > above to unsetopt PUSHD_NO_DUPS and use pushd -q/popd -q to sanitize
> > the directory with REPLY=$PWD and remove the fork.
> 
> Here is what I'm likely to commit.  It includes various related
> suggestions.  It doesn't include a new style for the canonical stuff.
> 
> Index: Completion/Unix/Type/_canonical_paths
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_canonical_paths,v
> retrieving revision 1.4
> diff -u -r1.4 _canonical_paths
> --- Completion/Unix/Type/_canonical_paths	27 Mar 2008 11:29:20
> -0000	1.4 +++ Completion/Unix/Type/_canonical_paths	27
> Mar 2008 18:42:17 -0000 @@ -15,42 +15,45 @@
>  
>  _canonical_paths_pwd() {
>    # Get the canonical directory name by changing to it.
> -  # To be run in a subshell.
> -  (( ${+functions[chpwd]} )) && unfunction chpwd
> -  setopt CHASE_LINKS
> -  cd $1 2>/dev/null && pwd
> +  integer chaselinks
> +  [[ -o chaselinks ]] && (( chaselinks = 1 ))
> +  setopt localoptions nopushdignoredups chaselinks
> +  if builtin pushd -q -- $1 2>/dev/null; then
> +    REPLY=$PWD
> +    (( chaselinks )) || unsetopt chaselinks
> +    builtin popd -q
> +  else
> +    REPLY=$1
> +  fi
>  }
>  
>  _canonical_paths_get_canonical_path() {
> -  typeset newfile dir
> +  typeset newfile nondir
>    typeset -A seen
>  
>    REPLY=$1
> -  # Resolve any trailing symbolic links, guarding against loops.
> -  while [[ -z ${seen[$REPLY]} ]]; do
> -    seen[$REPLY]=1
> -    newfile=()
> -    zstat -A newfile +link $REPLY 2>/dev/null
> -    if [[ -n $newfile[1] ]]; then
> -      REPLY=$newfile[1]
> -    else
> -      break
> -    fi
> -  done
> -
>    # Canonicalise the directory path.  We may not be able to
>    # do this if we can't read all components.
>    if [[ -d $REPLY ]]; then
> -    dir="$(_canonical_paths_pwd $REPLY)"
> -    if [[ -n $dir ]]; then
> -      REPLY=$dir
> -    fi
> -  elif [[ $REPLY = */*[^/] && $REPLY != /[^/]# ]]; then
> -    # Don't try this if there's a trailing slash or we're in
> -    # the root directory.
> -    dir="$(_canonical_paths_pwd ${REPLY%/*})"
> -    if [[ -n $dir ]]; then
> -      REPLY=$dir/${REPLY##*/}
> +    _canonical_paths_pwd $REPLY
> +  else
> +    # Resolve any trailing symbolic links, guarding against loops.
> +    while [[ -z ${seen[$REPLY]} ]]; do
> +      seen[$REPLY]=1
> +      newfile=()
> +      zstat -A newfile +link $REPLY 2>/dev/null
> +      if [[ -n $newfile[1] ]]; then
> +	REPLY=$newfile[1]
> +      else
> +	break
> +      fi
> +    done
> +    if [[ $REPLY = */*[^/] && $REPLY != /[^/]# ]]; then
> +      # Don't try this if there's a trailing slash or we're in
> +      # the root directory.
> +      nondir=${REPLY##*/#}
> +      _canonical_paths_pwd ${REPLY%/#*}
> +      REPLY+="/$nondir"
>      fi
>    fi
>  }
> Index: Doc/Zsh/builtins.yo
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Doc/Zsh/builtins.yo,v
> retrieving revision 1.103
> diff -u -r1.103 builtins.yo
> --- Doc/Zsh/builtins.yo	1 Feb 2008 19:59:45 -0000	1.103
> +++ Doc/Zsh/builtins.yo	27 Mar 2008 18:42:17 -0000
> @@ -152,16 +152,16 @@
>  module(cap)(zsh/cap)
>  findex(cd)
>  cindex(directories, changing)
> -xitem(tt(cd) [ tt(-sLP) ] [ var(arg) ])
> -xitem(tt(cd) [ tt(-sLP) ] var(old) var(new))
> -item(tt(cd) [ tt(-sLP) ] {tt(PLUS())|tt(-)}var(n))(
> +xitem(tt(cd) [ tt(-qsLP) ] [ var(arg) ])
> +xitem(tt(cd) [ tt(-qsLP) ] var(old) var(new))
> +item(tt(cd) [ tt(-qsLP) ] {tt(PLUS())|tt(-)}var(n))(
>  Change the current directory.  In the first form, change the
>  current directory to var(arg), or to the value of tt($HOME) if
>  var(arg) is not specified.  If var(arg) is `tt(-)', change to the
>  value of tt($OLDPWD), the previous directory.
>  
>  Otherwise, if var(arg) begins with a slash, attempt to change to the
> -director given by var(arg).
> +directory given by var(arg).
>  
>  If var(arg) does not begin with a slash, the behaviour depends on
> whether the current directory `tt(.)' occurs in the list of
> directories contained @@ -189,11 +189,17 @@
>  If the tt(PUSHD_MINUS) option is set, the meanings of `tt(PLUS())'
>  and `tt(-)' in this context are swapped.
>  
> +If the tt(-q) (quiet) option is specified, the hook function
> tt(chpwd) +and the functions in the array tt(chpwd_functions) are not
> called. +This is useful for calls to tt(cd) that do not change the
> environment +seen by an interactive user.
> +
>  If the tt(-s) option is specified, tt(cd) refuses to change the
> current directory if the given pathname contains symlinks.  If the
> tt(-P) option is given or the tt(CHASE_LINKS) option is set, symbolic
> links are resolved to their true values.  If the tt(-L) option is
> given symbolic links are -followed regardless of the state of the
> tt(CHASE_LINKS) option. +retained in the directory (and not resolved)
> regardless of the state of +the tt(CHASE_LINKS) option.
>  )
>  alias(chdir)(cd)
>  module(clone)(zsh/clone)
> @@ -795,7 +801,7 @@
>  )
>  prefix(noglob)
>  findex(popd)
> -item(tt(popd) [ {tt(PLUS())|tt(-)}var(n) ])(
> +item(tt(popd) [ [-q] {tt(PLUS())|tt(-)}var(n) ])(
>  Remove an entry from the directory stack, and perform a tt(cd) to
>  the new top directory.  With no argument, the current top entry is
>  removed.  An argument of the form `tt(PLUS())var(n)' identifies a
> stack @@ -804,6 +810,11 @@
>  pindex(PUSHD_MINUS, use of)
>  If the tt(PUSHD_MINUS) option is set, the meanings of `tt(PLUS())'
> and `tt(-)' in this context are swapped.
> +
> +If the tt(-q) (quiet) option is specified, the hook function
> tt(chpwd) +and the functions in the array tt($chpwd_functions) are
> not called, +and the new directory stack is not printed.  This is
> useful for calls to +tt(popd) that do not change the environment seen
> by an interactive user. )
>  findex(print)
>  xitem(tt(print) [ tt(-abcDilmnNoOpPrsz) ] [ tt(-u) var(n) ] [ tt(-f)
> var(format) ] [ tt(-C) var(cols) ]) @@ -935,9 +946,9 @@
>  pindex(PUSHD_MINUS, use of)
>  pindex(CDABLE_VARS, use of)
>  pindex(PUSHD_SILENT, use of)
> -xitem(tt(pushd) [ tt(-sLP) ] [ var(arg) ])
> -xitem(tt(pushd) [ tt(-sLP) ] var(old) var(new))
> -item(tt(pushd) [ tt(-sLP) ] {tt(PLUS())|tt(-)}var(n))(
> +xitem(tt(pushd) [ tt(-qsLP) ] [ var(arg) ])
> +xitem(tt(pushd) [ tt(-qsLP) ] var(old) var(new))
> +item(tt(pushd) [ tt(-qsLP) ] {tt(PLUS())|tt(-)}var(n))(
>  Change the current directory, and push the old current directory
>  onto the directory stack.  In the first form, change the
>  current directory to var(arg).
> @@ -956,8 +967,14 @@
>  from the right.  If the tt(PUSHD_MINUS) option is set, the meanings
>  of `tt(PLUS())' and `tt(-)' in this context are swapped.
>  
> -If the option tt(PUSHD_SILENT) is not set, the directory
> -stack will be printed after a tt(pushd) is performed.
> +If the tt(-q) (quiet) option is specified, the hook function
> tt(chpwd) +and the functions in the array tt($chpwd_functions) are
> not called, +and the new directory stack is not printed.  This is
> useful for calls to +tt(pushd) that do not change the environment
> seen by an interactive user. +
> +If the option tt(-q) is not specified and the shell option
> tt(PUSHD_SILENT) +is not set, the directory stack will be printed
> after a tt(pushd) is +performed.
>  
>  The options tt(-s), tt(-L) and tt(-P) have the same meanings as for
> the tt(cd) builtin.
> Index: Src/builtin.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/builtin.c,v
> retrieving revision 1.188
> diff -u -r1.188 builtin.c
> --- Src/builtin.c	2 Mar 2008 21:21:53 -0000	1.188
> +++ Src/builtin.c	27 Mar 2008 18:42:18 -0000
> @@ -50,8 +50,8 @@
>      BUILTIN("bg", 0, bin_fg, 0, -1, BIN_BG, NULL, NULL),
>      BUILTIN("break", BINF_PSPECIAL, bin_break, 0, 1, BIN_BREAK,
> NULL, NULL), BUILTIN("bye", 0, bin_break, 0, 1, BIN_EXIT, NULL, NULL),
> -    BUILTIN("cd", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_CD, "sPL", NULL),
> -    BUILTIN("chdir", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_CD, "sPL", NULL),
> +    BUILTIN("cd", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_CD, "qsPL", NULL),
> +    BUILTIN("chdir", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_CD, "qsPL", NULL),
> BUILTIN("continue", BINF_PSPECIAL, bin_break, 0, 1, BIN_CONTINUE,
> NULL, NULL), BUILTIN("declare", BINF_PLUSOPTS | BINF_MAGICEQUALS |
> BINF_PSPECIAL, bin_typeset, 0, -1, 0,
> "AE:%F:%HL:%R:%TUZ:%afghi:%klmprtuxz", NULL), BUILTIN("dirs", 0,
> bin_dirs, 0, -1, 0, "clpv", NULL), @@ -98,10 +98,10 @@
> BUILTIN("patdebug", 0, bin_patdebug, 1, -1, 0, "p", NULL), #endif 
> -    BUILTIN("popd", 0, bin_cd, 0, 1, BIN_POPD, NULL, NULL),
> +    BUILTIN("popd", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 1, BIN_POPD, "q", NULL),
> BUILTIN("print", BINF_PRINTOPTS, bin_print, 0, -1, BIN_PRINT,
> "abcC:Df:ilmnNoOpPrRsu:z-", NULL), BUILTIN("printf", 0, bin_print, 1,
> -1, BIN_PRINTF, NULL, NULL),
> -    BUILTIN("pushd", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_PUSHD, "sPL", NULL),
> +    BUILTIN("pushd", BINF_SKIPINVALID | BINF_SKIPDASH |
> BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_PUSHD, "qsPL", NULL),
> BUILTIN("pushln", 0, bin_print, 0, -1, BIN_PRINT, NULL, "-nz"),
> BUILTIN("pwd", 0, bin_pwd, 0, 0, 0, "rLP", NULL), BUILTIN("r", 0,
> bin_fc, 0, -1, BIN_R, "nrl", NULL), @@ -788,7 +788,7 @@
>  	unqueue_signals();
>  	return 1;
>      }
> -    cd_new_pwd(func, dir);
> +    cd_new_pwd(func, dir, OPT_ISSET(ops, 'q'));
>  
>      if (stat(unmeta(pwd), &st1) < 0) {
>  	setjobpwd();
> @@ -1087,7 +1087,7 @@
>  
>  /**/
>  static void
> -cd_new_pwd(int func, LinkNode dir)
> +cd_new_pwd(int func, LinkNode dir, int quiet)
>  {
>      char *new_pwd, *s;
>      int dirstacksize;
> @@ -1127,7 +1127,7 @@
>  
>      if (isset(INTERACTIVE)) {
>  	if (func != BIN_CD) {
> -            if (unset(PUSHDSILENT))
> +            if (unset(PUSHDSILENT) && !quiet)
>  	        printdirstack();
>          } else if (doprintdir) {
>  	    fprintdir(pwd, stdout);
> @@ -1138,7 +1138,8 @@
>      /* execute the chpwd function */
>      fflush(stdout);
>      fflush(stderr);
> -    callhookfunc("chpwd", NULL, 1);
> +    if (!quiet)
> +	callhookfunc("chpwd", NULL, 1);
>  
>      dirstacksize = getiparam("DIRSTACKSIZE");
>      /* handle directory stack sizes out of range */
> 

Hi,

Builds and works fine on OpenBSD.
umount [TAB] works correctly.

Regards,


-- 
Pierre-Emmanuel André <pea at raveland.org>
GPG key: 0x7AE329DC


  reply	other threads:[~2008-03-28  8:16 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-26 10:44 _canonical_path not working on *BSD 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
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 [this message]
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=20080328091603.4789ba27@raveland.org \
    --to=zsh@raveland.org \
    --cc=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).