Abstract common functions into a library
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								bin/__pycache__/abralib.cpython-39.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/__pycache__/abralib.cpython-39.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										103
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| """Shared utilities for bin/*.py scripts.""" | ||||
|  | ||||
| from logging import DEBUG, basicConfig, getLogger | ||||
| from os import chdir, mkdir | ||||
| from os.path import exists, expanduser | ||||
| from pathlib import Path | ||||
| from shlex import split | ||||
| from subprocess import check_output | ||||
| from sys import exit | ||||
|  | ||||
| from requests import get | ||||
|  | ||||
| HOME_PATH = expanduser("~/") | ||||
| CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute() | ||||
| REPOS_TO_SKIP = ( | ||||
|     "abra", | ||||
|     "abra-apps", | ||||
|     "abra-gandi", | ||||
|     "abra-hetzner", | ||||
|     "backup-bot", | ||||
|     "coopcloud.tech", | ||||
|     "coturn", | ||||
|     "docker-cp-deploy", | ||||
|     "docker-dind-bats-kcov", | ||||
|     "docs.coopcloud.tech", | ||||
|     "example", | ||||
|     "gardening", | ||||
|     "organising", | ||||
|     "pyabra", | ||||
|     "radicle-seed-node", | ||||
|     "stack-ssh-deploy", | ||||
|     "swarm-cronjob", | ||||
| ) | ||||
| YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq") | ||||
| SCRIPT_PATH = Path(__file__).absolute().parent | ||||
|  | ||||
| log = getLogger(__name__) | ||||
| basicConfig() | ||||
| log.setLevel(DEBUG) | ||||
|  | ||||
|  | ||||
| def _run_cmd(cmd, shell=False, **kwargs): | ||||
|     """Run a shell command.""" | ||||
|     args = [split(cmd)] | ||||
|  | ||||
|     if shell: | ||||
|         args = [cmd] | ||||
|         kwargs = {"shell": shell} | ||||
|  | ||||
|     try: | ||||
|         return check_output(*args, **kwargs).decode("utf-8").strip() | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to run {cmd}, saw {str(exception)}") | ||||
|         exit(1) | ||||
|  | ||||
|  | ||||
| def get_repos_json(): | ||||
|     """ Retrieve repo list from Gitea """ | ||||
|  | ||||
|     url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos" | ||||
|  | ||||
|     log.info(f"Retrieving {url}") | ||||
|  | ||||
|     repos = [] | ||||
|     response = True | ||||
|     page = 1 | ||||
|  | ||||
|     try: | ||||
|         while response: | ||||
|             log.info(f"Trying to fetch page {page}") | ||||
|             response = get(url + f"?page={page}", timeout=10).json() | ||||
|             repos.extend(response) | ||||
|             page += 1 | ||||
|  | ||||
|         return repos | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to retrieve {url}, saw {str(exception)}") | ||||
|         exit(1) | ||||
|  | ||||
|  | ||||
| def clone_all_apps(repos_json): | ||||
|     """Clone all Co-op Cloud apps to ~/.abra/apps.""" | ||||
|     if not exists(CLONES_PATH): | ||||
|         mkdir(CLONES_PATH) | ||||
|  | ||||
|     repos = [[p["name"], p["ssh_url"]] for p in repos_json] | ||||
|  | ||||
|     for name, url in repos: | ||||
|         if name in REPOS_TO_SKIP: | ||||
|             continue | ||||
|  | ||||
|         if not exists(f"{CLONES_PATH}/{name}"): | ||||
|             log.info(f"Retrieving {url}") | ||||
|             _run_cmd(f"git clone {url} {CLONES_PATH}/{name}") | ||||
|  | ||||
|             chdir(f"{CLONES_PATH}/{name}") | ||||
|             if not int(_run_cmd("git branch --list | wc -l", shell=True)): | ||||
|                 log.info(f"Guessing main branch is HEAD for {name}") | ||||
|                 _run_cmd("git checkout main") | ||||
|         else: | ||||
|             log.info(f"Updating {name}") | ||||
|             chdir(f"{CLONES_PATH}/{name}") | ||||
|             _run_cmd("git fetch -a") | ||||
							
								
								
									
										109
									
								
								bin/app-json.py
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								bin/app-json.py
									
									
									
									
									
								
							| @ -7,84 +7,24 @@ | ||||
| # https://apps.coopcloud.tech | ||||
|  | ||||
| from json import dump | ||||
| from logging import DEBUG, basicConfig, getLogger | ||||
| from os import chdir, listdir, mkdir | ||||
| from os.path import basename, exists, expanduser | ||||
| from pathlib import Path | ||||
| from os import chdir, listdir | ||||
| from os.path import basename | ||||
| from re import findall, search | ||||
| from shlex import split | ||||
| from subprocess import DEVNULL, check_output | ||||
| from sys import exit | ||||
| from subprocess import DEVNULL | ||||
|  | ||||
| from requests import get | ||||
|  | ||||
| HOME_PATH = expanduser("~/") | ||||
| CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute() | ||||
| YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq") | ||||
| SCRIPT_PATH = Path(__file__).absolute().parent | ||||
| REPOS_TO_SKIP = ( | ||||
|     "abra", | ||||
|     "abra-apps", | ||||
|     "abra-gandi", | ||||
|     "abra-hetzner", | ||||
|     "backup-bot", | ||||
|     "coopcloud.tech", | ||||
|     "coturn", | ||||
|     "docker-cp-deploy", | ||||
|     "docker-dind-bats-kcov", | ||||
|     "docs.coopcloud.tech", | ||||
|     "example", | ||||
|     "gardening", | ||||
|     "organising", | ||||
|     "pyabra", | ||||
|     "radicle-seed-node", | ||||
|     "stack-ssh-deploy", | ||||
|     "swarm-cronjob", | ||||
| from abralib import ( | ||||
|     CLONES_PATH, | ||||
|     REPOS_TO_SKIP, | ||||
|     SCRIPT_PATH, | ||||
|     YQ_PATH, | ||||
|     _run_cmd, | ||||
|     clone_all_apps, | ||||
|     get_repos_json, | ||||
|     log, | ||||
| ) | ||||
|  | ||||
| log = getLogger(__name__) | ||||
| basicConfig() | ||||
| log.setLevel(DEBUG) | ||||
|  | ||||
|  | ||||
| def _run_cmd(cmd, shell=False, **kwargs): | ||||
|     """Run a shell command.""" | ||||
|     args = [split(cmd)] | ||||
|  | ||||
|     if shell: | ||||
|         args = [cmd] | ||||
|         kwargs = {"shell": shell} | ||||
|  | ||||
|     try: | ||||
|         return check_output(*args, **kwargs).decode("utf-8").strip() | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to run {cmd}, saw {str(exception)}") | ||||
|         exit(1) | ||||
|  | ||||
|  | ||||
| def get_repos_json(): | ||||
|     """ Retrieve repo list from Gitea """ | ||||
|  | ||||
|     url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos" | ||||
|  | ||||
|     log.info(f"Retrieving {url}") | ||||
|  | ||||
|     repos = [] | ||||
|     response = True | ||||
|     page = 1 | ||||
|  | ||||
|     try: | ||||
|         while response: | ||||
|             log.info(f"Trying to fetch page {page}") | ||||
|             response = get(url + f"?page={page}", timeout=10).json() | ||||
|             repos.extend(response) | ||||
|             page += 1 | ||||
|  | ||||
|         return repos | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to retrieve {url}, saw {str(exception)}") | ||||
|         exit(1) | ||||
|  | ||||
|  | ||||
| def get_published_apps_json(): | ||||
|     """Retrieve already published apps json.""" | ||||
| @ -99,31 +39,6 @@ def get_published_apps_json(): | ||||
|         return {} | ||||
|  | ||||
|  | ||||
| def clone_all_apps(repos_json): | ||||
|     """Clone all Co-op Cloud apps to ~/.abra/apps.""" | ||||
|     if not exists(CLONES_PATH): | ||||
|         mkdir(CLONES_PATH) | ||||
|  | ||||
|     repos = [[p["name"], p["ssh_url"]] for p in repos_json] | ||||
|  | ||||
|     for name, url in repos: | ||||
|         if name in REPOS_TO_SKIP: | ||||
|             continue | ||||
|  | ||||
|         if not exists(f"{CLONES_PATH}/{name}"): | ||||
|             log.info(f"Retrieving {url}") | ||||
|             _run_cmd(f"git clone {url} {CLONES_PATH}/{name}") | ||||
|  | ||||
|             chdir(f"{CLONES_PATH}/{name}") | ||||
|             if not int(_run_cmd("git branch --list | wc -l", shell=True)): | ||||
|                 log.info(f"Guessing main branch is HEAD for {name}") | ||||
|                 _run_cmd("git checkout main") | ||||
|         else: | ||||
|             log.info(f"Updating {name}") | ||||
|             chdir(f"{CLONES_PATH}/{name}") | ||||
|             _run_cmd("git fetch -a") | ||||
|  | ||||
|  | ||||
| def generate_apps_json(repos_json): | ||||
|     """Generate the abra-apps.json application versions file.""" | ||||
|     apps_json = {} | ||||
|  | ||||
							
								
								
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,16 @@ | ||||
| #!/usr/bin/env python3 | ||||
|  | ||||
| # Usage: ./clone-all-apps.py | ||||
| # | ||||
| # Clone all available apps into ~/.abra/apps using ssh:// URLs | ||||
|  | ||||
| from abralib import clone_all_apps, get_repos_json | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     """Run the script.""" | ||||
|     repos_json = get_repos_json() | ||||
|     clone_all_apps(repos_json) | ||||
|  | ||||
|  | ||||
| main() | ||||
| @ -4,77 +4,7 @@ | ||||
| # | ||||
| # Output list of apps for Renovate bot configuration | ||||
|  | ||||
| from logging import DEBUG, basicConfig, getLogger | ||||
| from os.path import expanduser | ||||
| from pathlib import Path | ||||
| from shlex import split | ||||
| from subprocess import check_output | ||||
| from sys import exit | ||||
|  | ||||
| from requests import get | ||||
|  | ||||
| HOME_PATH = expanduser("~/") | ||||
| CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute() | ||||
| YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq") | ||||
| SCRIPT_PATH = Path(__file__).absolute().parent | ||||
| REPOS_TO_SKIP = ( | ||||
|     "abra", | ||||
|     "abra-apps", | ||||
|     "abra-gandi", | ||||
|     "abra-hetzner", | ||||
|     "backup-bot", | ||||
|     "coopcloud.tech", | ||||
|     "coturn", | ||||
|     "docker-cp-deploy", | ||||
|     "docker-dind-bats-kcov", | ||||
|     "docs.coopcloud.tech", | ||||
|     "example", | ||||
|     "gardening", | ||||
|     "organising", | ||||
|     "pyabra", | ||||
|     "radicle-seed-node", | ||||
|     "stack-ssh-deploy", | ||||
|     "swarm-cronjob", | ||||
| ) | ||||
|  | ||||
| log = getLogger(__name__) | ||||
| basicConfig() | ||||
| log.setLevel(DEBUG) | ||||
|  | ||||
|  | ||||
| def _run_cmd(cmd, shell=False, **kwargs): | ||||
|     """Run a shell command.""" | ||||
|     args = [split(cmd)] | ||||
|  | ||||
|     if shell: | ||||
|         args = [cmd] | ||||
|         kwargs = {"shell": shell} | ||||
|  | ||||
|     try: | ||||
|         return check_output(*args, **kwargs).decode("utf-8").strip() | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to run {cmd}, saw {str(exception)}") | ||||
|         exit(1) | ||||
|  | ||||
|  | ||||
| def get_repos_json(): | ||||
|     """ Retrieve repo list from Gitea """ | ||||
|     url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos" | ||||
|  | ||||
|     repos = [] | ||||
|     response = True | ||||
|     page = 1 | ||||
|  | ||||
|     try: | ||||
|         while response: | ||||
|             response = get(url + f"?page={page}", timeout=10).json() | ||||
|             repos.extend(response) | ||||
|             page += 1 | ||||
|  | ||||
|         return repos | ||||
|     except Exception as exception: | ||||
|         log.error(f"Failed to retrieve {url}, saw {str(exception)}") | ||||
|         exit(1) | ||||
| from abralib import REPOS_TO_SKIP, get_repos_json | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|  | ||||
		Reference in New Issue
	
	Block a user