# CODEOWNERS Report This report was run on May 1, 2023. Below the table is the Python script used to run the report. | Repo | Code Owners | |------|-------------| | argp-standalone | | | bc-bech32 | ChristopherA | | bc-bip39 | ChristopherA, wolfmcnally | | bc-bytewords | ChristopherA | | bc-crypto-base | ChristopherA, wolfmcnally | | bc-dcbor-rust | ChristopherA, WolfMcNally | | bc-envelope-python | ChristopherA | | bc-envelope-rust | ChristopherA, WolfMcNally | | bc-libs-java | ChristopherA, jollyjoker992 | | bc-libwally-core | | | bc-libwally-java | ChristopherA, jollyjoker992 | | bc-libwally-swift | ChristopherA | | bc-lifehash | | | bc-lifehash-python | | | bc-shamir | ChristopherA, wolfmcnally | | bc-skeleton-cli | ChristopherA, wolfmcnally | | bc-slip39 | ChristopherA, wolfmcnally | | bc-sskr | ChristopherA, wolfmcnally | | bc-tor | | | bc-ur | ChristopherA, wolfmcnally | | bc-ur-java | ChristopherA, jollyjoker992 | | bc-xz | | | BCLibsSwift | | | BCLibwallySwift | | | BCSwiftApp | ChristopherA | | BCSwiftCrypto | ChristopherA | | BCSwiftDCBOR | ChristopherA | | BCSwiftEnvelope | ChristopherA | | BCSwiftEsplora | | | BCSwiftExampleSigner | | | BCSwiftFloat16 | ChristopherA | | BCSwiftFoundation | | | BCSwiftNFC | | | BCSwiftSecureComponents | | | BCSwiftSpotBit | | | BCSwiftTor | | | BCSwiftTorBase | | | BCSwiftWally | | | Bitcoin-Camouflage | ChristopherA | | Bitcoin-Standup-Scripts | ChristopherA | | blake3-swift | | | BlockchainCommonsLLC | | | bytewords-cli | ChristopherA, wolfmcnally | | cbor-lite | | | Community | | | crypto-commons | ChristopherA | | dcbor-cli | ChristopherA, WolfMcNally | | debian-ppa | ChristopherA | | deployment-scripts | ChristopherA | | did-method-onion | OR13, ChristopherA | | did-resolution-wg-charter | | | did-spec-registries | msporny, OR13 | | electrs | | | envelope-cli-swift | | | esplora | | | Gordian | ChristopherA | | Gordian-Developer-Community | ChristopherA | | GordianCosigner-iOS | ChristopherA | | GordianQRTool-iOS | ChristopherA | | GordianSeedTool-iOS | ChristopherA, wolfmcnally | | GordianServer-macOS | ChristopherA | | GordianSigner-Android | ChristopherA, cuongleqq | | GordianSigner-macOS | ChristopherA | | GordianWallet-iOS | ChristopherA | | GxEPD2 | | | Hyperconnectivity | | | iOS-Bitcoin | | | iOS-CBitcoin | | | iOS-GordianCoordinator | ChristopherA, wolfmcnally | | iOS-TorFramework | | | keytool-cli | ChristopherA, wolfmcnally | | law-and-advocacy | ChristopherA | | Learning-Bitcoin-from-the-Command-Line | | | lethekit | ChristopherA | | libbitcoinrpc | | | LifeHash | | | lifehash-cli | | | lifehash.info | | | LifeHashTool | ChristopherA, wolfmcnally | | mori-cli | ChristopherA | | musign-cli | ChristopherA | | Open-Development | | | Presentations-Template | | | Pseudonymity-Guide | | | QRCodeGenerator | ChristopherA, WolfMcNally | | QRCodeGeneratorDemo | ChristopherA, WolfMcNally | | Research | ChristopherA | | secp256k1-embedded | | | secp256k1-zkp.swift | | | Secure-Development-Setup-macOS | ChristopherA, Namcios | | secure-template | ChristopherA | | seedtool-cli | ChristopherA, wolfmcnally | | seedtool.info | Sjlver | | siliconsalon.info | | | SmartCustody | ChristopherA | | SmartCustodyBook | ChristopherA | | SmartCustodyWhitePapers | ChristopherA | | so-simple-theme | | | spotbit | ChristopherA | | sss | | | sweeptool-cli | ChristopherA | | Testimony | ChristopherA | | torgap | ChristopherA | | torgap-demo | ChristopherA | | torgap-opentimestamps | ChristopherA | | torgap-sig | ChristopherA | | torgap-sig-cli-rust | ChristopherA | | UniversalResources.info | ChristopherA | | URDemo | | | URKit | | | URUI | | | wips | ChristopherA | | WIPs-IETF-draft-deterministic-cbor | | | WIPs-IETF-draft-envelope | | | www.blockchaincommons.com | | | www.SmartCustody.com | | ### Script to Run Report ```python import requests import re GITHUB_API_BASE_URL = 'https://api.github.com' GITHUB_PAT = 'Put Your GitHub Personal Access Token Here' def get_user_repos(username): all_repos = [] page = 1 per_page = 100 headers = {'Authorization': f'token {GITHUB_PAT}'} while True: url = f'{GITHUB_API_BASE_URL}/users/{username}/repos?page={page}&per_page={per_page}' response = requests.get(url, headers=headers) if response.status_code == 200: repos = response.json() if not repos: # Empty response, no more repos to fetch break all_repos.extend(repos) page += 1 else: print(f'Error {response.status_code}: Could not fetch repos') break return all_repos def get_codeowners_file_contents(owner, repo_name): url = f'{GITHUB_API_BASE_URL}/repos/{owner}/{repo_name}/contents/CODEOWNERS' headers = {'Authorization': f'token {GITHUB_PAT}'} response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: return None def extract_usernames(codeowners_content): pattern = r'@(\w+)' usernames = re.findall(pattern, codeowners_content) return usernames def main(): account = input('Enter the GitHub account username: ') print("\n| Repo | Code Owners |") print("|------|-------------|") for repo in get_user_repos(account): if repo["name"] == '.github': continue codeowners = get_codeowners_file_contents(account, repo['name']) if codeowners: content = requests.get(codeowners['download_url']).text usernames = extract_usernames(content) print(f'| {repo["name"]} | {", ".join(usernames)} |') else: print(f'| {repo["name"]} | |') if __name__ == '__main__': main() ```