| # Copyright 2016 The Bazel Authors. All rights reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Helper functions that don't depend on Skylark, so can be unit tested.""" | |
| def _short_path_dirname(path): | |
| """Returns the directory's name of the short path of an artifact.""" | |
| sp = path.short_path | |
| last_pkg = sp.rfind("/") | |
| if last_pkg == -1: | |
| # Top-level BUILD file. | |
| return "" | |
| return sp[:last_pkg] | |
| def dest_path(f, strip_prefix): | |
| """Returns the short path of f, stripped of strip_prefix.""" | |
| if strip_prefix == None: | |
| # If no strip_prefix was specified, use the package of the | |
| # given input as the strip_prefix. | |
| strip_prefix = _short_path_dirname(f) | |
| if not strip_prefix: | |
| return f.short_path | |
| if f.short_path.startswith(strip_prefix): | |
| return f.short_path[len(strip_prefix):] | |
| return f.short_path | |
| def compute_data_path(out, data_path): | |
| """Compute the relative data path prefix from the data_path attribute.""" | |
| if data_path: | |
| # Strip ./ from the beginning if specified. | |
| # There is no way to handle .// correctly (no function that would make | |
| # that possible and Skylark is not turing complete) so just consider it | |
| # as an absolute path. | |
| if len(data_path) >= 2 and data_path[0:2] == "./": | |
| data_path = data_path[2:] | |
| if not data_path or data_path == ".": # Relative to current package | |
| return _short_path_dirname(out) | |
| elif data_path[0] == "/": # Absolute path | |
| return data_path[1:] | |
| else: # Relative to a sub-directory | |
| tmp_short_path_dirname = _short_path_dirname(out) | |
| if tmp_short_path_dirname: | |
| return tmp_short_path_dirname + "/" + data_path | |
| return data_path | |
| else: | |
| return None |