From: Peter Stephenson <p.w.stephenson@ntlworld.com>
To: zsh-workers@zsh.org
Subject: Re: 5.0.3 +* -> git completion regression
Date: Mon, 16 Dec 2013 22:08:45 +0000 [thread overview]
Message-ID: <20131216220845.2108e18b@pws-pc.ntlworld.com> (raw)
In-Reply-To: <20131216103726.GA25715@redoubt.spodhuis.org>
On Mon, 16 Dec 2013 05:37:26 -0500
Phil Pennock <zsh-workers+phil.pennock@spodhuis.org> wrote:
> On 2013-12-16 at 09:47 +0000, Peter Stephenson wrote:
> > On Mon, 16 Dec 2013 03:14:37 -0500
> > Phil Pennock <zsh-workers+phil.pennock@spodhuis.org> wrote:
> > > % git push origin <TAB>
> > > __git_complete_remote_or_refspec:33: bad pattern: +*
> >
> > I can't think of any circumstance where +* should be a bad pattern. Is
> > this easy to reproduce in a simple example?
>
> Finally managed it. It seems that the _git wrapper has a function
> __git_zsh_bash_func() which does "emulate -L ksh" and somehow that
> breaks when calling into the functions, while sourcing the file under
> sticky sh emulation (via "emulate sh -c") overrides that ksh context and
> fixes this.
>
> % zsh -f
> ilmenite% emulate ksh
> ilmenite% case "$foo" in +*) echo snert;; esac
> zsh: bad pattern: +*
Thanks. This is an efficient fix, so I hope it's good enough --- I've
added a regression test, and it seems to be.
Another good workout with some sh scripts or functions would be useful.
diff --git a/Src/pattern.c b/Src/pattern.c
index a7ef125..b79c3b4 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -1265,12 +1265,18 @@ patcomppiece(int *flagp, int paren)
* the character following is an end-of-segment character. Thus
* tildes are not special if there is nothing following to
* be excluded.
+ *
+ * Don't look for X()-style kshglobs at this point; we've
+ * checked above for the case with parentheses and we don't
+ * want to match without parentheses.
*/
- if (kshchar || (memchr(zpc_special, *patparse, ZPC_COUNT) &&
- (*patparse != zpc_special[ZPC_TILDE] ||
- patparse[1] == '/' ||
- !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT))))
+ if (kshchar ||
+ (memchr(zpc_special, *patparse, ZPC_NO_KSH_GLOB) &&
+ (*patparse != zpc_special[ZPC_TILDE] ||
+ patparse[1] == '/' ||
+ !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT)))) {
break;
+ }
}
/* Remember the previous character for backtracking */
diff --git a/Src/zsh.h b/Src/zsh.h
index a935d23..c86d2a6 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1417,7 +1417,11 @@ enum zpc_chars {
ZPC_HAT, /* ^ for exclusion (extended glob) */
ZPC_HASH, /* # for repetition (extended glob) */
ZPC_BNULLKEEP, /* Special backslashed null not removed */
- ZPC_KSH_QUEST, /* ? for ?(...) in KSH_GLOB */
+ /*
+ * These characters are only valid before a parenthesis
+ */
+ ZPC_NO_KSH_GLOB,
+ ZPC_KSH_QUEST = ZPC_NO_KSH_GLOB, /* ? for ?(...) in KSH_GLOB */
ZPC_KSH_STAR, /* * for *(...) in KSH_GLOB */
ZPC_KSH_PLUS, /* + for +(...) in KSH_GLOB */
ZPC_KSH_BANG, /* ! for !(...) in KSH_GLOB */
diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst
index 81b0021..1f8f652 100644
--- a/Test/D02glob.ztst
+++ b/Test/D02glob.ztst
@@ -499,3 +499,30 @@
)
0:No error with empty null glob with (N).
>
+
+ (setopt kshglob
+ test_array=(
+ '+fours' '+*'
+ '@titude' '@*'
+ '!bang' '!*'
+ # and check they work in the real kshglob cases too...
+ '+bus+bus' '+(+bus|-car)'
+ '@sinhats' '@(@sinhats|wrensinfens)'
+ '!kerror' '!(!somethingelse)'
+ # and these don't match, to be sure
+ '+more' '+(+less)'
+ '@all@all' '@(@all)'
+ '!goesitall' '!(!goesitall)'
+ )
+ for str pat in $test_array; do
+ eval "[[ $str = $pat ]]" && print "$str matches $pat"
+ done
+ true
+ )
+0:kshglob option does not break +, @, ! without following open parenthesis
+>+fours matches +*
+>@titude matches @*
+>!bang matches !*
+>+bus+bus matches +(+bus|-car)
+>@sinhats matches @(@sinhats|wrensinfens)
+>!kerror matches !(!somethingelse)
--
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
next prev parent reply other threads:[~2013-12-16 22:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-16 8:14 Phil Pennock
2013-12-16 9:47 ` Peter Stephenson
2013-12-16 10:37 ` Phil Pennock
2013-12-16 15:56 ` Bart Schaefer
2013-12-16 22:08 ` Peter Stephenson [this message]
2013-12-17 17:48 ` Phil Pennock
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=20131216220845.2108e18b@pws-pc.ntlworld.com \
--to=p.w.stephenson@ntlworld.com \
--cc=zsh-workers@zsh.org \
/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).