Преглед изворни кода

Fixes to make the --fatal_warnings flag work with current master

Per Lundberg пре 4 година
родитељ
комит
c7a6160a87

+ 4 - 0
src/google/protobuf/compiler/command_line_interface.cc

@@ -2054,6 +2054,10 @@ Parse PROTO_FILES and generate output based on the options given:
   --error_format=FORMAT       Set the format in which to print errors.
   --error_format=FORMAT       Set the format in which to print errors.
                               FORMAT may be 'gcc' (the default) or 'msvs'
                               FORMAT may be 'gcc' (the default) or 'msvs'
                               (Microsoft Visual Studio format).
                               (Microsoft Visual Studio format).
+  --fatal_warnings            Make warnings be fatal (similar to -Werr in
+                              gcc). This flag will make protoc return
+                              with a non-zero exit code if any warnings
+                              are generated.
   --print_free_field_numbers  Print the free field numbers of the messages
   --print_free_field_numbers  Print the free field numbers of the messages
                               defined in the given proto files. Groups share
                               defined in the given proto files. Groups share
                               the same field number space with the parent
                               the same field number space with the parent

+ 1 - 1
src/google/protobuf/compiler/command_line_interface.h

@@ -393,7 +393,7 @@ class PROTOC_EXPORT CommandLineInterface {
   ErrorFormat error_format_ = ERROR_FORMAT_GCC;
   ErrorFormat error_format_ = ERROR_FORMAT_GCC;
 
 
   // True if we should treat warnings as errors that fail the compilation.
   // True if we should treat warnings as errors that fail the compilation.
-  bool fatal_warnings_;
+  bool fatal_warnings_ = false;
 
 
   std::vector<std::pair<std::string, std::string> >
   std::vector<std::pair<std::string, std::string> >
       proto_path_;                        // Search path for proto files.
       proto_path_;                        // Search path for proto files.

+ 19 - 14
src/google/protobuf/compiler/command_line_interface_unittest.cc

@@ -132,9 +132,6 @@ class CommandLineInterfaceTest : public testing::Test {
   // -----------------------------------------------------------------
   // -----------------------------------------------------------------
   // Methods to check the test results (called after Run()).
   // Methods to check the test results (called after Run()).
 
 
-  // Checks that Run() returned code r.
-  void ExpectReturnCode(int r);
-
   // Checks that no text was written to stderr during Run(), and Run()
   // Checks that no text was written to stderr during Run(), and Run()
   // returned 0.
   // returned 0.
   void ExpectNoErrors();
   void ExpectNoErrors();
@@ -160,6 +157,11 @@ class CommandLineInterfaceTest : public testing::Test {
   void ExpectCapturedStdoutSubstringWithZeroReturnCode(
   void ExpectCapturedStdoutSubstringWithZeroReturnCode(
       const std::string& expected_substring);
       const std::string& expected_substring);
 
 
+  // Checks that Run() returned zero and the stderr contains the given
+  // substring.
+  void ExpectCapturedStderrSubstringWithZeroReturnCode(
+      const std::string& expected_substring);
+
 #if defined(_WIN32) && !defined(__CYGWIN__)
 #if defined(_WIN32) && !defined(__CYGWIN__)
   // Returns true if ExpectErrorSubstring(expected_substring) would pass, but
   // Returns true if ExpectErrorSubstring(expected_substring) would pass, but
   // does not fail otherwise.
   // does not fail otherwise.
@@ -409,10 +411,6 @@ void CommandLineInterfaceTest::CreateTempDir(const std::string& name) {
 
 
 // -------------------------------------------------------------------
 // -------------------------------------------------------------------
 
 
-void CommandLineInterfaceTest::ExpectReturnCode(int r) {
-  EXPECT_EQ(r, return_code_);
-}
-
 void CommandLineInterfaceTest::ExpectNoErrors() {
 void CommandLineInterfaceTest::ExpectNoErrors() {
   EXPECT_EQ(0, return_code_);
   EXPECT_EQ(0, return_code_);
   EXPECT_EQ("", error_text_);
   EXPECT_EQ("", error_text_);
@@ -433,8 +431,8 @@ void CommandLineInterfaceTest::ExpectErrorSubstring(
 
 
 void CommandLineInterfaceTest::ExpectWarningSubstring(
 void CommandLineInterfaceTest::ExpectWarningSubstring(
     const std::string& expected_substring) {
     const std::string& expected_substring) {
-  EXPECT_EQ(0, return_code_);
   EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_);
   EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_);
+  EXPECT_EQ(0, return_code_);
 }
 }
 
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
 #if defined(_WIN32) && !defined(__CYGWIN__)
@@ -522,6 +520,13 @@ void CommandLineInterfaceTest::ExpectCapturedStdoutSubstringWithZeroReturnCode(
                       captured_stdout_);
                       captured_stdout_);
 }
 }
 
 
+void CommandLineInterfaceTest::ExpectCapturedStderrSubstringWithZeroReturnCode(
+    const std::string& expected_substring) {
+  EXPECT_EQ(0, return_code_);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring,
+                      error_text_);
+}
+
 void CommandLineInterfaceTest::ExpectFileContent(const std::string& filename,
 void CommandLineInterfaceTest::ExpectFileContent(const std::string& filename,
                                                  const std::string& content) {
                                                  const std::string& content) {
   std::string path = temp_directory_ + "/" + filename;
   std::string path = temp_directory_ + "/" + filename;
@@ -2310,13 +2315,14 @@ TEST_F(CommandLineInterfaceTest, MsvsFormatErrors) {
 }
 }
 
 
 TEST_F(CommandLineInterfaceTest, InvalidErrorFormat) {
 TEST_F(CommandLineInterfaceTest, InvalidErrorFormat) {
-  // Test --error_format=msvs
+  // Test invalid --error_format
 
 
   CreateTempFile("foo.proto",
   CreateTempFile("foo.proto",
                  "syntax = \"proto2\";\n"
                  "syntax = \"proto2\";\n"
                  "badsyntax\n");
                  "badsyntax\n");
 
 
-  Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir foo.proto");
+  Run("protocol_compiler --test_out=$tmpdir "
+      "--proto_path=$tmpdir --error_format=invalid foo.proto");
 
 
   ExpectErrorText("Unknown error format: invalid\n");
   ExpectErrorText("Unknown error format: invalid\n");
 }
 }
@@ -2332,14 +2338,13 @@ TEST_F(CommandLineInterfaceTest, Warnings) {
 
 
   Run("protocol_compiler --test_out=$tmpdir "
   Run("protocol_compiler --test_out=$tmpdir "
     "--proto_path=$tmpdir foo.proto");
     "--proto_path=$tmpdir foo.proto");
-  ExpectReturnCode(0);
-  ExpectErrorSubstringWithZeroReturnCode(
-    "foo.proto: warning: Import bar.proto but not used.");
+  ExpectCapturedStderrSubstringWithZeroReturnCode(
+    "foo.proto:2:1: warning: Import bar.proto is unused.");
 
 
   Run("protocol_compiler --test_out=$tmpdir --fatal_warnings "
   Run("protocol_compiler --test_out=$tmpdir --fatal_warnings "
     "--proto_path=$tmpdir foo.proto");
     "--proto_path=$tmpdir foo.proto");
   ExpectErrorSubstring(
   ExpectErrorSubstring(
-    "foo.proto: warning: Import bar.proto but not used.");
+    "foo.proto:2:1: warning: Import bar.proto is unused.");
 }
 }
 
 
 // -------------------------------------------------------------------
 // -------------------------------------------------------------------