Skip to content

Instantly share code, notes, and snippets.

@monperrus
Created March 16, 2025 10:07
Show Gist options
  • Select an option

  • Save monperrus/3afdae159d1eb0e677b35bac28cdc3a0 to your computer and use it in GitHub Desktop.

Select an option

Save monperrus/3afdae159d1eb0e677b35bac28cdc3a0 to your computer and use it in GitHub Desktop.
python script to list github repos of a user ordered by last update
#!/usr/bin/python3
import requests
import datetime
import argparse
from typing import List, Dict, Any
def get_user_repos(username: str) -> List[Dict]:
"""
Fetch all repositories for a given GitHub username.
Args:
username: GitHub username
Returns:
List of repository dictionaries
"""
all_repos = []
page = 1
while True:
url = f"https://api.github.com/users/{username}/repos"
params = {
"per_page": 100, # Maximum allowed by GitHub API
"page": page,
"sort": "updated",
"direction": "desc"
}
response = requests.get(url, params=params)
if response.status_code != 200:
print(f"Error: Unable to fetch repositories. Status code: {response.status_code}")
print(f"Response: {response.text}")
return []
repos = response.json()
if not repos:
break
all_repos.extend(repos)
page += 1
# Check if we've reached the last page
if len(repos) < 100:
break
return all_repos
def format_datetime(datetime_str: str) -> str:
"""Format GitHub datetime string to a more readable format."""
dt = datetime.datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%SZ")
return dt.strftime("%Y-%m-%d %H:%M:%S")
def main():
parser = argparse.ArgumentParser(description="List GitHub repositories of a user ordered by last update")
parser.add_argument("username", help="GitHub username")
args = parser.parse_args()
print(f"Fetching repositories for GitHub user: {args.username}")
repos = get_user_repos(args.username)
if not repos:
print("No repositories found or error occurred.")
return
print(f"\nFound {len(repos)} repositories for {args.username}:\n")
print(f"{'Repository Name':<40} {'Last Updated':<20} {'Language':<15} {'Stars':<7} {'Forks':<7} {'URL'}")
print("-" * 100)
for repo in repos:
name = repo["name"]
updated_at = format_datetime(repo["updated_at"])
language = repo["language"] or "N/A"
stars = repo["stargazers_count"]
forks = repo["forks_count"]
url = repo["html_url"]
print(f"{name:<40} {updated_at:<20} {language:<15} {stars:<7} {forks:<7} {url}")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment