#!/usr/bin/env python3 import logging import re import requests import sys GIT_URLS_OPTION = '--git-urls' GITGUD_COMPLETE_ITEMS_OPTION = '--gitgud-complete-items' MODES = (GIT_URLS_OPTION, GITGUD_COMPLETE_ITEMS_OPTION) mode = None users = sys.argv[1:] if users and users[0] in MODES: mode = users[0] users = users[1:] assert users and (mode is None or mode in MODES) and not users[0].startswith('--'), f'Usage: github-list-repos [{" | ".join(MODES)}] USER [USER...]' def get(url): while True: logging.info(f'Fetching {url}') r = requests.get(url, headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0'}) if r.status_code == 429: logging.warning(f'Got 429, sleeping and retrying') time.sleep(5) else: break return r def p(repoName): if mode is None: print(f'https://github.com/{repoName}') elif mode == GIT_URLS_OPTION: print(f'https://github.com/{repoName}.git') print(f'https://github.com/{repoName}.wiki.git') elif mode == GITGUD_COMPLETE_ITEMS_OPTION: print(f'web:complete:{repoName}') for user in users: r = get(f'https://github.com/{user}') if '
]*\s)?data-hovercard-url="/([^/>"]+/[^/>"]+)/hovercard"', r.text): p(m.group(1)) if '"]+)" itemprop="name codeRepository"(\s[^>]*)?>', r.text): p(m.group(1)) if not (m := re.search(r']*\s)?href="https://github\.com/[^/?"]+\?after=([^&]+)&tab=repositories"(?:\s[^>]*)?>', r.text)): # End of pagination break r = get(f'https://github.com/{user}?after={m.group(1)}&tab=repositories')