Fix no_check_targets logic and add a unit test.
Bug: 179
Change-Id: Ia3d844978c7181b679ea5a3cb28d129f7130812b
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9200
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/build/gen.py b/build/gen.py
index 34f349c..e7a86ec 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -624,6 +624,7 @@
'src/gn/builder_unittest.cc',
'src/gn/c_include_iterator_unittest.cc',
'src/gn/command_format_unittest.cc',
+ 'src/gn/commands_unittest.cc',
'src/gn/compile_commands_writer_unittest.cc',
'src/gn/config_unittest.cc',
'src/gn/config_values_extractors_unittest.cc',
diff --git a/src/gn/commands.cc b/src/gn/commands.cc
index 8f1a1a7..97d2629 100644
--- a/src/gn/commands.cc
+++ b/src/gn/commands.cc
@@ -538,12 +538,16 @@
const std::vector<LabelPattern>& filter,
std::vector<const Target*>* output) {
for (auto* target : input) {
+ bool match = false;
for (const auto& pattern : filter) {
- if (!pattern.Matches(target->label())) {
- output->push_back(target);
+ if (pattern.Matches(target->label())) {
+ match = true;
break;
}
}
+ if (!match) {
+ output->push_back(target);
+ }
}
}
diff --git a/src/gn/commands_unittest.cc b/src/gn/commands_unittest.cc
new file mode 100644
index 0000000..6d861cd
--- /dev/null
+++ b/src/gn/commands_unittest.cc
@@ -0,0 +1,35 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stddef.h>
+
+#include "gn/commands.h"
+#include "gn/label_pattern.h"
+#include "gn/target.h"
+#include "gn/test_with_scope.h"
+#include "util/test/test.h"
+
+TEST(Commands, FilterOutMatch) {
+ TestWithScope setup;
+ SourceDir current_dir("//");
+
+ Target target_afoo(setup.settings(), Label(SourceDir("//a/"), "foo"));
+ Target target_cbar(setup.settings(), Label(SourceDir("//c/"), "bar"));
+ std::vector<const Target*> targets{&target_afoo, &target_cbar};
+
+ Err err;
+ LabelPattern pattern_a = LabelPattern::GetPattern(
+ current_dir, std::string_view(), Value(nullptr, "//a:*"), &err);
+ EXPECT_FALSE(err.has_error());
+ LabelPattern pattern_ef = LabelPattern::GetPattern(
+ current_dir, std::string_view(), Value(nullptr, "//e:f"), &err);
+ EXPECT_FALSE(err.has_error());
+ std::vector<LabelPattern> label_patterns{pattern_a, pattern_ef};
+
+ std::vector<const Target*> output;
+ commands::FilterOutTargetsByPatterns(targets, label_patterns, &output);
+
+ EXPECT_EQ(1, output.size());
+ EXPECT_EQ(&target_cbar, output[0]);
+}