# 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()
```