From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2484 invoked from network); 27 Mar 2008 12:16:19 -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; 27 Mar 2008 12:16:19 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 77003 invoked from network); 27 Mar 2008 12:16:12 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 27 Mar 2008 12:16:12 -0000 Received: (qmail 5386 invoked by alias); 27 Mar 2008 12:16:07 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 24760 Received: (qmail 5368 invoked from network); 27 Mar 2008 12:16:07 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 27 Mar 2008 12:16:07 -0000 Received: from cluster-g.mailcontrol.com (cluster-g.mailcontrol.com [85.115.41.190]) by bifrost.dotsrc.org (Postfix) with ESMTP id 42E1382CD267 for ; Thu, 27 Mar 2008 13:15:56 +0100 (CET) Received: from cameurexb01.EUROPE.ROOT.PRI ([62.189.241.200]) by rly11g.srv.mailcontrol.com (MailControl) with ESMTP id m2RCFW4c008659 for ; Thu, 27 Mar 2008 12:15:37 GMT Received: from news01 ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.3959); Thu, 27 Mar 2008 12:15:25 +0000 Date: Thu, 27 Mar 2008 12:15:25 +0000 From: Peter Stephenson To: zsh-workers@sunsite.dk Subject: PATCH: cd -q (was Re: _canonical_path ...) Message-ID: <20080327121525.5b4059f9@news01> In-Reply-To: <20080327112506.7298e9ef@news01> References: <20080326114413.80713vrmznwpnyuc@bapt.selfip.org> <080326083638.ZM16858@torch.brasslantern.com> <200803261540.m2QFeJmm017381@news01.csr.com> <200803261604.m2QG41Ke017772@news01.csr.com> <200803261621.m2QGLptV017966@news01.csr.com> <20080326173824.0a55c00d@coredump.raveland.priv> <20080326164615.1d5893ed@news01> <20080327102325.55808716@news01> <20080327120807.415095ee@raveland.org> <20080327112506.7298e9ef@news01> Organization: CSR X-Mailer: Claws Mail 3.3.1 (GTK+ 2.12.5; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Mar 2008 12:15:25.0699 (UTC) FILETIME=[3CF49530:01C89004] X-Scanned-By: MailControl A-08-00-04 (www.mailcontrol.com) on 10.71.0.121 X-Virus-Scanned: ClamAV 0.91.2/6421/Thu Mar 27 09:54:20 2008 on bifrost X-Virus-Status: Clean On Thu, 27 Mar 2008 11:25:06 +0000 Peter Stephenson wrote: > I thought unfunction was silent if a function didn't exist, as is now > true of (and required for) unset, but apparently not. > +_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 > +} The more I think about this (and I'd really like to stop now), the more wrong it seems to me that it's so hard to get the shell to cd without side effects. Indeed, the patch above is incomplete since it omits the new chpwd_functions array, and I haven't work out a foolproof way of suppressing the effect of chpwd without forking the shell. chpwd will typically print a bogus directory to the terminal title bar, which is to be avoided; but it can in principle do anything and if we're not sticking around in the directory the interactive environment really doesn't need to care about the cd. 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. 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 11:49:30 -0000 @@ -152,9 +152,9 @@ 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 @@ -189,6 +189,11 @@ 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 @@ -795,7 +800,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 +809,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 +945,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 +966,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 11:49:31 -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 */ -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070