Просмотр исходного кода

* Avoid using pushd/popd in generate_descriptor_proto.sh because they are
bash-only features, and /bin/sh is not a symlink to bash on all systems.
* If an input file is a Windows absolute path (e.g. "C:\foo\bar.proto") and
the import path only contains "." (or contains "." but does not contain
the file), protoc incorrectly thought that the file was under ".", because
it thought that the path was relative (since it didn't start with a slash).
This has been fixed.

kenton@google.com 17 лет назад
Родитель
Сommit
2f669cbe75

+ 7 - 0
CHANGES.txt

@@ -8,6 +8,11 @@
     had to explicitly import descriptor.proto.
     had to explicitly import descriptor.proto.
   * Adjacent string literals in .proto files will now be concatenated, like in
   * Adjacent string literals in .proto files will now be concatenated, like in
     C.
     C.
+  * If an input file is a Windows absolute path (e.g. "C:\foo\bar.proto") and
+    the import path only contains "." (or contains "." but does not contain
+    the file), protoc incorrectly thought that the file was under ".", because
+    it thought that the path was relative (since it didn't start with a slash).
+    This has been fixed.
 
 
   C++
   C++
   * Generated message classes now have a Swap() method which efficiently swaps
   * Generated message classes now have a Swap() method which efficiently swaps
@@ -47,6 +52,8 @@
   * Corrected ListFields() signature in Message base class to match what
   * Corrected ListFields() signature in Message base class to match what
     subclasses actually implement.
     subclasses actually implement.
   * Some minor refactoring.
   * Some minor refactoring.
+  * Don't pass self as first argument to superclass constructor (no longer
+    allowed in Python 2.6).
 
 
 2008-09-29 version 2.0.2:
 2008-09-29 version 2.0.2:
 
 

+ 2 - 2
generate_descriptor_proto.sh

@@ -22,6 +22,6 @@ __EOF__
   exit 1
   exit 1
 fi
 fi
 
 
-pushd src
+cd src
 make protoc && ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:. google/protobuf/descriptor.proto
 make protoc && ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:. google/protobuf/descriptor.proto
-popd
+cd ..

+ 2 - 1
src/google/protobuf/compiler/command_line_interface.cc

@@ -93,7 +93,8 @@ static const char* kPathSeparator = ":";
 #endif
 #endif
 
 
 // Returns true if the text looks like a Windows-style absolute path, starting
 // Returns true if the text looks like a Windows-style absolute path, starting
-// with a drive letter.  Example:  "C:\foo".
+// with a drive letter.  Example:  "C:\foo".  TODO(kenton):  Share this with
+// copy in importer.cc?
 static bool IsWindowsAbsolutePath(const string& text) {
 static bool IsWindowsAbsolutePath(const string& text) {
 #if defined(_WIN32) || defined(__CYGWIN__)
 #if defined(_WIN32) || defined(__CYGWIN__)
   return text.size() >= 3 && text[1] == ':' &&
   return text.size() >= 3 && text[1] == ':' &&

+ 16 - 1
src/google/protobuf/compiler/importer.cc

@@ -61,6 +61,20 @@ namespace compiler {
 #endif
 #endif
 #endif
 #endif
 
 
+// Returns true if the text looks like a Windows-style absolute path, starting
+// with a drive letter.  Example:  "C:\foo".  TODO(kenton):  Share this with
+// copy in command_line_interface.cc?
+static bool IsWindowsAbsolutePath(const string& text) {
+#if defined(_WIN32) || defined(__CYGWIN__)
+  return text.size() >= 3 && text[1] == ':' &&
+         isalpha(text[0]) &&
+         (text[2] == '/' || text[2] == '\\') &&
+         text.find_last_of(':') == 1;
+#else
+  return false;
+#endif
+}
+
 MultiFileErrorCollector::~MultiFileErrorCollector() {}
 MultiFileErrorCollector::~MultiFileErrorCollector() {}
 
 
 // This class serves two purposes:
 // This class serves two purposes:
@@ -276,7 +290,8 @@ static bool ApplyMapping(const string& filename,
       // We do not allow the file name to use "..".
       // We do not allow the file name to use "..".
       return false;
       return false;
     }
     }
-    if (HasPrefixString(filename, "/")) {
+    if (HasPrefixString(filename, "/") ||
+        IsWindowsAbsolutePath(filename)) {
       // This is an absolute path, so it isn't matched by the empty string.
       // This is an absolute path, so it isn't matched by the empty string.
       return false;
       return false;
     }
     }

+ 12 - 0
src/google/protobuf/compiler/importer_unittest.cc

@@ -516,6 +516,18 @@ TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) {
     source_tree_.DiskFileToVirtualFile(
     source_tree_.DiskFileToVirtualFile(
       "../../baz", &virtual_file, &shadowing_disk_file));
       "../../baz", &virtual_file, &shadowing_disk_file));
 
 
+  // "/foo" is not mapped (it should not be misintepreted as being under ".").
+  EXPECT_EQ(DiskSourceTree::NO_MAPPING,
+    source_tree_.DiskFileToVirtualFile(
+      "/foo", &virtual_file, &shadowing_disk_file));
+
+#ifdef WIN32
+  // "C:\foo" is not mapped (it should not be misintepreted as being under ".").
+  EXPECT_EQ(DiskSourceTree::NO_MAPPING,
+    source_tree_.DiskFileToVirtualFile(
+      "C:\\foo", &virtual_file, &shadowing_disk_file));
+#endif  // WIN32
+
   // But "../baz" should be.
   // But "../baz" should be.
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
     source_tree_.DiskFileToVirtualFile(
     source_tree_.DiskFileToVirtualFile(