git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [BUG] git rev-list HEAD --objects -- WILDCARD-PATHSPEC
@ 2022-12-15  0:26 Andrew Olsen
  0 siblings, 0 replies; only message in thread
From: Andrew Olsen @ 2022-12-15  0:26 UTC (permalink / raw)
  To: git, Robert Coup

git rev-list --objects behaves strangely with certain wildcard
pathspecs, which seem to interact badly with its tree-walk recursion.
To see the weirdness, there should generally be a wildcard-star
occurring somewhere early on in the pattern - wildcards as suffixes /
wildcards filtering the name of the blob, seems to work better than
wildcards as prefixes / wildcards filtering the name of trees.
A simple example of a wildcard pathspec that doesn't work is `*/*`

== Steps to reproduce ==
1. Get a git repo with a few different files and folders that's not
too overwhelming. You could make your own, I've cloned
https://github.com/computationalmystic/toy-repository

2. Run `git rev-list HEAD --objects -- PATHSPEC`
where PATHSPEC has an early wildcard in. It will not give you the
expected results. Make sure you quote the PATHSPEC so that your shell
doesn't do any wildcard expansion, otherwise you are not testing
rev-list's wildcard expansion.

Note that whenever this is working and you match something so that it
is output, generally all of its parent-trees and child-trees/blobs are
output too. I don't know if this is working as intended or not, it's
not documented in git rev-list.

For example, here is what I found on the toy-repository I cloned.

== First the expected behaviour ==
These work since the first wildcard is towards the end and is doing
suffix-matching or matching the last blob:

Group01 -> matches all of tree Group01
Group01/ -> matches all of tree Group01
Group01/* -> matches all of tree Group01
Group01* -> matches all of tree Group01

Group0 -> doesn't match anything
Group0* -> matches Group01, Group02, Group03, etc

Group01/READ* -> matches Group01/README.md
Group01/*ME.md -> matches Group01/README.md
Group01/*.md -> matches all .md files in Group01

== Possibly expected behaviour ==
Group0*/ -> doesn't output anything.

This is a bit weird since Group01/ does match some things, and
Group0*/ looks like it should match all of those same things at least,
but I think maybe the absence of wildcards altogether means that the
pathspec is considered to also match children of the matched object,
whereas if the pathspec contains a wildcard, it is stricter - you have
to append "/*" to get the same effect.
(I observed similar behaviour when testing git diff)

== Unexpected behaviour ==
These don't work since there is a wildcard early on doing prefix
matching or trying to filter trees rather than blobs.

*/* -> should match all the blobs, but only outputs root trees
*/*.md -> should match nearly all the blobs, but only outputs root trees
*README.md -> should match all README.md blobs, but only outputs the
root README.md blob and root trees.
*/README.md -> should match all README.md blobs, but only outputs root trees
Group0*/* -> should match lots of blobs, but only outputs root trees.

== Figuring out the specification ==
You can run `git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD
--name-only -- PATHSPEC` to get a second opinion of what things should
match or not match your patchspec. This command seems to behave much
better with wildcard pathspecs than `git rev-list --objects`

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-12-15  0:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-15  0:26 [BUG] git rev-list HEAD --objects -- WILDCARD-PATHSPEC Andrew Olsen

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