From abe23cbb1e583cc5cf963a60e4f3126d5c2ed678 Mon Sep 17 00:00:00 2001 From: Shamy Date: Mon, 17 Jul 2023 12:40:17 +0100 Subject: [PATCH 01/10] added code --- cli/analyser.py | 32 ++++++++++---- cli/config.py | 111 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 125 insertions(+), 18 deletions(-) diff --git a/cli/analyser.py b/cli/analyser.py index 5bbddf2..9e7c3b1 100644 --- a/cli/analyser.py +++ b/cli/analyser.py @@ -15,6 +15,18 @@ # Check for GitHub Actions githubActions = c.get_gha(repo) + # Check for Dependency Management + dependencyManagement = c.get_dependency_management(repo) + + # Check for Integration Suite (GHA) + integrationSuite = c.get_gha_integration(repo) + + # Check for Concurrency Rule (GHA) + concurrencyRule = c.get_gha_concurrency(repo) + + # Check for Mend (GHA) + mend = c.get_mend_gha(repo) + # Return to the root directory and delete the repo c.return_to_root(repo) except: @@ -24,13 +36,17 @@ # Print the repository information to the console try: - print('--------------------------------') - print(f'Repository: {repo}') - print(f'Package Manager: {packageManager}') - print(f'Semantic Release: {semanticRelease}') - print(f'GitHub Actions: {githubActions}') - print('--------------------------------') + print(f'{c.CYAN}--------------------------------{c.RESET}') + print(f'Repository: {c.YELLOW}{repo}{c.RESET}') + print(f'Package Manager: {c.RED if packageManager == "No" else c.GREEN}{packageManager}{c.RESET}') + print(f'Semantic Release: {c.GREEN if semanticRelease == "Yes" else c.RED}{semanticRelease}{c.RESET}') + print(f'GitHub Actions: {c.GREEN if githubActions == "Yes" else c.RED}{githubActions}{c.RESET}') + print(f'Dependency Management: {c.RED if dependencyManagement == "No" else c.GREEN}{dependencyManagement}{c.RESET}') + print(f'Integration Suite (GHA): {c.GREEN if integrationSuite == "Yes" else c.RED}{integrationSuite}{c.RESET}') + print(f'Concurrency Rule (GHA): {c.GREEN if concurrencyRule == "Yes" else c.RED}{concurrencyRule}{c.RESET}') + print(f'Mend (GHA): {c.GREEN if mend == "Yes" else c.RED}{mend}{c.RESET}') + print(f'{c.CYAN}--------------------------------{c.RESET}') except: - print(f'Failed to print to the console for {repo}.') - print('Exiting program.') + print(f'{c.RED}Failed to print to the console for {repo}.') + print(f'{c.RED}Exiting program.') exit() diff --git a/cli/config.py b/cli/config.py index 5833463..791ce9f 100644 --- a/cli/config.py +++ b/cli/config.py @@ -1,10 +1,24 @@ import os import json import glob +import subprocess +import datetime +import pytz class Config: + # - # List of repositories to migrate + # Colored output + # + + RED = '\033[91m' + GREEN = '\033[92m' + YELLOW = '\033[93m' + CYAN = '\033[96m' + RESET = '\033[0m' + + # + # List of repositories to analyze # repos = [ @@ -18,8 +32,13 @@ class Config: # Clone the repository and change directory def clone_repo(repo_name): - os.system(f"git clone https://github.com/HT2-Labs/{repo_name}.git") - os.chdir(repo_name) + try: + os.system(f"git clone https://github.com/HT2-Labs/{repo_name}.git") + os.chdir(repo_name) + except: + print(f'Failed to clone the repository {repo_name}.') + print('Exiting program.') + exit() # Change directory back to root and delete the cloned repository def return_to_root(repo_name): @@ -29,7 +48,7 @@ def return_to_root(repo_name): # Check the repository for 'package-lock.json' or 'yarn.lock' def get_package_manager(repo_name): try: - # Check if 'package-lock.json' and 'yarn.lock' exists in the repository + # Check if 'package-lock.json' and 'yarn.lock' exist in the repository packageLockJsonExists = os.path.isfile('package-lock.json') yarnLockExists = os.path.isfile('yarn.lock') @@ -51,7 +70,7 @@ def get_semantic_release(repo_name): try: packageJsonExists = os.path.isfile('package.json') - if packageJsonExists == True: + if packageJsonExists: with open('package.json', 'r') as f: data = json.load(f) @@ -60,7 +79,7 @@ def get_semantic_release(repo_name): semanticRelease = False # If semanticRelease is True, return 'Yes'. Otherwise, return 'No' - if semanticRelease == True: + if semanticRelease: return 'Yes' else: return 'No' @@ -68,6 +87,70 @@ def get_semantic_release(repo_name): print(f'Failed to check for Semantic Release for {repo_name}.') print('Exiting program.') exit() + + # Check the repository for Integration Suite (GHA) + def get_gha_integration(repo_name): + try: + ymlFiles = glob.glob('.github/workflows/*.yml') + yamlFiles = glob.glob('.github/workflows/*.yaml') + allFiles = ymlFiles + yamlFiles + keywords = ["test", "build", "integration"] + for file in allFiles: + with open(file, 'r') as f: + if any(keyword in line for line in f for keyword in keywords): + return "Yes" + return "No" + except: + print(f'Failed to check for Integration Suite (GHA) for {repo_name}.') + print('Exiting program.') + exit() + + # Check the repository for Concurrency Rule (GHA) + def get_gha_concurrency(repo_name): + try: + ymlFiles = glob.glob('.github/workflows/*.yml') + yamlFiles = glob.glob('.github/workflows/*.yaml') + allFiles = ymlFiles + yamlFiles + for file in allFiles: + with open(file, 'r') as f: + if 'concurrency' in f.read(): + return "Yes" + return "No" + except: + print(f'Failed to check for Concurrency Rule (GHA) for {repo_name}.') + print('Exiting program.') + exit() + + # Check the repository for Mend (GHA) + def get_mend_gha(repo_name): + try: + ymlFiles = glob.glob('.github/workflows/*.yml') + yamlFiles = glob.glob('.github/workflows/*.yaml') + allFiles = ymlFiles + yamlFiles + for file in allFiles: + with open(file, 'r') as f: + if 'mend' in f.read(): + return "Yes" + return "No" + except: + print(f'Failed to check for Mend (GHA) for {repo_name}.') + print('Exiting program.') + exit() + + # Check the repository for Dependency Management + def get_dependency_management(repo_name): + try: + process = subprocess.run(["gh", "pr", "list"], capture_output=True, text=True) + output = process.stdout + if "renovate" in output : + return "Renovate" + elif "dependabot" in output: + return "Dependabot" + return "No" + except: + print(f'Failed to check for Dependency Management for {repo_name}.') + print('Exiting program.') + exit() # Check the repository for GitHub Actions files def get_gha(repo_name): @@ -75,10 +158,18 @@ def get_gha(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') - if ymlFiles or yamlFiles: - return 'Yes' - else: - return 'No' + files = ymlFiles + yamlFiles + + one_year_ago = datetime.datetime.now(pytz.utc) - datetime.timedelta(days=365) + + for file in files: + result = subprocess.run(['git', 'log', '-1', '--format=%cd', file], capture_output=True, text=True) + file_date = datetime.datetime.strptime(result.stdout.strip(), '%a %b %d %H:%M:%S %Y %z').replace(tzinfo=pytz.utc) + + if file_date > one_year_ago: + return 'Yes' + return 'No' # If no recent files are found + except: print(f'Failed to check for GitHub Actions files for {repo_name}.') print('Exiting program.') From 5525471ee1842c53b5f1bd8654d1acd8badc17e0 Mon Sep 17 00:00:00 2001 From: Shamy Date: Mon, 17 Jul 2023 14:37:27 +0100 Subject: [PATCH 02/10] last commit before rev with Aodhan --- LP Github repos.xlsx | Bin 0 -> 5576 bytes cli/amendSheet.py | 78 +++++++++++++++++++++++++++++ cli/analyser.py | 113 +++++++++++++++++++++++++++---------------- 3 files changed, 149 insertions(+), 42 deletions(-) create mode 100644 LP Github repos.xlsx create mode 100644 cli/amendSheet.py diff --git a/LP Github repos.xlsx b/LP Github repos.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..26ce4aa5cff5eb80ff4e67557c58a88ba1c2251d GIT binary patch literal 5576 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 Date: Mon, 17 Jul 2023 15:30:17 +0100 Subject: [PATCH 03/10] changes --- cli/amendSheet.py | 78 ----------------------------------------------- cli/analyser.py | 2 +- 2 files changed, 1 insertion(+), 79 deletions(-) delete mode 100644 cli/amendSheet.py diff --git a/cli/amendSheet.py b/cli/amendSheet.py deleted file mode 100644 index 847b6f0..0000000 --- a/cli/amendSheet.py +++ /dev/null @@ -1,78 +0,0 @@ -import openpyxl -from openpyxl import Workbook -from openpyxl.styles import Font -from config import Config as c - -# Check if the Excel file exists -try: - workbook = openpyxl.load_workbook('LP Github repos.xlsx') - # Do your amendments to the existing workbook -except FileNotFoundError: - # If the file doesn't exist, create a new workbook - workbook = Workbook() - workbook.save('LP Github repos.xlsx') # Save the new workbook - -# Select the 'LP Github repos' sheet or create it if it doesn't exist -sheet_name = 'LP Github repos' -if sheet_name in workbook.sheetnames: - sheet = workbook[sheet_name] -else: - sheet = workbook.create_sheet(sheet_name) - -# Define the headers in the first row of the sheet if it's a new sheet -if sheet.max_row == 1: - headers = [ - 'Repository Name', - 'Package Manager', - 'Dependency Management', - 'Semantic Release', - 'GHA', - 'Integration Suite (GHA)', - 'Concurrency Rule (GHA)', - 'Mend (GHA)' - ] - for col_num, header in enumerate(headers, start=1): - cell = sheet.cell(row=1, column=col_num) - cell.value = header - cell.font = Font(bold=True) - -# Get the next available row -next_row = sheet.max_row + 1 - -# Iterate over the repositories -for repo_name in c.repos: - # Get the data for the repository - package_manager = c.get_package_manager(repo_name) - dependency_management = c.get_dependency_management(repo_name) - semantic_release = c.get_semantic_release(repo_name) - gha = c.get_gha(repo_name) - integration_suite = c.get_gha_integration(repo_name) - concurrency_rule = c.get_gha_concurrency(repo_name) - mend_gha = c.get_mend_gha(repo_name) - - # Print the values to debug - print("Repository:", repo_name) - print("Package Manager:", package_manager) - print("Dependency Management:", dependency_management) - print("Semantic Release:", semantic_release) - print("GHA:", gha) - print("Integration Suite (GHA):", integration_suite) - print("Concurrency Rule (GHA):", concurrency_rule) - print("Mend (GHA):", mend_gha) - print("------------------------") - - # Write the data to the sheet - sheet.cell(row=next_row, column=1, value=repo_name) - sheet.cell(row=next_row, column=2, value=package_manager) - sheet.cell(row=next_row, column=3, value=dependency_management) - sheet.cell(row=next_row, column=4, value=semantic_release) - sheet.cell(row=next_row, column=5, value=gha) - sheet.cell(row=next_row, column=6, value=integration_suite) - sheet.cell(row=next_row, column=7, value=concurrency_rule) - sheet.cell(row=next_row, column=8, value=mend_gha) - - # Increment the row index - next_row += 1 - -# Save the modified workbook -workbook.save('LP Github repos.xlsx') diff --git a/cli/analyser.py b/cli/analyser.py index 0d1bf14..612f927 100644 --- a/cli/analyser.py +++ b/cli/analyser.py @@ -51,7 +51,7 @@ c.return_to_root(repo) # Write the data to the sheet - row = sheet.max_row + 1 + row = len(sheet['A']) + 1 sheet.cell(row=row, column=1, value=repo) sheet.cell(row=row, column=2, value=package_manager) sheet.cell(row=row, column=3, value=dependency_management) From d65dd8727cb4f02ef964af49567cfbd1d1ce8a4a Mon Sep 17 00:00:00 2001 From: AodhanLP Date: Mon, 17 Jul 2023 15:50:14 +0100 Subject: [PATCH 04/10] Updates --- LP Github repos.xlsx | Bin 5576 -> 5944 bytes cli/config.py | 62 +++++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/LP Github repos.xlsx b/LP Github repos.xlsx index 26ce4aa5cff5eb80ff4e67557c58a88ba1c2251d..2812a76e14e982c687901a3d5abf269b727ed2c8 100644 GIT binary patch delta 3911 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 delta 3541 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 one_year_ago: + return 'Yes' + return 'No' # If no recent files are found + + except: + print(f'Failed to check for GitHub Actions files for {repo_name}.') + print('Exiting program.') + exit() # Check the repository for Integration Suite (GHA) def get_gha_integration(repo_name): @@ -95,6 +123,7 @@ def get_gha_integration(repo_name): yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles keywords = ["test", "build", "integration"] + for file in allFiles: with open(file, 'r') as f: if any(keyword in line for line in f for keyword in keywords): @@ -111,6 +140,7 @@ def get_gha_concurrency(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles + for file in allFiles: with open(file, 'r') as f: if 'concurrency' in f.read(): @@ -127,6 +157,7 @@ def get_mend_gha(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles + for file in allFiles: with open(file, 'r') as f: if 'mend' in f.read(): @@ -142,7 +173,9 @@ def get_dependency_management(repo_name): try: process = subprocess.run(["gh", "pr", "list"], capture_output=True, text=True) output = process.stdout - if "renovate" in output : + if "renovate" and "dependabot" in output: + return "Renovate and Dependabot" + elif "renovate" in output : return "Renovate" elif "dependabot" in output: return "Dependabot" @@ -151,26 +184,3 @@ def get_dependency_management(repo_name): print(f'Failed to check for Dependency Management for {repo_name}.') print('Exiting program.') exit() - - # Check the repository for GitHub Actions files - def get_gha(repo_name): - try: - ymlFiles = glob.glob('.github/workflows/*.yml') - yamlFiles = glob.glob('.github/workflows/*.yaml') - - files = ymlFiles + yamlFiles - - one_year_ago = datetime.datetime.now(pytz.utc) - datetime.timedelta(days=365) - - for file in files: - result = subprocess.run(['git', 'log', '-1', '--format=%cd', file], capture_output=True, text=True) - file_date = datetime.datetime.strptime(result.stdout.strip(), '%a %b %d %H:%M:%S %Y %z').replace(tzinfo=pytz.utc) - - if file_date > one_year_ago: - return 'Yes' - return 'No' # If no recent files are found - - except: - print(f'Failed to check for GitHub Actions files for {repo_name}.') - print('Exiting program.') - exit() From abe90f8f50b949ebbf17256867b3ec7a611de586 Mon Sep 17 00:00:00 2001 From: Shamy Date: Mon, 17 Jul 2023 16:33:40 +0100 Subject: [PATCH 05/10] changes --- LP Github repos.xlsx | Bin 5944 -> 0 bytes cli/LP Github repos.xlsx | Bin 0 -> 5483 bytes cli/analyser.py | 98 ++++++++++++++++++++------------------- cli/config.py | 98 +++++++++++++++++++++++++-------------- 4 files changed, 112 insertions(+), 84 deletions(-) delete mode 100644 LP Github repos.xlsx create mode 100644 cli/LP Github repos.xlsx diff --git a/LP Github repos.xlsx b/LP Github repos.xlsx deleted file mode 100644 index 2812a76e14e982c687901a3d5abf269b727ed2c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5944 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 jx$BdE>;%J`j{oAJ8p one_year_ago: - return 'Yes' - return 'No' # If no recent files are found - - except: - print(f'Failed to check for GitHub Actions files for {repo_name}.') - print('Exiting program.') - exit() # Check the repository for Integration Suite (GHA) def get_gha_integration(repo_name): @@ -123,7 +119,6 @@ def get_gha_integration(repo_name): yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles keywords = ["test", "build", "integration"] - for file in allFiles: with open(file, 'r') as f: if any(keyword in line for line in f for keyword in keywords): @@ -140,7 +135,6 @@ def get_gha_concurrency(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles - for file in allFiles: with open(file, 'r') as f: if 'concurrency' in f.read(): @@ -157,7 +151,6 @@ def get_mend_gha(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles - for file in allFiles: with open(file, 'r') as f: if 'mend' in f.read(): @@ -173,9 +166,7 @@ def get_dependency_management(repo_name): try: process = subprocess.run(["gh", "pr", "list"], capture_output=True, text=True) output = process.stdout - if "renovate" and "dependabot" in output: - return "Renovate and Dependabot" - elif "renovate" in output : + if "renovate" in output : return "Renovate" elif "dependabot" in output: return "Dependabot" @@ -184,3 +175,38 @@ def get_dependency_management(repo_name): print(f'Failed to check for Dependency Management for {repo_name}.') print('Exiting program.') exit() + + # Check the repository for GitHub Actions files + def get_gha(repo_name): + try: + ymlFiles = glob.glob('.github/workflows/*.yml') + yamlFiles = glob.glob('.github/workflows/*.yaml') + + files = ymlFiles + yamlFiles + + one_year_ago = datetime.datetime.now(pytz.utc) - datetime.timedelta(days=365) + + for file in files: + result = subprocess.run(['git', 'log', '-1', '--format=%cd', file], capture_output=True, text=True) + file_date = datetime.datetime.strptime(result.stdout.strip(), '%a %b %d %H:%M:%S %Y %z').replace(tzinfo=pytz.utc) + + if file_date > one_year_ago: + return 'Yes' + return 'No' # If no recent files are found + + except: + print(f'Failed to check for GitHub Actions files for {repo_name}.') + print('Exiting program.') + exit() + + def console_output(repo, package_manager, semantic_release, gha, dependency_management, integration_suite, concurrency_rule, mend_gha): + print(f'{Config.CYAN}--------------------------------{Config.RESET}') + print(f'Repository: {Config.YELLOW}{repo}{Config.RESET}') + print(f'Package Manager: {Config.RED if package_manager == "No" else Config.GREEN}{package_manager}{Config.RESET}') + print(f'Semantic Release: {Config.GREEN if semantic_release == "Yes" else Config.RED}{semantic_release}{Config.RESET}') + print(f'GitHub Actions: {Config.GREEN if gha == "Yes" else Config.RED}{gha}{Config.RESET}') + print(f'Dependency Management: {Config.RED if dependency_management == "No" else Config.GREEN}{dependency_management}{Config.RESET}') + print(f'Integration Suite (GHA): {Config.GREEN if integration_suite == "Yes" else Config.RED}{integration_suite}{Config.RESET}') + print(f'Concurrency Rule (GHA): {Config.GREEN if concurrency_rule == "Yes" else Config.RED}{concurrency_rule}{Config.RESET}') + print(f'Mend (GHA): {Config.GREEN if mend_gha == "Yes" else Config.RED}{mend_gha}{Config.RESET}') + print(f'{Config.CYAN}--------------------------------{Config.RESET}') \ No newline at end of file From ca226252a72dc09be20c32a02f5a34a1afc8b895 Mon Sep 17 00:00:00 2001 From: Shamy Date: Tue, 18 Jul 2023 14:42:34 +0100 Subject: [PATCH 06/10] changes --- cli/LP Github repos.xlsx | Bin 5483 -> 6055 bytes cli/analyser.py | 27 +++-------------- cli/config.py | 61 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/cli/LP Github repos.xlsx b/cli/LP Github repos.xlsx index 3c8820f3da44d10ee1582d177a813a39f8ebc1e2..5057cc022e3f530a8e9ba7944a73382b63c00c3e 100644 GIT binary patch delta 1750 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 DH8Jxk diff --git a/cli/analyser.py b/cli/analyser.py index 6ffb10c..5c54510 100644 --- a/cli/analyser.py +++ b/cli/analyser.py @@ -48,36 +48,17 @@ break # Update the data if the repository already exists, or add a new row otherwise - if repo_exists: - for row in range(2, sheet.max_row + 1): - if sheet.cell(row=row, column=1).value == repo: - sheet.cell(row=row, column=2, value=package_manager) - sheet.cell(row=row, column=3, value=dependency_management) - sheet.cell(row=row, column=4, value=semantic_release) - sheet.cell(row=row, column=5, value=gha) - sheet.cell(row=row, column=6, value=integration_suite) - sheet.cell(row=row, column=7, value=concurrency_rule) - sheet.cell(row=row, column=8, value=mend_gha) - break - else: - next_row = sheet.max_row + 1 - sheet.cell(row=next_row, column=1, value=repo) - sheet.cell(row=next_row, column=2, value=package_manager) - sheet.cell(row=next_row, column=3, value=dependency_management) - sheet.cell(row=next_row, column=4, value=semantic_release) - sheet.cell(row=next_row, column=5, value=gha) - sheet.cell(row=next_row, column=6, value=integration_suite) - sheet.cell(row=next_row, column=7, value=concurrency_rule) - sheet.cell(row=next_row, column=8, value=mend_gha) + c.update_or_add_repo(sheet, repo, repo_exists, package_manager, dependency_management, semantic_release, gha, integration_suite, concurrency_rule, mend_gha) + # Print the repository information c.console_output(repo, package_manager, semantic_release, gha, dependency_management, integration_suite, concurrency_rule, mend_gha) except: - print(f'Failed to analyze {repo}.') + print(f'{c.RED}Failed to analyze {repo}.{c.RESET}') print('Exiting program.') exit() # Save the modified workbook -workbook.save('LP Github repos.xlsx') +workbook.save('LP Github repos.xlsx') \ No newline at end of file diff --git a/cli/config.py b/cli/config.py index c09ac95..2a34233 100644 --- a/cli/config.py +++ b/cli/config.py @@ -25,6 +25,35 @@ class Config: # repos = [ + "adapt-ami", + "adapt-builder", + "adapt-builder-importer", + "adapt-contrib-aboutUs", + "adapt-contrib-articleBlockSlider", + "adapt-contrib-assessmentSingleSubmit", + "adapt-contrib-assistedLearning", + "adapt-contrib-avatar", + "adapt-contrib-branching", + "adapt-contrib-brightcovePlayer", + "adapt-contrib-carbonMenu", + "adapt-contrib-certificate", + "adapt-contrib-chatbot", + "adapt-contrib-homeRedirect", + "adapt-contrib-cinnamonMenu", + "adapt-contrib-confidenceBasedMarking", + "adapt-contrib-confirmExit", + "adapt-contrib-coreMenu", + "adapt-contrib-courseScore", + "adapt-contrib-dyslexia-helper", + "adapt-contrib-exhibit", + "adapt-contrib-fiftyShades", + "adapt-contrib-fillInTheBlanks", + "adapt-contrib-flipcard", + "adapt-contrib-fontAwesomeIcons", + "adapt-contrib-fullScreenMenu", + "adapt-contrib-googleAnalytics", + "adapt-contrib-healthGauge", + "adapt-contrib-hiddenHotspots", "lp-home", "lp-home-web" ] @@ -118,7 +147,7 @@ def get_gha_integration(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles - keywords = ["test", "build", "integration"] + keywords = ["integration suite", "integration"] for file in allFiles: with open(file, 'r') as f: if any(keyword in line for line in f for keyword in keywords): @@ -166,10 +195,12 @@ def get_dependency_management(repo_name): try: process = subprocess.run(["gh", "pr", "list"], capture_output=True, text=True) output = process.stdout - if "renovate" in output : - return "Renovate" + if "renovate" and "dependabot" in output : + return "Renovate and Dependabot" elif "dependabot" in output: return "Dependabot" + elif "renovate" in output: + return "Renovate" return "No" except: print(f'Failed to check for Dependency Management for {repo_name}.') @@ -198,6 +229,30 @@ def get_gha(repo_name): print(f'Failed to check for GitHub Actions files for {repo_name}.') print('Exiting program.') exit() + + def update_or_add_repo(sheet, repo, repo_exists, package_manager, dependency_management, semantic_release, gha, integration_suite, concurrency_rule, mend_gha): + if repo_exists: + for row in range(2, sheet.max_row + 1): + if sheet.cell(row=row, column=1).value == repo: + sheet.cell(row=row, column=2, value=package_manager) + sheet.cell(row=row, column=3, value=dependency_management) + sheet.cell(row=row, column=4, value=semantic_release) + sheet.cell(row=row, column=5, value=gha) + sheet.cell(row=row, column=6, value=integration_suite) + sheet.cell(row=row, column=7, value=concurrency_rule) + sheet.cell(row=row, column=8, value=mend_gha) + break + else: + next_row = sheet.max_row + 1 + sheet.cell(row=next_row, column=1, value=repo) + sheet.cell(row=next_row, column=2, value=package_manager) + sheet.cell(row=next_row, column=3, value=dependency_management) + sheet.cell(row=next_row, column=4, value=semantic_release) + sheet.cell(row=next_row, column=5, value=gha) + sheet.cell(row=next_row, column=6, value=integration_suite) + sheet.cell(row=next_row, column=7, value=concurrency_rule) + sheet.cell(row=next_row, column=8, value=mend_gha) + def console_output(repo, package_manager, semantic_release, gha, dependency_management, integration_suite, concurrency_rule, mend_gha): print(f'{Config.CYAN}--------------------------------{Config.RESET}') From c79fcd7993d022a1f51faf18d1a15030e1b4c9a0 Mon Sep 17 00:00:00 2001 From: Shamy Date: Tue, 18 Jul 2023 16:51:48 +0100 Subject: [PATCH 07/10] added all repo list --- cli/LP Github repos.xlsx | Bin 6055 -> 6266 bytes cli/config.py | 233 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 232 insertions(+), 1 deletion(-) diff --git a/cli/LP Github repos.xlsx b/cli/LP Github repos.xlsx index 5057cc022e3f530a8e9ba7944a73382b63c00c3e..ecc2c38b4dea2f52ccdf786161f6b478b18ff516 100644 GIT binary patch delta 1971 zcmY*ac{CJiAD)qIF!m9HiU=9TE=&|AS6thq#V*CjGBTFY#mFv%hO$nw-Wl7_B<{6O zA)3s!=7va?>?*|E@qII$+jqX+e}3nA&+}W}=RN27Rl^UogdA*+a7zLJ0Dgc|a*j|v z-YNO>pW6M9n<7ZgZ;(0%cRmT0mkG89woPs(G^ zk=qp~T1s((uhxPo{uVmJ8}Ew7r|Zi^X0>(k9s9ghV;;*2vnXi~_oQ0a`;nAY;C!~Aw=&9c(9j3V(ciFvC`&(cCzK`i;8_o5u zxt;B~sB4B#W0b}MY&**!VP9LkmtMig)~9!gubNbAYSB6~fl(Ud3tI=LgCbaSkzx@E zjV4U942%We7EKe9!1Cvy*TRNTbR*DEY^+5Z46xH&Q`Z9{)Z{> zV3slIOpR&MeqS$T+J*KGyL9kmO3*vL8lgT=Gc%J<+l%eA-BVmz@Cz4Ba)0VbFcZZwGs%I7*0u`GmGfw9L<*~~i;o7Q(l z2PucRuvwEv@x?<5BZBnace3A2vhotL^yMx&Qa;9ycB)k2Fz>_F4(74ZqNd9$Pdr*C z-FA4xk%|%|5-Nnbty-lxxMJIU-?PE`xApw+S>`5Ya^81-y|*?>t?D$>KKS(^86P<* zXmEY7<~3|ACv5_393WVHo7Q)-?*83+!!X3fRXF`Eok*d=R;H;sf7jXLZ5W=QO_eBkPn>gD!wdhRmhskqM%B}KICYjl|00sDdRwKCtXM}4-la7S zY$0BkERAp2sy1UpGIp1xo2~jptqJly?eSTBu#eTM3HFicuD>sp=rO`A>tFP~XjYalw2g&slq=`%pZ7n)?AAHc;D1%L zwojY8A|<)6!bM!1j*tFyza)M9P11-RS)hEun0kdZFlF)1pj-URg4cP9T%TyR+>d&d zCZU?HMvr1csqLTWFO*Q9Xr~GNNa4YSuZcX}L^+FdL^RHptgP_Y>qi^7gYi2Di%TRJ z^4d7IC=V7B4!?Opw||TbY8G4yXDF zatj2>Q`qw$+UwppE+mtyuxwkqt~fDS7t=g8cHxlq|<(%7Y; iKb5VNAZ&=s5gd*Rand}F%5mjL5~7bP^Ugvzy#E3h-+~wb delta 1762 zcmY*adsxzU7Y7vcg5(vvfaRK!;jQq3=5-rGGKW!G;UzcJn!`!nwHSFxd$TnCc||R6 zQ!&dSzFwAwh|9d7W>!px(`kyPRyuR&mV@Vg?CJgfbDqyR&-t9sIe&bQb=q5(v<2bnLLMufI!;v7#ckh{>7qPAgwPh2 zaW3qy+mFAJQjW6+za*n!2(efsj`+?9^XR$P);sTJ2Z`7ugy_w8XF>`lyd}`f@bW$n z#H?hR?Qm?xaoKCm%wwDwd#ILHg)ZH;#uH|7C{{O?N!gQrWBn4tYv3To7OczHI_qa- z73V<+YM;It{O0`uJKWHPZWVN^o@Wi@jJ?mF3zZf#D#an`f?t{-?5p_GJH5l`kfJ%Q zmAs{Gx0Q7#$JPDQE8lJ&X(|;vt2{5I(t1Z43?e z;#wx(31s~xNe?=|JoSF>Y@Fx?B{Xm0_Zv;Aero*Hsx9S@@5TEA?5+YyA@L5V62WlA z<;K|?1K!FYPzDOHQ8i>8Q5>tFBq(RXSu11bSpMDH8b;!HcPf~YV$O*@W9mC{!p6s- zd!l#vV%f`OeiIPXQ)^^AqAyEaDCge!v=?|wYN%UMtw`I+3Ooh8sgIM{UvF4eh2C`= z&`EdV6*YuREH`|9sz6rS$mo?mRr9i#m=Yz$`C7#w~ zfT4GLZ=-CczEtT+Y+$nz-DAh{^uRKqd@vii|ByAIBE(&dfAe8&^#k(?zrTeur@AKL z>`MBNmm}hTST>*eiK80*IF=?D8o>>jju>N3_OYUBzb@jbUFI|6b0!6)0{U5KOv%n* z!WLd_Ur)%MODz9|WGk{or>3+O%MjR=W*4|X8w{nfW%kCAtMTSH*jeFh2WkoLx0%SSsNVUp%gqZ(=rr}(zR@_k){F>5QAicNvI4ifR zpH_-uVF);K*GpH*ouiaHR&VKj$6Q08efVEfN3}(yB`E2i@|tYYQhLo-%xA9fHgskH zCNomBj^280$Ah+R4%yTyCqETeG0d}326}84^JjUt#yJTVu9gYt!lU~vm4fpr-3D;gDd*(5xSU}oae*~O!T_IPAEJxvez?c_hF1D3tc*eT#G{Dn zFu0Ei5JB=<8b2*bTOSo9y-BMc@{WS@0>jCrWdSD94mKD}fYxw-E@bu#ps$9iljpqQ zw~1#i;+bz}Px<-!i6+8@znEtFbXnow9kJ)hI(BZ+Pv9+ya2R5jnkDD9HwrEkets^n zbL^*Wd5C8I`ne{70@WtNC8Sj`Fh>Bu)mqTh=xGTF?J3w$p1+b``5JkR=YR_%L}a*q~!u z<9x8;$pDMO{So>3qB(U7>a3suYDRe4*AlJ6cG)Q0Bn2619Z1+ybpSell{tdzTyWz3 z9Oy}SMQm@bsK16*+tpZa?em}92iPa9O6Mat9bL}*XJU&lFxBJ=b-6gt|0$GVYo!um zkE4Y2yCs}zhq+G~FD-3Uzj&2h7`AQLyML_tf@4ni5TsqZc>R*aMpB(@{y8(b z?7hmzCbZ^HW^v Date: Wed, 19 Jul 2023 10:39:48 +0100 Subject: [PATCH 08/10] finished --- cli/LP Github repos.xlsx | Bin 6266 -> 14935 bytes cli/analyser.py | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cli/LP Github repos.xlsx b/cli/LP Github repos.xlsx index ecc2c38b4dea2f52ccdf786161f6b478b18ff516..c83cc0ef50f0b0c4578573d2a66602a964c6776c 100644 GIT binary patch delta 10723 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 Date: Wed, 19 Jul 2023 12:15:22 +0100 Subject: [PATCH 09/10] commit --- cli/LP Github repos.xlsx | Bin 14935 -> 14922 bytes cli/analyser.py | 3 - cli/config.py | 181 +-------------------------------------- 3 files changed, 4 insertions(+), 180 deletions(-) diff --git a/cli/LP Github repos.xlsx b/cli/LP Github repos.xlsx index c83cc0ef50f0b0c4578573d2a66602a964c6776c..1ead25f8e2ecbb4d1b606b4ed98b2f53b3fda051 100644 GIT binary patch delta 10329 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 JMUt3N{{!wX_qG54 delta 10353 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 diff --git a/cli/analyser.py b/cli/analyser.py index af159e9..a5dac4d 100644 --- a/cli/analyser.py +++ b/cli/analyser.py @@ -1,6 +1,3 @@ -import openpyxl -from openpyxl import Workbook -from openpyxl.styles import Font from config import Config as c # Check if the Excel file exists diff --git a/cli/config.py b/cli/config.py index 9185fad..85cb3d7 100644 --- a/cli/config.py +++ b/cli/config.py @@ -25,181 +25,7 @@ class Config: # repos = [ - "adapt-ami", - "adapt-builder", - "adapt-builder-importer", - "adapt-contrib-aboutUs", - "adapt-contrib-articleBlockSlider", - "adapt-contrib-assessmentSingleSubmit", - "adapt-contrib-assistedLearning", - "adapt-contrib-avatar", - "adapt-contrib-branching", - "adapt-contrib-brightcovePlayer", - "adapt-contrib-carbonMenu", - "adapt-contrib-certificate", - "adapt-contrib-chatbot", - "adapt-contrib-homeRedirect", - "adapt-contrib-cinnamonMenu", - "adapt-contrib-confidenceBasedMarking", - "adapt-contrib-confirmExit", - "adapt-contrib-coreMenu", - "adapt-contrib-courseScore", - "adapt-contrib-dyslexia-helper", - "adapt-contrib-exhibit", - "adapt-contrib-fiftyShades", - "adapt-contrib-fillInTheBlanks", - "adapt-contrib-flipcard", - "adapt-contrib-fontAwesomeIcons", - "adapt-contrib-fullScreenMenu", - "adapt-contrib-googleAnalytics", - "adapt-contrib-healthGauge", - "adapt-contrib-hiddenHotspots", - "lp-home", - "lp-home-web", - "adapt-contrib-homeRedirect", - "adapt-contrib-hotspotMenu", - "adapt-contrib-iconReplacement", - "adapt-contrib-imageGallery", - "adapt-contrib-interactiveVideo", - "adapt-contrib-introOutro", - "adapt-contrib-learningObjectives", - "adapt-contrib-magazineMenu", - "adapt-contrib-mathJax", - "adapt-contrib-mcqResults", - "adapt-contrib-mentor", - "adapt-contrib-menuItemCompletion", - "adapt-contrib-openTextInput", - "adapt-contrib-openTextSummary", - "adapt-contrib-pageFooterNavigation", - "adapt-contrib-pageHeaderNavigation", - "adapt-contrib-paginator", - "adapt-contrib-references", - "adapt-contrib-referencesList", - "adapt-contrib-responsiveEmbeddedHelper", - "adapt-contrib-responsiveIframe", - "adapt-contrib-reveal", - "adapt-contrib-salsaTheme", - "adapt-contrib-scheduleMenu", - "adapt-contrib-scriptInjector", - "adapt-contrib-scrollPrompt", - "adapt-contrib-spectrumMenu", - "adapt-contrib-stacker", - "adapt-contrib-suppressScore", - "adapt-contrib-textToSpeech", - "adapt-contrib-trueFalse", - "adapt-contrib-xapiUtils", - "adapt-contrib-yesNo", - "adapt-test-automation", - "alexa-trivia-quiz", - "analytics-comparative-frontend", - "anon-db", - "app-switcher", - "authoring-api", - "automation", - "automation-analytics", - "automation-api", - "automation-auth-cron", - "automation-cache", - "automation-cache-helper", - "automation-data-cron", - "automation-frontend", - "automation-integration-processor", - "automation-salesforce-webhook", - "automation-sendgrid-webhook", - "automation-statistics-cron", - "automation-subscriptions-api", - "automation-subscriptions-frontend", - "automation-worker", - "botkit", - "ci-aws-iam-roles", - "ci-ecr-poc", - "ci-iam-poc", - "CI-PoC-Jira-Environments", - "ci-release-checks", - "ci-workflow-test", - "ci-workflows", - "cicd-poc-redshift", - "codeCoverage", - "conversAI", - "converse", - "curatr", - "curatr-bot", - "curatr-example-confs", - "curatr-rasa", - "curatr-sid", - "CuratrApp", - "data-engineering-devops", - "design-assets-cdn", - "design-system", - "design-tokens", - "development-tooling", - "docker-ui", - "docs", - "dolphin-test", - "ecosystem", - "EMR-ETL-Cron", - "execute-on-all-mongo-instances", - "gdpr", - "gitdash", - "HSTiles", - "HT2-Labs-Website", - "HT2_ML_Prototypes_Notebooks", - "insights", - "Internal-dw-Salesforce", - "interview-scores", - "interview-test", - "ioc-css-qatests", - "iq", - "iq-clouds-code", - "iq-dev-api", - "iq-ops", - "iq-performance-report", - "iq-reporting", - "iq-tools", - "iq-ui-pro-dev", - "jscommons", - "kyle-sam-integration", - "l5-core", - "laravel-cascade-soft-deletes", - "launchr", - "learnio", - "learnio-application", - "learnio-automation", - "learnio-backend-batch-job", - "learnio-ddt-dev", - "learnio-legacy", - "learnio-ops", - "learnio-pactools-dev", - "learnio-sftp-scripts", - "learnio-smoke-test", - "learnio-sso", - "learnio-titan-dev", - "ll-coding-kata", - "ll-connectors", - "ll-enterprise", - "ll-test-automation", - "ll-v1-to-v2-migrator", - "LL_Verb_Count_Converter", - "lp-home", - "lp-home-web", - "lpqa-slackbot", - "message-processor", - "MongoSingleTenant", - "monorepo-template", - "morau", - "mural", - "MYSQLSource", - "nightlies", - "NLP-data-parser", - "node-tnef", - "nyse-clb-logs", - "nyse-clb-logs", - "nyse-client-central", - "nyse-course-catalog", - "nyse-data-reporting", - "nyse-email-delivery-kit", - "nyse-email-delivery-kit-realbiz", - "nyse-learn-io-pulse", + "nyse-learn-io-site", "nyse-moodle", "nyse-pulse-check-leaderboard", @@ -378,7 +204,7 @@ def get_gha_integration(repo_name): ymlFiles = glob.glob('.github/workflows/*.yml') yamlFiles = glob.glob('.github/workflows/*.yaml') allFiles = ymlFiles + yamlFiles - keywords = ["integration suite", "integration"] + keywords = ["Integration", "integration", "Node CI", "Test, Build and Release Workflow"] for file in allFiles: with open(file, 'r') as f: if any(keyword in line for line in f for keyword in keywords): @@ -432,7 +258,8 @@ def get_dependency_management(repo_name): return "Dependabot" elif "renovate" in output: return "Renovate" - return "No" + else: + return "No" except: print(f'Failed to check for Dependency Management for {repo_name}.') print('Exiting program.') From 732d1e775ef296e95d58d54641d5efb6967b1c1f Mon Sep 17 00:00:00 2001 From: Shamy Date: Wed, 19 Jul 2023 12:19:46 +0100 Subject: [PATCH 10/10] commit --- cli/config.py | 176 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 1 deletion(-) diff --git a/cli/config.py b/cli/config.py index 85cb3d7..93850a3 100644 --- a/cli/config.py +++ b/cli/config.py @@ -25,7 +25,181 @@ class Config: # repos = [ - + "adapt-ami", + "adapt-builder", + "adapt-builder-importer", + "adapt-contrib-aboutUs", + "adapt-contrib-articleBlockSlider", + "adapt-contrib-assessmentSingleSubmit", + "adapt-contrib-assistedLearning", + "adapt-contrib-avatar", + "adapt-contrib-branching", + "adapt-contrib-brightcovePlayer", + "adapt-contrib-carbonMenu", + "adapt-contrib-certificate", + "adapt-contrib-chatbot", + "adapt-contrib-homeRedirect", + "adapt-contrib-cinnamonMenu", + "adapt-contrib-confidenceBasedMarking", + "adapt-contrib-confirmExit", + "adapt-contrib-coreMenu", + "adapt-contrib-courseScore", + "adapt-contrib-dyslexia-helper", + "adapt-contrib-exhibit", + "adapt-contrib-fiftyShades", + "adapt-contrib-fillInTheBlanks", + "adapt-contrib-flipcard", + "adapt-contrib-fontAwesomeIcons", + "adapt-contrib-fullScreenMenu", + "adapt-contrib-googleAnalytics", + "adapt-contrib-healthGauge", + "adapt-contrib-hiddenHotspots", + "lp-home", + "lp-home-web", + "adapt-contrib-homeRedirect", + "adapt-contrib-hotspotMenu", + "adapt-contrib-iconReplacement", + "adapt-contrib-imageGallery", + "adapt-contrib-interactiveVideo", + "adapt-contrib-introOutro", + "adapt-contrib-learningObjectives", + "adapt-contrib-magazineMenu", + "adapt-contrib-mathJax", + "adapt-contrib-mcqResults", + "adapt-contrib-mentor", + "adapt-contrib-menuItemCompletion", + "adapt-contrib-openTextInput", + "adapt-contrib-openTextSummary", + "adapt-contrib-pageFooterNavigation", + "adapt-contrib-pageHeaderNavigation", + "adapt-contrib-paginator", + "adapt-contrib-references", + "adapt-contrib-referencesList", + "adapt-contrib-responsiveEmbeddedHelper", + "adapt-contrib-responsiveIframe", + "adapt-contrib-reveal", + "adapt-contrib-salsaTheme", + "adapt-contrib-scheduleMenu", + "adapt-contrib-scriptInjector", + "adapt-contrib-scrollPrompt", + "adapt-contrib-spectrumMenu", + "adapt-contrib-stacker", + "adapt-contrib-suppressScore", + "adapt-contrib-textToSpeech", + "adapt-contrib-trueFalse", + "adapt-contrib-xapiUtils", + "adapt-contrib-yesNo", + "adapt-test-automation", + "alexa-trivia-quiz", + "analytics-comparative-frontend", + "anon-db", + "app-switcher", + "authoring-api", + "automation", + "automation-analytics", + "automation-api", + "automation-auth-cron", + "automation-cache", + "automation-cache-helper", + "automation-data-cron", + "automation-frontend", + "automation-integration-processor", + "automation-salesforce-webhook", + "automation-sendgrid-webhook", + "automation-statistics-cron", + "automation-subscriptions-api", + "automation-subscriptions-frontend", + "automation-worker", + "botkit", + "ci-aws-iam-roles", + "ci-ecr-poc", + "ci-iam-poc", + "CI-PoC-Jira-Environments", + "ci-release-checks", + "ci-workflow-test", + "ci-workflows", + "cicd-poc-redshift", + "codeCoverage", + "conversAI", + "converse", + "curatr", + "curatr-bot", + "curatr-example-confs", + "curatr-rasa", + "curatr-sid", + "CuratrApp", + "data-engineering-devops", + "design-assets-cdn", + "design-system", + "design-tokens", + "development-tooling", + "docker-ui", + "docs", + "dolphin-test", + "ecosystem", + "EMR-ETL-Cron", + "execute-on-all-mongo-instances", + "gdpr", + "gitdash", + "HSTiles", + "HT2-Labs-Website", + "HT2_ML_Prototypes_Notebooks", + "insights", + "Internal-dw-Salesforce", + "interview-scores", + "interview-test", + "ioc-css-qatests", + "iq", + "iq-clouds-code", + "iq-dev-api", + "iq-ops", + "iq-performance-report", + "iq-reporting", + "iq-tools", + "iq-ui-pro-dev", + "jscommons", + "kyle-sam-integration", + "l5-core", + "laravel-cascade-soft-deletes", + "launchr", + "learnio", + "learnio-application", + "learnio-automation", + "learnio-backend-batch-job", + "learnio-ddt-dev", + "learnio-legacy", + "learnio-ops", + "learnio-pactools-dev", + "learnio-sftp-scripts", + "learnio-smoke-test", + "learnio-sso", + "learnio-titan-dev", + "ll-coding-kata", + "ll-connectors", + "ll-enterprise", + "ll-test-automation", + "ll-v1-to-v2-migrator", + "LL_Verb_Count_Converter", + "lp-home", + "lp-home-web", + "lpqa-slackbot", + "message-processor", + "MongoSingleTenant", + "monorepo-template", + "morau", + "mural", + "MYSQLSource", + "nightlies", + "NLP-data-parser", + "node-tnef", + "nyse-clb-logs", + "nyse-clb-logs", + "nyse-client-central", + "nyse-course-catalog", + "nyse-data-reporting", + "nyse-email-delivery-kit", + "nyse-email-delivery-kit-realbiz", + "nyse-learn-io-pulse", "nyse-learn-io-site", "nyse-moodle", "nyse-pulse-check-leaderboard",