|
- #!/usr/bin/env python3
- import logging
- import re
- import requests
- import sys
- import time
-
-
- 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 '<div id="org-repositories"' in r.text:
- # Organisation, complete list under /orgs/ with ?page=2 pagination
- r = get(f'https://github.com/orgs/{user}/repositories')
- page = 1
- while True:
- for m in re.finditer(r'<a itemprop="name codeRepository"\s(?:[^>]*\s)?data-hovercard-url="/([^/>"]+/[^/>"]+)/hovercard"', r.text):
- p(m.group(1))
- if '<a class="next_page"' not in r.text:
- # End of pagination
- break
- page += 1
- r = get(f'https://github.com/orgs/{user}/repositories?page={page}')
- else:
- # User, ?tab=repositories + cursor pagination
- r = get(f'https://github.com/{user}?tab=repositories')
- while True:
- for m in re.finditer(r'<a href="/([^/>"]+/[^/>"]+)" itemprop="name codeRepository"(\s[^>]*)?>', r.text):
- p(m.group(1))
- if not (m := re.search(r'<a\s(?=(?:[^>]*\s)?class="next_page"(?:\s[^>]*)?>)(?:[^>]*\s)?href="/[^/?"]+\?page=([^&]+)&tab=repositories"(?:\s[^>]*)?>', r.text)):
- # End of pagination
- break
- r = get(f'https://github.com/{user}?page={m.group(1)}&tab=repositories')
|