git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git ls-files wildcard behavior considered harmful
@ 2015-03-30 23:04 Joey Hess
  2015-03-30 23:16 ` Duy Nguyen
  2015-03-30 23:24 ` Jonathan Nieder
  0 siblings, 2 replies; 6+ messages in thread
From: Joey Hess @ 2015-03-30 23:04 UTC (permalink / raw)
  To: git

I was very surprised to learn the other day that git ls-files 'foo*'
will expand wildcards (including character classes), in the absence of
expansion by the shell. (git version 2.1.4)

joey@darkstar:~/tmp/aaa>git ls-files 'foo*bar'
foo*bar
foobazbar
joey@darkstar:~/tmp/aaa>git ls-files '[abc]'
[abc]
a
b

As far as I can see this behavior is not documented on the man page,
except for a tiny mention in the --with-tree documentation, where
it says "<file> (i.e. path pattern)".

Since I wanted to avoid this wildcard expension, I tried slash-escaping
the wildcard characters. This works:

joey@darkstar:~/tmp/aaa>git ls-files 'foo\*bar'
foo*bar
joey@darkstar:~/tmp/aaa>git ls-files '\[abc\]'
[abc]

But, there is a weird behavior here with subdirectories. While normally
ls-files would recurse, slash-escaped wildcard characters in the directory
name prevent recursion.

joey@darkstar:~/tmp/aaa>git ls-files 'foo[d]'
foo[d]/subfile
food
joey@darkstar:~/tmp/aaa>git ls-files 'foo\[d\]'
joey@darkstar:~/tmp/aaa>

The above example shows a case where it's impossible to get ls-files
to only list files in a directory and not other files that match the
wildcard. This seems like it must be a bug, and it means it's impossible
to reliably work around the wildcard expansion behavior.

I suspect that this wildcard expansion behavior is useful somewhere.
But from the perspective of using ls-files as plumbing, where you want
to get out some subset of what was put in, it's not nice.

-- 
see shy jo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: git ls-files wildcard behavior considered harmful
  2015-03-30 23:04 git ls-files wildcard behavior considered harmful Joey Hess
@ 2015-03-30 23:16 ` Duy Nguyen
  2015-03-30 23:36   ` Joey Hess
  2015-03-30 23:24 ` Jonathan Nieder
  1 sibling, 1 reply; 6+ messages in thread
From: Duy Nguyen @ 2015-03-30 23:16 UTC (permalink / raw)
  To: Joey Hess; +Cc: Git Mailing List

On Tue, Mar 31, 2015 at 6:04 AM, Joey Hess <id@joeyh.name> wrote:
> I was very surprised to learn the other day that git ls-files 'foo*'
> will expand wildcards (including character classes), in the absence of
> expansion by the shell. (git version 2.1.4)
>
> joey@darkstar:~/tmp/aaa>git ls-files 'foo*bar'
> foo*bar
> foobazbar
> joey@darkstar:~/tmp/aaa>git ls-files '[abc]'
> [abc]
> a
> b
>
> As far as I can see this behavior is not documented on the man page,
> except for a tiny mention in the --with-tree documentation, where
> it says "<file> (i.e. path pattern)".
>
> Since I wanted to avoid this wildcard expension, I tried slash-escaping
> the wildcard characters.

You can do "git --literal-pathspecs ls-files ..." or set GIT_LITERAL_PATHSPECS.
-- 
Duy

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: git ls-files wildcard behavior considered harmful
  2015-03-30 23:04 git ls-files wildcard behavior considered harmful Joey Hess
  2015-03-30 23:16 ` Duy Nguyen
@ 2015-03-30 23:24 ` Jonathan Nieder
  1 sibling, 0 replies; 6+ messages in thread
From: Jonathan Nieder @ 2015-03-30 23:24 UTC (permalink / raw)
  To: Joey Hess; +Cc: git, Nguyễn Thái Ngọc Duy

Hi Joey,

Joey Hess wrote:

> Since I wanted to avoid this wildcard expension, I tried slash-escaping
> the wildcard characters. This works:
>
> joey@darkstar:~/tmp/aaa>git ls-files 'foo\*bar'
> foo*bar

Does 'git --noglob-pathspecs' help?

Curious,
Jonathan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: git ls-files wildcard behavior considered harmful
  2015-03-30 23:16 ` Duy Nguyen
@ 2015-03-30 23:36   ` Joey Hess
  2015-03-31  0:09     ` Jeff King
  2015-03-31  0:35     ` Duy Nguyen
  0 siblings, 2 replies; 6+ messages in thread
From: Joey Hess @ 2015-03-30 23:36 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Git Mailing List

[-- Attachment #1: Type: text/plain, Size: 367 bytes --]

Duy Nguyen wrote:
> You can do "git --literal-pathspecs ls-files ..." or set GIT_LITERAL_PATHSPECS.

Thanks! --literal-pathspecs does allow getting around this.

Now I'm wondering what other parts of plumbing might be doing globbing
that I did not anticipate. Maybe I should set the environment variable
so I don't need to worry about it..

-- 
see shy jo

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: git ls-files wildcard behavior considered harmful
  2015-03-30 23:36   ` Joey Hess
@ 2015-03-31  0:09     ` Jeff King
  2015-03-31  0:35     ` Duy Nguyen
  1 sibling, 0 replies; 6+ messages in thread
From: Jeff King @ 2015-03-31  0:09 UTC (permalink / raw)
  To: Joey Hess; +Cc: Duy Nguyen, Git Mailing List

On Mon, Mar 30, 2015 at 07:36:14PM -0400, Joey Hess wrote:

> Duy Nguyen wrote:
> > You can do "git --literal-pathspecs ls-files ..." or set GIT_LITERAL_PATHSPECS.
> 
> Thanks! --literal-pathspecs does allow getting around this.
> 
> Now I'm wondering what other parts of plumbing might be doing globbing
> that I did not anticipate. Maybe I should set the environment variable
> so I don't need to worry about it..

Pretty much everything takes magic patterns[1]. Pathspecs given to diff,
path limiters for pruning, etc. If you are scripting with raw filenames
(e.g., feeding the filenames out of another tool), I recommend setting
GIT_LITERAL_PATHSPECS everywhere. That's what we do on the server side
at GitHub (and is the reason I implemented --literal-pathspecs in the
first place).

-Peff

[1] Note that globbing is just part of this. Names starting with colon
    are also magical, e.g. ":/foo", or even ":(literal)foo".  These are
    documented in the "pathspec" definition of "git help glossary".

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: git ls-files wildcard behavior considered harmful
  2015-03-30 23:36   ` Joey Hess
  2015-03-31  0:09     ` Jeff King
@ 2015-03-31  0:35     ` Duy Nguyen
  1 sibling, 0 replies; 6+ messages in thread
From: Duy Nguyen @ 2015-03-31  0:35 UTC (permalink / raw)
  To: Joey Hess; +Cc: Git Mailing List

On Tue, Mar 31, 2015 at 6:36 AM, Joey Hess <id@joeyh.name> wrote:
> Duy Nguyen wrote:
>> You can do "git --literal-pathspecs ls-files ..." or set GIT_LITERAL_PATHSPECS.
>
> Thanks! --literal-pathspecs does allow getting around this.
>
> Now I'm wondering what other parts of plumbing might be doing globbing
> that I did not anticipate. Maybe I should set the environment variable
> so I don't need to worry about it..

We're just a bit sloppy in documentation. ls-files learned about
wildcards since 56fc510 ([PATCH] git-ls-files: generalized pathspecs -
2005-08-21). Two months later, git-ls-files.txt is updated to say
"<file>" (which is not entirely correct even if we ignore wildcards,
ls-files can take directories as well). With latest git, I think only
git-mv and git-read-tree go with plain paths. It's probably best to
set GIT_LITERAL_PATHSPECS for scripting like Jeff said.
-- 
Duy

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-03-31  0:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-30 23:04 git ls-files wildcard behavior considered harmful Joey Hess
2015-03-30 23:16 ` Duy Nguyen
2015-03-30 23:36   ` Joey Hess
2015-03-31  0:09     ` Jeff King
2015-03-31  0:35     ` Duy Nguyen
2015-03-30 23:24 ` Jonathan Nieder

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).