Browse Source

Add optional username and fullname extraction

master
JustAnotherArchivist 1 year ago
parent
commit
ea27e35b90
1 changed files with 27 additions and 1 deletions
  1. +27
    -1
      github-list-repos

+ 27
- 1
github-list-repos View File

@@ -1,7 +1,9 @@
#!/usr/bin/env python3
import html
import logging
import re
import requests
import shlex
import sys
import time

@@ -12,11 +14,15 @@ MODES = (GIT_URLS_OPTION, GITGUD_COMPLETE_ITEMS_OPTION)


mode = None
name = False
users = sys.argv[1:]
if users and users[0] == '--name':
name = True
users = users[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...]'
assert users and (mode is None or mode in MODES) and not users[0].startswith('--'), f'Usage: github-list-repos [--name] [{" | ".join(MODES)}] USER [USER...]'


def get(url):
@@ -45,6 +51,16 @@ 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
if name:
musername = re.search(r'<meta property="profile:username" content="([^"]*)" />', r.text)
if not musername:
print('Error: could not find profile:username meta tag', file = sys.stderr)
sys.exit(1)
mfullname = re.search(r'<h1\s(?:[^>]*\s)?class="(?:[^"]*\s)?h2(?:\s[^"]*)?"(?:\s[^>]*)?>(.*?)</h1>', r.text, flags = re.DOTALL)
if not mfullname:
print('Error: could not find name h1', file = sys.stderr)
sys.exit(1)
print(f'{shlex.quote(html.unescape(musername.group(1).strip()))} {shlex.quote(html.unescape(mfullname.group(1).strip()))}')
r = get(f'https://github.com/orgs/{user}/repositories')
page = 1
while True:
@@ -57,6 +73,16 @@ for user in users:
r = get(f'https://github.com/orgs/{user}/repositories?page={page}')
else:
# User, ?tab=repositories + cursor pagination
if name:
musername = re.search(r'<span\s(?:[^>]*\s)?class="(?:[^"]*\s)?vcard-username(?:\s[^"]*)?"(?:\s[^>]*)?>(.*?)</span>', r.text, flags = re.DOTALL)
if not musername:
print('Error: could not find vcard-username span', file = sys.stderr)
sys.exit(1)
if (m := re.search(r'<span\s(?:[^>]*\s)?class="(?:[^"]*\s)?vcard-fullname(?:\s[^"]*)?"(?:\s[^>]*)?>(.*?)</span>', r.text, flags = re.DOTALL)):
fullname = html.unescape(m.group(1).strip())
else:
fullname = ''
print(f'{shlex.quote(html.unescape(musername.group(1).strip()))} {shlex.quote(fullname)}')
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):


Loading…
Cancel
Save