tools/check-license.py (96 lines of code) (raw):

#!/usr/bin/env python3 # Copyright 2023 Google LLC # # 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 # # https://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. import os import sys import glob import json import shutil import requests import check_boilerplate def main(PR): TOKEN = os.getenv('GITHUB_TOKEN') GITHUB_REPOSITORY = os.getenv('GITHUB_REPOSITORY') if PR == 'All': response = open_pr(GITHUB_REPOSITORY) # Looping through all Open PRs for pr in response.json(): commentcheck = prcommentcheck(GITHUB_REPOSITORY, pr['number']) licensecheck(GITHUB_REPOSITORY, TOKEN, pr['number'],commentcheck) else: print('Manual License check for: ' + PR) licensecheck(GITHUB_REPOSITORY, TOKEN, int(PR),'false') def open_pr(GITHUB_REPOSITORY): print('Fetching open PRs...') try: response = requests.get('https://api.github.com/repos/'+ GITHUB_REPOSITORY +'/pulls') return response except requests.exceptions.RequestException as e: raise SystemExit(e) def licensecheck(GITHUB_REPOSITORY, TOKEN, pr, commentcheck): # If commentcheck = 'false' i.e. License check has not run on the PR before. if(commentcheck == 'false'): # if(checkmindiff(pr['created_at']) and commentcheck == 'false'): print('PR # ' + str(pr) + ' : Run Licence check...') # Get all pr files prfiles = pr_files(GITHUB_REPOSITORY,pr) # Download all prf files locally into ./tools/temp/ folder in the same directory structure downloadprfiles(prfiles) # print(os.getcwd()+'/temp') # print(glob.glob(os.getcwd()+'/temp/*')) # print(glob.glob(os.getcwd()+'/temp/*/*')) # print(glob.glob(os.getcwd()+'/temp/*/*/*')) # Run lisence check on the downloaded files in temp directory pr_no_license_files = boilerplate(os.getcwd()+'/temp') # Delete temp directory and its contents shutil.rmtree(os.getcwd()+'/temp') if pr_no_license_files: comment = '<!-- Boilerplate Check -->\nApache 2.0 License check failed!\n\nThe following files are missing the license boilerplate:\n' for x in range(len(pr_no_license_files)): # print (files[x]) comment = comment + '\n' + pr_no_license_files[x] else: comment = '<!-- Boilerplate Check -->\nApache 2.0 License check successful!' # comment PR commentpr(GITHUB_REPOSITORY, pr, comment, TOKEN) else: print('PR # ' + str(pr) + ' : Skip Licence check...') def prcommentcheck(GITHUB_REPOSITORY, pr): print('Checking if the License check has already ran...') try: status = 'false' response = requests.get('https://api.github.com/repos/'+ GITHUB_REPOSITORY +'/issues/'+ str(pr) +'/comments') for comment in response.json(): body = comment['body'] if(body.startswith('<!-- Boilerplate Check -->')): # print(body) status = 'true' break return status except requests.exceptions.RequestException as e: raise SystemExit(e) def boilerplate(local_temp): pr_no_license_files = [] allfiles = check_boilerplate.main(local_temp) try: for x in range(len(allfiles)): pr_no_license_files.append(allfiles[x].replace(local_temp+'/', "")) # print(pr_no_license_files) except: print("All files have the Apache 2.0 Lisence") return pr_no_license_files def pr_files(GITHUB_REPOSITORY,pr): pr_files = [] try: response = requests.get('https://api.github.com/repos/'+ GITHUB_REPOSITORY +'/pulls/'+ str(pr) +'/files') for file in response.json(): if(file['status'] != 'removed'): pr_files.append(file) else: continue # print(pr_files) return pr_files except requests.exceptions.RequestException as e: raise SystemExit(e) def downloadprfiles(prfiles): for file in prfiles: # print('Create Temp Directory') path = os.path.dirname(file['filename']) path = os.getcwd() + '/temp/' + path # print(path) if not os.path.exists(path): os.makedirs(path) # print('Beginning file download with requests') r = requests.get(file['raw_url']) with open(path + '/' + os.path.basename(file['filename']), 'wb') as f: f.write(r.content) # # Retrieve HTTP meta-data # print(r.status_code) # print(r.headers['content-type']) # print(r.encoding) def commentpr(GITHUB_REPOSITORY, pr, comment, TOKEN): headers = {'Authorization': f'token {TOKEN}', 'Accept': 'application/vnd.github.v3+json'} # print(comment) data = {"body":comment} try: response = requests.post('https://api.github.com/repos/'+ GITHUB_REPOSITORY +'/issues/'+ str(pr) +'/comments', data=json.dumps(data), headers=headers) # print(response.text) except requests.exceptions.RequestException as e: raise SystemExit(e) if __name__ == '__main__': if len(sys.argv) == 2: main(sys.argv[1]) else: main('All')