Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.4 KiB
70 lines
2.4 KiB
--- python/google/protobuf/internal/test_util.py |
|
+++ python/google/protobuf/internal/test_util.py |
|
@@ -39,6 +39,7 @@ __author__ = 'robinson@google.com (Will Robinson)' |
|
import numbers |
|
import operator |
|
import os.path |
|
+import pathlib |
|
|
|
from google.protobuf import unittest_import_pb2 |
|
from google.protobuf import unittest_pb2 |
|
@@ -617,17 +618,22 @@ def ExpectAllFieldsSet(test_case, message): |
|
message.default_import_enum) |
|
|
|
|
|
+def _SearchUp(path, filename): |
|
+ path = pathlib.Path(path).resolve() |
|
+ for parent in [path] + list(path.parents): |
|
+ file_path = parent / ('google/protobuf/testdata/' + filename) |
|
+ if file_path.exists(): |
|
+ # Found it. Load the golden file from the testdata directory. |
|
+ return file_path.open('rb') |
|
+ return None |
|
+ |
|
def GoldenFile(filename): |
|
"""Finds the given golden file and returns a file object representing it.""" |
|
|
|
# Search up the directory tree looking for the C++ protobuf source code. |
|
- path = '.' |
|
- while os.path.exists(path): |
|
- if os.path.exists(os.path.join(path, 'src/google/protobuf')): |
|
- # Found it. Load the golden file from the testdata directory. |
|
- full_path = os.path.join(path, 'src/google/protobuf/testdata', filename) |
|
- return open(full_path, 'rb') |
|
- path = os.path.join(path, '..') |
|
+ f = _SearchUp('.', filename) or _SearchUp(__file__, filename) |
|
+ if f: |
|
+ return f |
|
|
|
# Search internally. |
|
path = '.' |
|
|
|
--- python/internal.bzl |
|
+++ python/internal.bzl |
|
@@ -1,5 +1,11 @@ |
|
# Internal helpers for building the Python protobuf runtime. |
|
|
|
+def _remove_cross_repo_path(path): |
|
+ components = path.split("/") |
|
+ if components[0] == "..": |
|
+ return "/".join(components[2:]) |
|
+ return path |
|
+ |
|
def _internal_copy_files_impl(ctx): |
|
strip_prefix = ctx.attr.strip_prefix |
|
if strip_prefix[-1] != "/": |
|
@@ -7,10 +13,11 @@ def _internal_copy_files_impl(ctx): |
|
|
|
src_dests = [] |
|
for src in ctx.files.srcs: |
|
- if src.short_path[:len(strip_prefix)] != strip_prefix: |
|
+ short_path = _remove_cross_repo_path(src.short_path) |
|
+ if short_path[:len(strip_prefix)] != strip_prefix: |
|
fail("Source does not start with %s: %s" % |
|
- (strip_prefix, src.short_path)) |
|
- dest = ctx.actions.declare_file(src.short_path[len(strip_prefix):]) |
|
+ (strip_prefix, short_path)) |
|
+ dest = ctx.actions.declare_file(short_path[len(strip_prefix):]) |
|
src_dests.append([src, dest]) |
|
|
|
if ctx.attr.is_windows:
|
|
|