Skip to content

Instantly share code, notes, and snippets.

@gyurisc
Created June 29, 2024 05:06
Show Gist options
  • Select an option

  • Save gyurisc/fd7eec10add26b0182d019a6f32b0965 to your computer and use it in GitHub Desktop.

Select an option

Save gyurisc/fd7eec10add26b0182d019a6f32b0965 to your computer and use it in GitHub Desktop.

Revisions

  1. gyurisc created this gist Jun 29, 2024.
    56 changes: 56 additions & 0 deletions git_stats.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,56 @@
    import os
    import requests
    from datetime import datetime
    from dotenv import load_dotenv

    # Load environment variables from .env file
    load_dotenv()

    # Get GitHub API token from environment variable
    github_token = os.getenv('GITHUB_TOKEN')

    def get_repo_stats(repo_url):
    # Extract owner and repo name from the URL
    _, _, _, owner, repo = repo_url.rstrip('/').split('/')

    # Set up the API request
    api_url = f"https://api.github.com/repos/{owner}/{repo}"
    headers = {
    'Authorization': f'token {github_token}',
    'Accept': 'application/vnd.github.v3+json'
    }

    # Make the API request
    response = requests.get(api_url, headers=headers)

    if response.status_code != 200:
    return f"Error: Unable to fetch repository data. Status code: {response.status_code}"

    data = response.json()

    # Calculate statistics
    created_at = datetime.strptime(data['created_at'], '%Y-%m-%dT%H:%M:%SZ')
    age_days = (datetime.now() - created_at).days
    total_commits = data['size'] # Note: This is an approximation
    avg_daily_commits = total_commits / age_days if age_days > 0 else 0
    stars = data['stargazers_count']

    # Fetch commit data for the last 30 days
    commits_url = f"{api_url}/commits"
    params = {'since': (datetime.now() - timedelta(days=30)).isoformat()}
    commits_response = requests.get(commits_url, headers=headers, params=params)
    recent_commits = len(commits_response.json()) if commits_response.status_code == 200 else 0
    commit_velocity = recent_commits / 30

    return {
    'age_days': age_days,
    'total_commits': total_commits,
    'avg_daily_commits': round(avg_daily_commits, 2),
    'stars': stars,
    'commit_velocity': round(commit_velocity, 2)
    }

    # Example usage
    repo_url = input("Enter the GitHub repository URL: ")
    stats = get_repo_stats(repo_url)
    print(stats)