@@ -1,3 +1,4 @@
+#include <string.h>
#include "cache.h"
#include "config.h"
#include "dir.h"
@@ -588,6 +589,8 @@ void parse_pathspec(struct pathspec *pathspec,
init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
+ check_missing_glob(entry, item[i].magic);
+
if (item[i].magic & PATHSPEC_EXCLUDE)
nr_exclude++;
if (item[i].magic & magic_mask)
@@ -739,3 +742,13 @@ int match_pathspec_attrs(const struct index_state *istate,
return 1;
}
+
+void check_missing_glob(const char *pathspec_entry, int flags) {
+ if (flags & (PATHSPEC_GLOB | PATHSPEC_LITERAL)) {
+ return;
+ }
+
+ if (strstr(pathspec_entry, "**")) {
+ warning(_("Pathspec provided contains `**`, but no :(glob) magic.\nIt will not match 0 or more directories!"));
+ }
+}
@@ -157,5 +157,6 @@ char *find_pathspecs_matching_against_index(const struct pathspec *pathspec,
int match_pathspec_attrs(const struct index_state *istate,
const char *name, int namelen,
const struct pathspec_item *item);
+void check_missing_glob(const char* pathspec_entry, int flags);
#endif /* PATHSPEC_H */
@@ -157,4 +157,17 @@ test_expect_success '**/ does not work with :(literal) and --glob-pathspecs' '
test_must_be_empty actual
'
+cat > expected <<"EOF"
+warning: Pathspec provided contains `**`, but no :(glob) magic.
+EOF
+test_expect_success '** without :(glob) warns of lacking glob magic' '
+ test_might_fail git stash -- "**/bar" 2>warns &&
+ grep -Ff expected warns
+'
+
+test_expect_success '** with :(literal) does not warn of lacking glob magic' '
+ test_might_fail git stash -- ":(literal)**/bar" 2>warns &&
+ ! grep -Ff expected warns
+'
+
test_done
If a pathspec given that contains `**`, chances are that someone is naively expecting that it will do what the manual has told him (i.e. that `**` will match 0-or-more directories). When `**` appears in the pathspec, the user may be expecting that it would be matched using the "wildmatch" semantics, matching 0 or more directories. That is not what happens without ":(glob)" magic. Teach the pathspec parser to emit an advice message when a substring `**` appears in a pathspec element that does not have a `:(glob)` magic. Make sure we don't disturb users who use ":(literal)" magic with such a substring, as it is clear they want to find these strings literally. Signed-off-by: Stavros Ntentos <133706+stdedos@users.noreply.github.com> --- pathspec.c | 13 +++++++++++++ pathspec.h | 1 + t/t6130-pathspec-noglob.sh | 13 +++++++++++++ 3 files changed, 27 insertions(+)