programs/buck_repo.py (112 lines of code) (raw):

# Copyright (c) Facebook, Inc. and its affiliates. # # 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. from __future__ import print_function import json import logging import os import os.path import sys from programs.buck_tool import BuckTool, platform_path from programs.subprocutils import which from programs.tracing import Tracing # If you're looking for JAVA_CLASSPATHS, they're now defined in the programs/classpaths file. RESOURCES = { "android_agent_path": "assets/android/agent.apk", "legacy_fix_script": "programs/fixes/source_only_abi/autofix_source_only_abi_warnings.py", "buck_server": "bin/buck", "buck_build_type_info": "config/build_type/LOCAL_ANT/type.txt", "dx": "third-party/java/dx/etc/dx", "jacoco_agent_jar": "third-party/java/jacoco/jacocoagent.jar", "libjcocoa.dylib": "third-party/java/ObjCBridge/libjcocoa.dylib", "logging_config_file": "config/logging.properties.st", "native_exopackage_fake_path": "assets/android/native-exopackage-fakes.apk", "path_to_sh_binary_template": "src/com/facebook/buck/shell/sh_binary_template", "path_to_isolated_trampoline": "src/com/facebook/buck/rules/modern/builders/trampoline.sh", "report_generator_jar": "ant-out/report-generator.jar", "testrunner_classes": "ant-out/testrunner/classes", # python resources used by buck file parser. "path_to_pathlib_py": "third-party/py/pathlib/pathlib.py", "path_to_pywatchman": "third-party/py/pywatchman", "path_to_typing": "third-party/py/typing/python2", "path_to_six_py": "third-party/py/six/six.py", "path_to_python_dsl": "python-dsl", } BUCK_BINARY_HASH_LOCATION = os.path.join( "ant-out", "classes", "META-INF", "buck-binary-hash.txt" ) BUCK_INFO_LOCATION = os.path.join("ant-out", "buck-info.json") class BuckRepo(BuckTool): def __init__(self, buck_bin_dir, buck_project, buck_reporter): self.buck_dir = platform_path(os.path.dirname(buck_bin_dir)) super(BuckRepo, self).__init__(buck_project, buck_reporter) dot_git = os.path.join(self.buck_dir, ".git") self.is_git = ( os.path.exists(dot_git) and os.path.isdir(dot_git) and which("git") and sys.platform != "cygwin" ) self._is_buck_repo_dirty_override = os.environ.get("BUCK_REPOSITORY_DIRTY") if not self._fake_buck_version: # self._fake_buck_version has been set previously through BuckTool when the environment # variable BUCK_FAKE_VERSION is set. # If the environement variable is not set, we'll use the content of .fakebuckversion # at the root of the repository if it exists. fake_buck_version_file_path = os.path.join( self.buck_dir, ".fakebuckversion" ) if os.path.exists(fake_buck_version_file_path): with open(fake_buck_version_file_path) as fake_buck_version_file: self._fake_buck_version = fake_buck_version_file.read().strip() logging.info( "Using fake buck version (via .fakebuckversion): {}".format( self._fake_buck_version ) ) def _get_package_info(self): return json.loads(self.__read_file(BUCK_INFO_LOCATION)) def __read_file(self, filename): with open(os.path.join(self.buck_dir, filename)) as file: return file.read().strip() def _join_buck_dir(self, relative_path): return os.path.join(self.buck_dir, *(relative_path.split("/"))) def _get_resource_lock_path(self): return None def _has_resource(self, resource): return True def _get_resource(self, resource, exe=False): return self._join_buck_dir(RESOURCES[resource.name]) def _get_buck_git_commit(self): return self._get_buck_version_uid() def _get_buck_repo_dirty(self): return ( self._is_buck_repo_dirty_override == "1" or self._package_info["is_dirty"] ) def _get_extra_java_args(self): with Tracing("BuckRepo._get_extra_java_args"): modules_dir = os.path.join(self.buck_dir, "ant-out", "buck-modules") module_resources_dir = os.path.join( self.buck_dir, "ant-out", "buck-modules-resources" ) return [ "-Dbuck.git_dirty={0}".format(int(self._get_buck_repo_dirty())), "-Dpf4j.pluginsDir={0}".format(modules_dir), "-Dbuck.mode=repository", "-Dbuck.module.resources={0}".format(module_resources_dir), ] def _get_bootstrap_classpath(self): return self._join_buck_dir("ant-out/bootstrapper/bootstrapper.jar") def _get_buckfilesystem_classpath(self): return self._join_buck_dir("ant-out/buckfilesystem/buckfilesystem.jar") def _unpack_modules(self): pass def _get_java_classpath(self): classpath_file_path = os.path.join( self.buck_dir, "ant-out", "classpath", "classpaths" ) classpath_entries = [] with open(classpath_file_path, "r") as classpath_file: for line in classpath_file.readlines(): line = line.strip() if line.startswith("#"): continue classpath_entries.append(line) return self._pathsep.join([self._join_buck_dir(p) for p in classpath_entries]) def _get_buck_binary_hash(self): return self.__read_file(BUCK_BINARY_HASH_LOCATION) def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): pass