Skip to content

Commit b873502

Browse files
mrjoelJoel Johnsondanmar
authored
Make isValidGlobPattern recognize ** (danmar#7682)
danmar#7645 added support for `**` matching path separators, but didn't update `isValidGlobPattern` for `--suppress` to enable it. This also updates test cases and makes `isValidGlobPattern` more correct and robust overall. In particular multiple consecutive `?` for a glob is absolutely valid and frequently useful to ensure exactly or at least some number of characters. --------- Co-authored-by: Joel Johnson <[email protected]> Co-authored-by: Daniel Marjamäki <[email protected]>
1 parent 02c95b9 commit b873502

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ Jesse Boswell
187187
Jim Kuhn
188188
Jim Zhou
189189
jlguardi
190+
Joel Johnson
190191
Johan Bertrand
191192
Johan Samuelson
192193
John Marshall

lib/utils.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,19 @@ int caseInsensitiveStringCompare(const std::string &lhs, const std::string &rhs)
4040

4141
bool isValidGlobPattern(const std::string& pattern)
4242
{
43+
int consecutiveAsterisks = 0;
4344
for (auto i = pattern.cbegin(); i != pattern.cend(); ++i) {
44-
if (*i == '*' || *i == '?') {
45-
const auto j = i + 1;
46-
if (j != pattern.cend() && (*j == '*' || *j == '?')) {
45+
if (*i == '*') {
46+
++consecutiveAsterisks;
47+
if (consecutiveAsterisks > 2) {
4748
return false;
4849
}
50+
} else if (*i == '?') {
51+
if (consecutiveAsterisks > 0) {
52+
return false;
53+
}
54+
} else {
55+
consecutiveAsterisks = 0;
4956
}
5057
}
5158
return true;

test/testsuppressions.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,18 @@ class TestSuppressions : public TestFixture {
163163
// Check for syntax errors in glob
164164
{
165165
SuppressionList suppressions;
166-
std::istringstream s("errorid:**.cpp\n");
167-
ASSERT_EQUALS("Failed to add suppression. Invalid glob pattern '**.cpp'.", suppressions.parseFile(s));
166+
std::istringstream s("errorid:*?.cpp\n");
167+
ASSERT_EQUALS("Failed to add suppression. Invalid glob pattern '*?.cpp'.", suppressions.parseFile(s));
168168
}
169169

170170
// Check that globbing works
171171
{
172172
SuppressionList suppressions;
173173
std::istringstream s("errorid:x*.cpp\n"
174174
"errorid:y?.cpp\n"
175-
"errorid:test.c*");
175+
"errorid:test.c*\n"
176+
"errorid:dir/**\n"
177+
"errorid:**/abc**/xyz-??*.?pp\n");
176178
ASSERT_EQUALS("", suppressions.parseFile(s));
177179
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "xyz.cpp", 1)));
178180
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "xyz.cpp.cpp", 1)));
@@ -181,6 +183,13 @@ class TestSuppressions : public TestFixture {
181183
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid", "y.cpp", 1)));
182184
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "test.c", 1)));
183185
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "test.cpp", 1)));
186+
187+
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "dir/test.cpp", 1)));
188+
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "dir/deep/nested/test.cpp", 1)));
189+
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid", "yellow.cpp", 1)));
190+
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid", "foo/sub/abc/sub/xyz-22aaa.cpp", 1)));
191+
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid", "foo/sub/abc-xyz-22.cpp", 1)));
192+
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid", "x/abcxyz-11.cpp", 1)));
184193
}
185194

186195
// Check that both a filename match and a glob match apply

test/testutils.cpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,32 @@ class TestUtils : public TestFixture {
5252
ASSERT_EQUALS(true, ::isValidGlobPattern("x*"));
5353
ASSERT_EQUALS(true, ::isValidGlobPattern("*/x/*"));
5454
ASSERT_EQUALS(true, ::isValidGlobPattern("x/*/z"));
55-
ASSERT_EQUALS(false, ::isValidGlobPattern("**"));
56-
ASSERT_EQUALS(false, ::isValidGlobPattern("**x"));
57-
ASSERT_EQUALS(false, ::isValidGlobPattern("x**"));
55+
ASSERT_EQUALS(true, ::isValidGlobPattern("**"));
56+
ASSERT_EQUALS(true, ::isValidGlobPattern("**x"));
57+
ASSERT_EQUALS(true, ::isValidGlobPattern("x**"));
5858

5959
ASSERT_EQUALS(true, ::isValidGlobPattern("?"));
6060
ASSERT_EQUALS(true, ::isValidGlobPattern("?x"));
6161
ASSERT_EQUALS(true, ::isValidGlobPattern("x?"));
6262
ASSERT_EQUALS(true, ::isValidGlobPattern("?/x/?"));
6363
ASSERT_EQUALS(true, ::isValidGlobPattern("x/?/z"));
64-
ASSERT_EQUALS(false, ::isValidGlobPattern("??"));
65-
ASSERT_EQUALS(false, ::isValidGlobPattern("??x"));
66-
ASSERT_EQUALS(false, ::isValidGlobPattern("x??"));
64+
ASSERT_EQUALS(true, ::isValidGlobPattern("??"));
65+
ASSERT_EQUALS(true, ::isValidGlobPattern("????"));
66+
ASSERT_EQUALS(true, ::isValidGlobPattern("??x"));
67+
ASSERT_EQUALS(true, ::isValidGlobPattern("x??"));
68+
69+
ASSERT_EQUALS(true, ::isValidGlobPattern("?*"));
70+
ASSERT_EQUALS(true, ::isValidGlobPattern("?**"));
71+
ASSERT_EQUALS(false, ::isValidGlobPattern("?***"));
72+
ASSERT_EQUALS(true, ::isValidGlobPattern("???*"));
73+
ASSERT_EQUALS(true, ::isValidGlobPattern("???**"));
74+
ASSERT_EQUALS(false, ::isValidGlobPattern("???***"));
75+
76+
ASSERT_EQUALS(false, ::isValidGlobPattern("*?"));
77+
ASSERT_EQUALS(true, ::isValidGlobPattern("*x?"));
78+
ASSERT_EQUALS(false, ::isValidGlobPattern("**?"));
79+
ASSERT_EQUALS(false, ::isValidGlobPattern("***"));
80+
ASSERT_EQUALS(true, ::isValidGlobPattern("**x*"));
6781
}
6882

6983
void matchglob() const {
@@ -76,11 +90,26 @@ class TestUtils : public TestFixture {
7690
ASSERT_EQUALS(true, ::matchglob("*", "x/y/z"));
7791
ASSERT_EQUALS(true, ::matchglob("*/y/z", "x/y/z"));
7892

93+
ASSERT_EQUALS(true, ::matchglob("**", ""));
94+
ASSERT_EQUALS(true, ::matchglob("**", "abcdefg"));
95+
ASSERT_EQUALS(true, ::matchglob("**", "abcde/foo/bar"));
96+
ASSERT_EQUALS(false, ::matchglob("*/**", "abcde"));
97+
ASSERT_EQUALS(true, ::matchglob("*/**", "abcde/foo"));
98+
ASSERT_EQUALS(true, ::matchglob("*/**", "abcde/foo/bar"));
99+
79100
ASSERT_EQUALS(false, ::matchglob("?", "xyz"));
80101
ASSERT_EQUALS(false, ::matchglob("x?", "xyz"));
81102
ASSERT_EQUALS(false, ::matchglob("?z", "xyz"));
82103
ASSERT_EQUALS(true, ::matchglob("?y?", "xyz"));
83104
ASSERT_EQUALS(true, ::matchglob("?/?/?", "x/y/z"));
105+
106+
ASSERT_EQUALS(true, ::matchglob("??", "xy"));
107+
ASSERT_EQUALS(false, ::matchglob("??", "x"));
108+
ASSERT_EQUALS(false, ::matchglob("??", "xyz"));
109+
110+
ASSERT_EQUALS(true, ::matchglob("????", "wxyz"));
111+
ASSERT_EQUALS(false, ::matchglob("????", "xyz"));
112+
ASSERT_EQUALS(false, ::matchglob("????", "vwxyz"));
84113
}
85114

86115
void isStringLiteral() const {

0 commit comments

Comments
 (0)