Created
March 16, 2025 10:07
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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