1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*90c8c64dSAndroid Build Coastguard Worker# 3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker# 17*90c8c64dSAndroid Build Coastguard Worker 18*90c8c64dSAndroid Build Coastguard Workerimport argparse 19*90c8c64dSAndroid Build Coastguard Workerimport glob 20*90c8c64dSAndroid Build Coastguard Workerimport logging 21*90c8c64dSAndroid Build Coastguard Workerimport os 22*90c8c64dSAndroid Build Coastguard Workerimport shutil 23*90c8c64dSAndroid Build Coastguard Workerimport subprocess 24*90c8c64dSAndroid Build Coastguard Workerimport tempfile 25*90c8c64dSAndroid Build Coastguard Workerimport xml.etree.ElementTree as xml_tree 26*90c8c64dSAndroid Build Coastguard Worker 27*90c8c64dSAndroid Build Coastguard Workerimport utils 28*90c8c64dSAndroid Build Coastguard Worker 29*90c8c64dSAndroid Build Coastguard Worker 30*90c8c64dSAndroid Build Coastguard Workerclass GPLChecker(object): 31*90c8c64dSAndroid Build Coastguard Worker """Checks that all GPL projects in a VNDK snapshot have released sources. 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker Makes sure that the current source tree have the sources for all GPL 34*90c8c64dSAndroid Build Coastguard Worker prebuilt libraries in a specified VNDK snapshot version. 35*90c8c64dSAndroid Build Coastguard Worker """ 36*90c8c64dSAndroid Build Coastguard Worker MANIFEST_XML = utils.MANIFEST_FILE_NAME 37*90c8c64dSAndroid Build Coastguard Worker MODULE_PATHS_TXT = utils.MODULE_PATHS_FILE_NAME 38*90c8c64dSAndroid Build Coastguard Worker 39*90c8c64dSAndroid Build Coastguard Worker def __init__(self, install_dir, android_build_top, gpl_projects, 40*90c8c64dSAndroid Build Coastguard Worker temp_artifact_dir, remote_git): 41*90c8c64dSAndroid Build Coastguard Worker """GPLChecker constructor. 42*90c8c64dSAndroid Build Coastguard Worker 43*90c8c64dSAndroid Build Coastguard Worker Args: 44*90c8c64dSAndroid Build Coastguard Worker install_dir: string, absolute path to the prebuilts/vndk/v{version} 45*90c8c64dSAndroid Build Coastguard Worker directory where the build files will be generated. 46*90c8c64dSAndroid Build Coastguard Worker android_build_top: string, absolute path to ANDROID_BUILD_TOP 47*90c8c64dSAndroid Build Coastguard Worker gpl_projects: list of strings, names of libraries under GPL 48*90c8c64dSAndroid Build Coastguard Worker temp_artifact_dir: string, temp directory to hold build artifacts 49*90c8c64dSAndroid Build Coastguard Worker fetched from Android Build server. 50*90c8c64dSAndroid Build Coastguard Worker remote_git: string, remote name to fetch and check if the revision of 51*90c8c64dSAndroid Build Coastguard Worker VNDK snapshot is included in the source if it is not in the current 52*90c8c64dSAndroid Build Coastguard Worker git repository. 53*90c8c64dSAndroid Build Coastguard Worker """ 54*90c8c64dSAndroid Build Coastguard Worker self._android_build_top = android_build_top 55*90c8c64dSAndroid Build Coastguard Worker self._install_dir = install_dir 56*90c8c64dSAndroid Build Coastguard Worker self._remote_git = remote_git 57*90c8c64dSAndroid Build Coastguard Worker self._gpl_projects = gpl_projects 58*90c8c64dSAndroid Build Coastguard Worker self._manifest_file = os.path.join(temp_artifact_dir, 59*90c8c64dSAndroid Build Coastguard Worker self.MANIFEST_XML) 60*90c8c64dSAndroid Build Coastguard Worker 61*90c8c64dSAndroid Build Coastguard Worker if not os.path.isfile(self._manifest_file): 62*90c8c64dSAndroid Build Coastguard Worker raise RuntimeError( 63*90c8c64dSAndroid Build Coastguard Worker '{manifest} not found at {manifest_file}'.format( 64*90c8c64dSAndroid Build Coastguard Worker manifest=self.MANIFEST_XML, 65*90c8c64dSAndroid Build Coastguard Worker manifest_file=self._manifest_file)) 66*90c8c64dSAndroid Build Coastguard Worker 67*90c8c64dSAndroid Build Coastguard Worker def _parse_module_paths(self): 68*90c8c64dSAndroid Build Coastguard Worker """Parses the module_paths.txt files into a dictionary, 69*90c8c64dSAndroid Build Coastguard Worker 70*90c8c64dSAndroid Build Coastguard Worker Returns: 71*90c8c64dSAndroid Build Coastguard Worker module_paths: dict, e.g. {libfoo.so: some/path/here} 72*90c8c64dSAndroid Build Coastguard Worker """ 73*90c8c64dSAndroid Build Coastguard Worker module_paths = dict() 74*90c8c64dSAndroid Build Coastguard Worker for file in utils.find(self._install_dir, [self.MODULE_PATHS_TXT]): 75*90c8c64dSAndroid Build Coastguard Worker file_path = os.path.join(self._install_dir, file) 76*90c8c64dSAndroid Build Coastguard Worker with open(file_path, 'r') as f: 77*90c8c64dSAndroid Build Coastguard Worker for line in f.read().strip().split('\n'): 78*90c8c64dSAndroid Build Coastguard Worker paths = line.split(' ') 79*90c8c64dSAndroid Build Coastguard Worker if len(paths) > 1: 80*90c8c64dSAndroid Build Coastguard Worker if paths[0] not in module_paths: 81*90c8c64dSAndroid Build Coastguard Worker module_paths[paths[0]] = paths[1] 82*90c8c64dSAndroid Build Coastguard Worker return module_paths 83*90c8c64dSAndroid Build Coastguard Worker 84*90c8c64dSAndroid Build Coastguard Worker def _parse_manifest(self): 85*90c8c64dSAndroid Build Coastguard Worker """Parses manifest.xml file and returns list of 'project' tags.""" 86*90c8c64dSAndroid Build Coastguard Worker 87*90c8c64dSAndroid Build Coastguard Worker root = xml_tree.parse(self._manifest_file).getroot() 88*90c8c64dSAndroid Build Coastguard Worker return root.findall('project') 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Worker def _get_revision(self, module_path, manifest_projects): 91*90c8c64dSAndroid Build Coastguard Worker """Returns revision value recorded in manifest.xml for given project. 92*90c8c64dSAndroid Build Coastguard Worker 93*90c8c64dSAndroid Build Coastguard Worker Args: 94*90c8c64dSAndroid Build Coastguard Worker module_path: string, project path relative to ANDROID_BUILD_TOP 95*90c8c64dSAndroid Build Coastguard Worker manifest_projects: list of xml_tree.Element, list of 'project' tags 96*90c8c64dSAndroid Build Coastguard Worker """ 97*90c8c64dSAndroid Build Coastguard Worker revision = None 98*90c8c64dSAndroid Build Coastguard Worker for project in manifest_projects: 99*90c8c64dSAndroid Build Coastguard Worker path = project.get('path') 100*90c8c64dSAndroid Build Coastguard Worker if module_path.startswith(path): 101*90c8c64dSAndroid Build Coastguard Worker revision = project.get('revision') 102*90c8c64dSAndroid Build Coastguard Worker break 103*90c8c64dSAndroid Build Coastguard Worker return revision 104*90c8c64dSAndroid Build Coastguard Worker 105*90c8c64dSAndroid Build Coastguard Worker def _check_revision_exists(self, revision, git_project_path): 106*90c8c64dSAndroid Build Coastguard Worker """Checks whether a revision is found in a git project of current tree. 107*90c8c64dSAndroid Build Coastguard Worker 108*90c8c64dSAndroid Build Coastguard Worker Args: 109*90c8c64dSAndroid Build Coastguard Worker revision: string, revision value recorded in manifest.xml 110*90c8c64dSAndroid Build Coastguard Worker git_project_path: string, path relative to ANDROID_BUILD_TOP 111*90c8c64dSAndroid Build Coastguard Worker """ 112*90c8c64dSAndroid Build Coastguard Worker path = utils.join_realpath(self._android_build_top, git_project_path) 113*90c8c64dSAndroid Build Coastguard Worker 114*90c8c64dSAndroid Build Coastguard Worker def _check_rev_list(revision): 115*90c8c64dSAndroid Build Coastguard Worker """Checks whether revision is reachable from HEAD of git project.""" 116*90c8c64dSAndroid Build Coastguard Worker 117*90c8c64dSAndroid Build Coastguard Worker logging.info('Checking if revision {rev} exists in {proj}'.format( 118*90c8c64dSAndroid Build Coastguard Worker rev=revision, proj=git_project_path)) 119*90c8c64dSAndroid Build Coastguard Worker try: 120*90c8c64dSAndroid Build Coastguard Worker cmd = [ 121*90c8c64dSAndroid Build Coastguard Worker 'git', '-C', path, 'rev-list', 'HEAD..{}'.format(revision) 122*90c8c64dSAndroid Build Coastguard Worker ] 123*90c8c64dSAndroid Build Coastguard Worker output = utils.check_output(cmd).strip() 124*90c8c64dSAndroid Build Coastguard Worker except subprocess.CalledProcessError as error: 125*90c8c64dSAndroid Build Coastguard Worker logging.error('Error: {}'.format(error)) 126*90c8c64dSAndroid Build Coastguard Worker return False 127*90c8c64dSAndroid Build Coastguard Worker else: 128*90c8c64dSAndroid Build Coastguard Worker if output: 129*90c8c64dSAndroid Build Coastguard Worker logging.debug( 130*90c8c64dSAndroid Build Coastguard Worker '{proj} does not have the following revisions: {rev}'. 131*90c8c64dSAndroid Build Coastguard Worker format(proj=git_project_path, rev=output)) 132*90c8c64dSAndroid Build Coastguard Worker return False 133*90c8c64dSAndroid Build Coastguard Worker else: 134*90c8c64dSAndroid Build Coastguard Worker logging.info( 135*90c8c64dSAndroid Build Coastguard Worker 'Found revision {rev} in project {proj}'.format( 136*90c8c64dSAndroid Build Coastguard Worker rev=revision, proj=git_project_path)) 137*90c8c64dSAndroid Build Coastguard Worker return True 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker def _get_2nd_parent_if_merge_commit(revision): 140*90c8c64dSAndroid Build Coastguard Worker """Checks if the commit is merge commit. 141*90c8c64dSAndroid Build Coastguard Worker 142*90c8c64dSAndroid Build Coastguard Worker Returns: 143*90c8c64dSAndroid Build Coastguard Worker revision: string, the 2nd parent which is the merged commit. 144*90c8c64dSAndroid Build Coastguard Worker If the commit is not a merge commit, returns None. 145*90c8c64dSAndroid Build Coastguard Worker """ 146*90c8c64dSAndroid Build Coastguard Worker logging.info( 147*90c8c64dSAndroid Build Coastguard Worker 'Checking if the parent of revision {rev} exists in {proj}'. 148*90c8c64dSAndroid Build Coastguard Worker format(rev=revision, proj=git_project_path)) 149*90c8c64dSAndroid Build Coastguard Worker try: 150*90c8c64dSAndroid Build Coastguard Worker cmd = [ 151*90c8c64dSAndroid Build Coastguard Worker 'git', '-C', path, 'rev-parse', '--verify', 152*90c8c64dSAndroid Build Coastguard Worker '{}^2'.format(revision)] 153*90c8c64dSAndroid Build Coastguard Worker parent_revision = utils.check_output(cmd).strip() 154*90c8c64dSAndroid Build Coastguard Worker except subprocess.CalledProcessError as error: 155*90c8c64dSAndroid Build Coastguard Worker logging.error( 156*90c8c64dSAndroid Build Coastguard Worker 'Failed to get parent of revision {rev} from "{remote}": ' 157*90c8c64dSAndroid Build Coastguard Worker '{err}'.format( 158*90c8c64dSAndroid Build Coastguard Worker rev=revision, remote=self._remote_git, err=error)) 159*90c8c64dSAndroid Build Coastguard Worker logging.error('{} is not a merge commit and must be included ' 160*90c8c64dSAndroid Build Coastguard Worker 'in the current branch'.format(revision)) 161*90c8c64dSAndroid Build Coastguard Worker return None 162*90c8c64dSAndroid Build Coastguard Worker else: 163*90c8c64dSAndroid Build Coastguard Worker return parent_revision 164*90c8c64dSAndroid Build Coastguard Worker 165*90c8c64dSAndroid Build Coastguard Worker if _check_rev_list(revision): 166*90c8c64dSAndroid Build Coastguard Worker return True 167*90c8c64dSAndroid Build Coastguard Worker 168*90c8c64dSAndroid Build Coastguard Worker # VNDK snapshots built from a *-release branch will have merge 169*90c8c64dSAndroid Build Coastguard Worker # CLs in the manifest because the *-dev branch is merged to the 170*90c8c64dSAndroid Build Coastguard Worker # *-release branch periodically. In order to extract the 171*90c8c64dSAndroid Build Coastguard Worker # revision relevant to the source of the git_project_path, 172*90c8c64dSAndroid Build Coastguard Worker # we find the parent of the merge commit. 173*90c8c64dSAndroid Build Coastguard Worker try: 174*90c8c64dSAndroid Build Coastguard Worker cmd = ['git', '-C', path, 'fetch', self._remote_git, revision] 175*90c8c64dSAndroid Build Coastguard Worker utils.check_call(cmd) 176*90c8c64dSAndroid Build Coastguard Worker except subprocess.CalledProcessError as error: 177*90c8c64dSAndroid Build Coastguard Worker logging.error( 178*90c8c64dSAndroid Build Coastguard Worker 'Failed to fetch revision {rev} from "{remote}": ' 179*90c8c64dSAndroid Build Coastguard Worker '{err}'.format( 180*90c8c64dSAndroid Build Coastguard Worker rev=revision, remote=self._remote_git, err=error)) 181*90c8c64dSAndroid Build Coastguard Worker logging.error('Try --remote to manually set remote name') 182*90c8c64dSAndroid Build Coastguard Worker raise 183*90c8c64dSAndroid Build Coastguard Worker 184*90c8c64dSAndroid Build Coastguard Worker parent_revision = _get_2nd_parent_if_merge_commit(revision) 185*90c8c64dSAndroid Build Coastguard Worker while True: 186*90c8c64dSAndroid Build Coastguard Worker if not parent_revision: 187*90c8c64dSAndroid Build Coastguard Worker return False 188*90c8c64dSAndroid Build Coastguard Worker if _check_rev_list(parent_revision): 189*90c8c64dSAndroid Build Coastguard Worker return True 190*90c8c64dSAndroid Build Coastguard Worker parent_revision = _get_2nd_parent_if_merge_commit(parent_revision) 191*90c8c64dSAndroid Build Coastguard Worker 192*90c8c64dSAndroid Build Coastguard Worker def check_gpl_projects(self): 193*90c8c64dSAndroid Build Coastguard Worker """Checks that all GPL projects have released sources. 194*90c8c64dSAndroid Build Coastguard Worker 195*90c8c64dSAndroid Build Coastguard Worker Raises: 196*90c8c64dSAndroid Build Coastguard Worker ValueError: There are GPL projects with unreleased sources. 197*90c8c64dSAndroid Build Coastguard Worker """ 198*90c8c64dSAndroid Build Coastguard Worker logging.info('Starting license check for GPL projects...') 199*90c8c64dSAndroid Build Coastguard Worker 200*90c8c64dSAndroid Build Coastguard Worker if not self._gpl_projects: 201*90c8c64dSAndroid Build Coastguard Worker logging.info('No GPL projects found.') 202*90c8c64dSAndroid Build Coastguard Worker return 203*90c8c64dSAndroid Build Coastguard Worker 204*90c8c64dSAndroid Build Coastguard Worker logging.info('GPL projects found: {}'.format(', '.join(self._gpl_projects))) 205*90c8c64dSAndroid Build Coastguard Worker 206*90c8c64dSAndroid Build Coastguard Worker module_paths = self._parse_module_paths() 207*90c8c64dSAndroid Build Coastguard Worker manifest_projects = self._parse_manifest() 208*90c8c64dSAndroid Build Coastguard Worker released_projects = [] 209*90c8c64dSAndroid Build Coastguard Worker unreleased_projects = [] 210*90c8c64dSAndroid Build Coastguard Worker 211*90c8c64dSAndroid Build Coastguard Worker for name in self._gpl_projects: 212*90c8c64dSAndroid Build Coastguard Worker lib = name if name.endswith('.so') else name + '.so' 213*90c8c64dSAndroid Build Coastguard Worker if lib not in module_paths: 214*90c8c64dSAndroid Build Coastguard Worker raise RuntimeError( 215*90c8c64dSAndroid Build Coastguard Worker 'No module path was found for {lib} in {module_paths}'. 216*90c8c64dSAndroid Build Coastguard Worker format(lib=lib, module_paths=self.MODULE_PATHS_TXT)) 217*90c8c64dSAndroid Build Coastguard Worker 218*90c8c64dSAndroid Build Coastguard Worker module_path = module_paths[lib] 219*90c8c64dSAndroid Build Coastguard Worker revision = self._get_revision(module_path, manifest_projects) 220*90c8c64dSAndroid Build Coastguard Worker if not revision: 221*90c8c64dSAndroid Build Coastguard Worker raise RuntimeError( 222*90c8c64dSAndroid Build Coastguard Worker 'No project found for {path} in {manifest}'.format( 223*90c8c64dSAndroid Build Coastguard Worker path=module_path, manifest=self.MANIFEST_XML)) 224*90c8c64dSAndroid Build Coastguard Worker revision_exists = self._check_revision_exists( 225*90c8c64dSAndroid Build Coastguard Worker revision, module_path) 226*90c8c64dSAndroid Build Coastguard Worker if not revision_exists: 227*90c8c64dSAndroid Build Coastguard Worker unreleased_projects.append((lib, module_path)) 228*90c8c64dSAndroid Build Coastguard Worker else: 229*90c8c64dSAndroid Build Coastguard Worker released_projects.append((lib, module_path)) 230*90c8c64dSAndroid Build Coastguard Worker 231*90c8c64dSAndroid Build Coastguard Worker if released_projects: 232*90c8c64dSAndroid Build Coastguard Worker logging.info('Released GPL projects: {}'.format(released_projects)) 233*90c8c64dSAndroid Build Coastguard Worker 234*90c8c64dSAndroid Build Coastguard Worker if unreleased_projects: 235*90c8c64dSAndroid Build Coastguard Worker raise ValueError( 236*90c8c64dSAndroid Build Coastguard Worker ('FAIL: The following GPL projects have NOT been released in ' 237*90c8c64dSAndroid Build Coastguard Worker 'current tree: {}'.format(unreleased_projects))) 238*90c8c64dSAndroid Build Coastguard Worker 239*90c8c64dSAndroid Build Coastguard Worker logging.info('PASS: All GPL projects have source in current tree.') 240*90c8c64dSAndroid Build Coastguard Worker 241*90c8c64dSAndroid Build Coastguard Worker 242*90c8c64dSAndroid Build Coastguard Workerdef get_args(): 243*90c8c64dSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 244*90c8c64dSAndroid Build Coastguard Worker parser.add_argument( 245*90c8c64dSAndroid Build Coastguard Worker 'vndk_version', 246*90c8c64dSAndroid Build Coastguard Worker type=utils.vndk_version_int, 247*90c8c64dSAndroid Build Coastguard Worker help='VNDK snapshot version to check, e.g. "{}".'.format( 248*90c8c64dSAndroid Build Coastguard Worker utils.MINIMUM_VNDK_VERSION)) 249*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('-b', '--branch', help='Branch to pull manifest from.') 250*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('--build', help='Build number to pull manifest from.') 251*90c8c64dSAndroid Build Coastguard Worker parser.add_argument( 252*90c8c64dSAndroid Build Coastguard Worker '--remote', 253*90c8c64dSAndroid Build Coastguard Worker default='aosp', 254*90c8c64dSAndroid Build Coastguard Worker help=('Remote name to fetch and check if the revision of VNDK snapshot ' 255*90c8c64dSAndroid Build Coastguard Worker 'is included in the source to conform GPL license. default=aosp')) 256*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('-m', '--modules', help='list of modules to check', 257*90c8c64dSAndroid Build Coastguard Worker nargs='+') 258*90c8c64dSAndroid Build Coastguard Worker parser.add_argument( 259*90c8c64dSAndroid Build Coastguard Worker '-v', 260*90c8c64dSAndroid Build Coastguard Worker '--verbose', 261*90c8c64dSAndroid Build Coastguard Worker action='count', 262*90c8c64dSAndroid Build Coastguard Worker default=0, 263*90c8c64dSAndroid Build Coastguard Worker help='Increase output verbosity, e.g. "-v", "-vv".') 264*90c8c64dSAndroid Build Coastguard Worker return parser.parse_args() 265*90c8c64dSAndroid Build Coastguard Worker 266*90c8c64dSAndroid Build Coastguard Worker 267*90c8c64dSAndroid Build Coastguard Workerdef main(): 268*90c8c64dSAndroid Build Coastguard Worker """For local testing purposes. 269*90c8c64dSAndroid Build Coastguard Worker 270*90c8c64dSAndroid Build Coastguard Worker Note: VNDK snapshot must be already installed under 271*90c8c64dSAndroid Build Coastguard Worker prebuilts/vndk/v{version}. 272*90c8c64dSAndroid Build Coastguard Worker """ 273*90c8c64dSAndroid Build Coastguard Worker ANDROID_BUILD_TOP = utils.get_android_build_top() 274*90c8c64dSAndroid Build Coastguard Worker PREBUILTS_VNDK_DIR = utils.join_realpath(ANDROID_BUILD_TOP, 275*90c8c64dSAndroid Build Coastguard Worker 'prebuilts/vndk') 276*90c8c64dSAndroid Build Coastguard Worker 277*90c8c64dSAndroid Build Coastguard Worker args = get_args() 278*90c8c64dSAndroid Build Coastguard Worker vndk_version = args.vndk_version 279*90c8c64dSAndroid Build Coastguard Worker install_dir = os.path.join(PREBUILTS_VNDK_DIR, 'v{}'.format(vndk_version)) 280*90c8c64dSAndroid Build Coastguard Worker remote = args.remote 281*90c8c64dSAndroid Build Coastguard Worker if not os.path.isdir(install_dir): 282*90c8c64dSAndroid Build Coastguard Worker raise ValueError( 283*90c8c64dSAndroid Build Coastguard Worker 'Please provide valid VNDK version. {} does not exist.' 284*90c8c64dSAndroid Build Coastguard Worker .format(install_dir)) 285*90c8c64dSAndroid Build Coastguard Worker utils.set_logging_config(args.verbose) 286*90c8c64dSAndroid Build Coastguard Worker 287*90c8c64dSAndroid Build Coastguard Worker temp_artifact_dir = tempfile.mkdtemp() 288*90c8c64dSAndroid Build Coastguard Worker os.chdir(temp_artifact_dir) 289*90c8c64dSAndroid Build Coastguard Worker manifest_pattern = 'manifest_{}.xml'.format(args.build) 290*90c8c64dSAndroid Build Coastguard Worker manifest_dest = os.path.join(temp_artifact_dir, utils.MANIFEST_FILE_NAME) 291*90c8c64dSAndroid Build Coastguard Worker logging.info('Fetching {file} from {branch} (bid: {build})'.format( 292*90c8c64dSAndroid Build Coastguard Worker file=manifest_pattern, branch=args.branch, build=args.build)) 293*90c8c64dSAndroid Build Coastguard Worker utils.fetch_artifact(args.branch, args.build, manifest_pattern, 294*90c8c64dSAndroid Build Coastguard Worker manifest_dest) 295*90c8c64dSAndroid Build Coastguard Worker 296*90c8c64dSAndroid Build Coastguard Worker license_checker = GPLChecker(install_dir, ANDROID_BUILD_TOP, args.modules, 297*90c8c64dSAndroid Build Coastguard Worker temp_artifact_dir, remote) 298*90c8c64dSAndroid Build Coastguard Worker try: 299*90c8c64dSAndroid Build Coastguard Worker license_checker.check_gpl_projects() 300*90c8c64dSAndroid Build Coastguard Worker except ValueError as error: 301*90c8c64dSAndroid Build Coastguard Worker logging.error('Error: {}'.format(error)) 302*90c8c64dSAndroid Build Coastguard Worker raise 303*90c8c64dSAndroid Build Coastguard Worker finally: 304*90c8c64dSAndroid Build Coastguard Worker logging.info( 305*90c8c64dSAndroid Build Coastguard Worker 'Deleting temp_artifact_dir: {}'.format(temp_artifact_dir)) 306*90c8c64dSAndroid Build Coastguard Worker shutil.rmtree(temp_artifact_dir) 307*90c8c64dSAndroid Build Coastguard Worker 308*90c8c64dSAndroid Build Coastguard Worker logging.info('Done.') 309*90c8c64dSAndroid Build Coastguard Worker 310*90c8c64dSAndroid Build Coastguard Worker 311*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__': 312*90c8c64dSAndroid Build Coastguard Worker main() 313