From 42e1e2abef8c49efffaa55c645b04bb7e4184cc8 Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Mon, 30 Jan 2017 15:23:35 -0800 Subject: Fix python compatibility test when a new generated code imports an old version(2.6.1 or older) generated code. --- python/compatibility_tests/v2.5.0/test.sh | 14 ++++---------- src/google/protobuf/compiler/python/python_generator.cc | 11 ++++++++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/python/compatibility_tests/v2.5.0/test.sh b/python/compatibility_tests/v2.5.0/test.sh index c640da80..78c16ad1 100755 --- a/python/compatibility_tests/v2.5.0/test.sh +++ b/python/compatibility_tests/v2.5.0/test.sh @@ -92,16 +92,10 @@ python setup.py test # Test A.3: # proto set 1: use old version # proto set 2 which may import protos in set 1: use new version -# Compatiblility test fail if the old verison is less than 3.0.0-alpha-1. -# Because module name aliases was added in v3.0.0-alpha-1 instead of -# fully-qualified module names to refer to dependencies: dot was replaced -# with _dot_. -if [ "$(printf "$OLD_VERSION\n3.0.0" | sort -V | head -n 1 )" = "3.0.0" ]; then - cp old_protoc protoc_1 - cp ../../../src/protoc protoc_2 - python setup.py build - python setup.py test -fi +cp old_protoc protoc_1 +cp ../../../src/protoc protoc_2 +python setup.py build +python setup.py test rm google -r -f rm build -r -f diff --git a/src/google/protobuf/compiler/python/python_generator.cc b/src/google/protobuf/compiler/python/python_generator.cc index f5769128..f83f155a 100644 --- a/src/google/protobuf/compiler/python/python_generator.cc +++ b/src/google/protobuf/compiler/python/python_generator.cc @@ -1380,8 +1380,17 @@ void Generator::FixOptionsForMessage(const Descriptor& descriptor) const { void Generator::CopyPublicDependenciesAliases( const string& copy_from, const FileDescriptor* file) const { for (int i = 0; i < file->public_dependency_count(); ++i) { + string module_name = ModuleName(file->public_dependency(i)->name()); string module_alias = ModuleAlias(file->public_dependency(i)->name()); - printer_->Print("$alias$ = $copy_from$.$alias$\n", "alias", module_alias, + // There's no module alias in the dependent file if it was generated by + // an old protoc (less than 3.0.0-alpha-1). Use module name in this + // situation. + printer_->Print("try:\n" + " $alias$ = $copy_from$.$alias$\n" + "except AttributeError:\n" + " $alias$ = $copy_from$.$module$\n", + "alias", module_alias, + "module", module_name, "copy_from", copy_from); CopyPublicDependenciesAliases(copy_from, file->public_dependency(i)); } -- cgit v1.2.3