From: Stavros Ntentos <redacted>
Namely, `!` and any other long magic form (e.g. `glob`)
cannot be combined to one entry.
Issue a warning when such thing happens, and hint to the solution.
Signed-off-by: Stavros Ntentos <redacted>
---
pathspec.c | 19 +++++++++++++++++++
pathspec.h | 1 +
t/t6132-pathspec-exclude.sh | 33 +++++++++++++++++++++++++++++++++
3 files changed, 53 insertions(+)
diff --git a/pathspec.c b/pathspec.c
index 7a229d8d22..374c529569 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -1,3 +1,5 @@
+#include <stdio.h>
+#include <string.h>
#include "cache.h"
#include "config.h"
#include "dir.h"
@@ -586,6 +588,8 @@ void parse_pathspec(struct pathspec *pathspec,
for (i = 0; i < n; i++) {
entry = argv[i];
+ check_mishandled_exclude(entry);
+
init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
if (item[i].magic & PATHSPEC_EXCLUDE)@@ -739,3 +743,18 @@ int match_pathspec_attrs(const struct index_state *istate,
return 1;
}
+
+void check_mishandled_exclude(const char *entry) {
+ size_t entry_len = strlen(entry);
+ char flags[entry_len];
+ char path[entry_len];
+
+ if (sscanf(entry, ":!(%4096[^)])%4096s", &flags, &path) != 2) {
+ return;
+ }
+ if (count_slashes(flags) > 0) {
+ return;
+ }
+
+ warning(_("Pathspec provided matches `:!(...)`\n\tDid you mean `:(exclude,...)`?"));
+}diff --git a/pathspec.h b/pathspec.h
index 454ce364fa..879d4e82c6 100644
--- a/pathspec.h
+++ b/pathspec.h
@@ -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_mishandled_exclude(const char* pathspec_entry);
#endif /* PATHSPEC_H */
diff --git a/t/t6132-pathspec-exclude.sh b/t/t6132-pathspec-exclude.sh
index 30328b87f0..b32ddb2a56 100755
--- a/t/t6132-pathspec-exclude.sh
+++ b/t/t6132-pathspec-exclude.sh
@@ -244,4 +244,37 @@ test_expect_success 'grep --untracked PATTERN :(exclude)*FILE' '
test_cmp expect-grep actual-grep
'
+cat > expected_warn <<"EOF"
+Pathspec provided matches `:!(...)`
+EOF
+test_expect_success 'warn pathspec :!(...) skips the parenthesized magics' '
+ git log --oneline --format=%s -- '"'"':!(glob)**/file'"'"' >actual 2>warn &&
+ cat <<EOF >expect &&
+sub2/file
+sub/sub/sub/file
+sub/file2
+sub/sub/file
+sub/file
+file
+EOF
+ cat actual &&
+ cat warn &&
+ test_cmp expect actual &&
+ grep -Ff expected_warn warn
+'
+
+test_expect_success 'do not warn that pathspec :!(...) skips the parenthesized magics (if parenthesis would not be part of the magic)' '
+ git log --oneline --format=%s -- '"'"':!(gl/ob)/file'"'"' >actual 2>warn &&
+ cat <<EOF >expect &&
+sub2/file
+sub/sub/sub/file
+sub/file2
+sub/sub/file
+sub/file
+file
+EOF
+ test_cmp expect actual &&
+ ! grep -Ff expected_warn warn
+'
+
test_done
--
2.31.0