| Index: third_party/protobuf/src/google/protobuf/compiler/importer.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/importer.cc b/third_party/protobuf/src/google/protobuf/compiler/importer.cc
|
| index 422f759f2be75b21881f3591cef5cbd525b07a5b..8333684e1ba56a9d4e3fe52d485632f0b9b6ac32 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/importer.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/importer.cc
|
| @@ -1,6 +1,6 @@
|
| // Protocol Buffers - Google's data interchange format
|
| // Copyright 2008 Google Inc. All rights reserved.
|
| -// http://code.google.com/p/protobuf/
|
| +// https://developers.google.com/protocol-buffers/
|
| //
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| @@ -43,6 +43,10 @@
|
| #include <errno.h>
|
|
|
| #include <algorithm>
|
| +#include <memory>
|
| +#ifndef _SHARED_PTR_H
|
| +#include <google/protobuf/stubs/shared_ptr.h>
|
| +#endif
|
|
|
| #include <google/protobuf/compiler/importer.h>
|
|
|
| @@ -121,10 +125,11 @@ SourceTreeDescriptorDatabase::~SourceTreeDescriptorDatabase() {}
|
|
|
| bool SourceTreeDescriptorDatabase::FindFileByName(
|
| const string& filename, FileDescriptorProto* output) {
|
| - scoped_ptr<io::ZeroCopyInputStream> input(source_tree_->Open(filename));
|
| + google::protobuf::scoped_ptr<io::ZeroCopyInputStream> input(source_tree_->Open(filename));
|
| if (input == NULL) {
|
| if (error_collector_ != NULL) {
|
| - error_collector_->AddError(filename, -1, 0, "File not found.");
|
| + error_collector_->AddError(filename, -1, 0,
|
| + source_tree_->GetLastErrorMessage());
|
| }
|
| return false;
|
| }
|
| @@ -186,6 +191,7 @@ Importer::Importer(SourceTree* source_tree,
|
| MultiFileErrorCollector* error_collector)
|
| : database_(source_tree),
|
| pool_(&database_, database_.GetValidationErrorCollector()) {
|
| + pool_.EnforceWeakDependencies(true);
|
| database_.RecordErrorsTo(error_collector);
|
| }
|
|
|
| @@ -195,10 +201,22 @@ const FileDescriptor* Importer::Import(const string& filename) {
|
| return pool_.FindFileByName(filename);
|
| }
|
|
|
| +void Importer::AddUnusedImportTrackFile(const string& file_name) {
|
| + pool_.AddUnusedImportTrackFile(file_name);
|
| +}
|
| +
|
| +void Importer::ClearUnusedImportTrackFiles() {
|
| + pool_.ClearUnusedImportTrackFiles();
|
| +}
|
| +
|
| // ===================================================================
|
|
|
| SourceTree::~SourceTree() {}
|
|
|
| +string SourceTree::GetLastErrorMessage() {
|
| + return "File not found.";
|
| +}
|
| +
|
| DiskSourceTree::DiskSourceTree() {}
|
|
|
| DiskSourceTree::~DiskSourceTree() {}
|
| @@ -239,9 +257,9 @@ static string CanonicalizePath(string path) {
|
| }
|
| #endif
|
|
|
| - vector<string> parts;
|
| vector<string> canonical_parts;
|
| - SplitStringUsing(path, "/", &parts); // Note: Removes empty parts.
|
| + vector<string> parts = Split(
|
| + path, "/", true); // Note: Removes empty parts.
|
| for (int i = 0; i < parts.size(); i++) {
|
| if (parts[i] == ".") {
|
| // Ignore.
|
| @@ -249,7 +267,7 @@ static string CanonicalizePath(string path) {
|
| canonical_parts.push_back(parts[i]);
|
| }
|
| }
|
| - string result = JoinStrings(canonical_parts, "/");
|
| + string result = Join(canonical_parts, "/");
|
| if (!path.empty() && path[0] == '/') {
|
| // Restore leading slash.
|
| result = '/' + result;
|
| @@ -385,7 +403,7 @@ DiskSourceTree::DiskFileToVirtualFile(
|
| // Verify that we can open the file. Note that this also has the side-effect
|
| // of verifying that we are not canonicalizing away any non-existent
|
| // directories.
|
| - scoped_ptr<io::ZeroCopyInputStream> stream(OpenDiskFile(disk_file));
|
| + google::protobuf::scoped_ptr<io::ZeroCopyInputStream> stream(OpenDiskFile(disk_file));
|
| if (stream == NULL) {
|
| return CANNOT_OPEN;
|
| }
|
| @@ -395,8 +413,8 @@ DiskSourceTree::DiskFileToVirtualFile(
|
|
|
| bool DiskSourceTree::VirtualFileToDiskFile(const string& virtual_file,
|
| string* disk_file) {
|
| - scoped_ptr<io::ZeroCopyInputStream> stream(OpenVirtualFile(virtual_file,
|
| - disk_file));
|
| + google::protobuf::scoped_ptr<io::ZeroCopyInputStream> stream(
|
| + OpenVirtualFile(virtual_file, disk_file));
|
| return stream != NULL;
|
| }
|
|
|
| @@ -404,6 +422,10 @@ io::ZeroCopyInputStream* DiskSourceTree::Open(const string& filename) {
|
| return OpenVirtualFile(filename, NULL);
|
| }
|
|
|
| +string DiskSourceTree::GetLastErrorMessage() {
|
| + return last_error_message_;
|
| +}
|
| +
|
| io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile(
|
| const string& virtual_file,
|
| string* disk_file) {
|
| @@ -412,6 +434,8 @@ io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile(
|
| // We do not allow importing of paths containing things like ".." or
|
| // consecutive slashes since the compiler expects files to be uniquely
|
| // identified by file name.
|
| + last_error_message_ = "Backslashes, consecutive slashes, \".\", or \"..\" "
|
| + "are not allowed in the virtual path";
|
| return NULL;
|
| }
|
|
|
| @@ -429,13 +453,13 @@ io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile(
|
|
|
| if (errno == EACCES) {
|
| // The file exists but is not readable.
|
| - // TODO(kenton): Find a way to report this more nicely.
|
| - GOOGLE_LOG(WARNING) << "Read access is denied for file: " << temp_disk_file;
|
| + last_error_message_ = "Read access is denied for file: " +
|
| + temp_disk_file;
|
| return NULL;
|
| }
|
| }
|
| }
|
| -
|
| + last_error_message_ = "File not found.";
|
| return NULL;
|
| }
|
|
|
|
|