Skip to main content

Mine and extract complete package lists from Go modules registry

Project description

Go Package Miner

This tool downloads and processes the Go module index to extract Go package information for cross-ecosystem analysis.

Features

  • Downloads module list from the official Go module index (index.golang.org)
  • Extracts package metadata (ID, name, homepage, repository)
  • Retrieves repository URLs from Go proxy API Origin field (no inference)
  • Formats data for cross-ecosystem package analysis
  • Advanced progress tracking with detailed statistics
  • Checkpoint system - Resume interrupted downloads automatically
  • Optimized connection pooling for faster downloads
  • Automatic retry mechanism for failed requests
  • Customizable output directory and filename via command-line arguments
  • Generates standardized CSV output compatible with Package-Filter
  • No API rate limits (uses official public index)

Setup

Run the setup script

chmod +x setup.sh
./setup.sh

This will:

  • Create a virtual environment
  • Install required dependencies (requests, tqdm)
  • Prepare the environment for mining

Manual Setup (Alternative)

If you prefer to set up manually:

# Create virtual environment
python3 -m venv venv

# Activate virtual environment
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

Important: Virtual environments contain hardcoded paths and cannot be moved after creation. If you need to relocate this script:

  1. Delete the venv folder
  2. Recreate it in the new location
  3. Reinstall the packages

Usage

Basic Usage

Mine all Go modules from the index with default settings:

source venv/bin/activate
python mine_go.py

Or run directly without activating:

venv/bin/python mine_go.py

Custom Output Options

Specify custom output directory:

python mine_go.py --output-dir /path/to/output

Specify custom filename:

python mine_go.py --output-file custom_modules.csv

Both directory and filename:

python mine_go.py -o ./data -f go_packages.csv

View all options:

python mine_go.py --help

How It Works

The script will:

  1. Download the Go module index from index.golang.org using pagination
  2. Fetch modules in batches (up to 2000 per request)
  3. Parse module entries (path, version, timestamp)
  4. Extract unique module paths (deduplicating versions)
  5. Save checkpoints every 1000 batches for resume capability
  6. Fetch repository URLs from Go proxy API (when available)
  7. Generate CSV output (default: Resource/Package/Package-List/Go_New.csv)

Resume from Interruption

If the download is interrupted (Ctrl+C or network failure), simply run the script again:

python mine_go.py

The script will automatically detect the checkpoint file and resume from where it left off.

Data Source

  • Source: https://index.golang.org/index
  • Format: Newline-delimited JSON with pagination
  • Contents: All Go modules with versions and timestamps
  • Pagination: Uses since parameter to fetch all modules in batches
  • Total Modules: ~5.7 million+ unique modules (as of November 2025)
  • Total Entries: ~16 million+ (including all versions)
  • Processing Time: ~6-10 minutes with optimized fetching
  • Batches: ~8,000 batches (2000 entries each)

Output Format

The script generates Go_New.csv in the Resource/Package/Package-List/ directory with the following structure:

ID,Platform,Name,Homepage URL,Repository URL
1,Go,github.com/gorilla/mux,https://github.com/gorilla/mux,https://github.com/gorilla/mux
2,Go,github.com/gin-gonic/gin,https://github.com/gin-gonic/gin,https://github.com/gin-gonic/gin
3,Go,golang.org/x/sys,https://golang.org/x/sys,https://golang.org/x/sys

Column Descriptions

  • ID: Sequential identifier (1, 2, 3, ...)
  • Platform: Always "Go" for Go packages
  • Name: Full module path (e.g., github.com/user/repo)
  • Homepage URL: Retrieved from Go proxy API Origin field ("nan" if unavailable)
  • Repository URL: Retrieved from Go proxy API Origin field ("nan" if unavailable)

Note: This format is compatible with the Package-Filter tool for cross-ecosystem analysis.

Data Source and Availability

Repository URLs are retrieved from the Go proxy API's Origin field. Note that:

  • Modern modules (Go 1.13+): Usually include Origin metadata with repository URL
  • Older modules: May not have Origin data in the API response
  • When unavailable: Values are set to "nan" (no inference or guessing)

Example modules:

  • github.com/logbull/logbull-go - ✅ Has Origin data
  • gopkg.in/yaml.v3 - ❌ No Origin data (returns "nan")

Processing Details

Module Index Structure

The Go module index returns entries in this format:

{"Path":"github.com/user/repo","Version":"v1.2.3","Timestamp":"2023-01-01T00:00:00Z"}
{"Path":"github.com/user/repo","Version":"v1.2.4","Timestamp":"2023-02-01T00:00:00Z"}

The script:

  1. Downloads all entries as newline-delimited JSON
  2. Parses each entry
  3. Extracts unique module paths (ignoring multiple versions)
  4. Queries Go proxy API for each module's Origin metadata
  5. Extracts repository URLs from Origin field (when available)

API Data Retrieval

For each module, the script queries:

  1. /@latest endpoint for latest version and Origin data
  2. /@v/{version}.info endpoint for specific version Origin data
  3. Returns "nan" if Origin field is not present in API response
  4. No inference or pattern matching - only uses official API data

Files

  • mine_go.py: Main script
  • requirements.txt: Python dependencies (requests, tqdm)
  • setup.sh: Automated setup script
  • Output: ../../../Resource/Package/Package-List/Go_New.csv

Troubleshooting

"Error downloading Go module index"

Check that:

  • You have internet connectivity
  • index.golang.org is accessible: curl -I https://index.golang.org/index
  • No firewall blocking the connection

Solution: The script will automatically retry failed requests. If errors persist, check your network.

"Failed to download Go modules or no modules found"

This may occur if:

  • The index API format has changed
  • Network connection interrupted
  • Response was empty or malformed

Solution: Check your internet connection and try again. If you were interrupted, the script will resume from the last checkpoint.

Download was interrupted

No problem! The script saves checkpoints every 1000 batches.

Solution: Simply run the script again:

python mine_go.py

The script will display: Resuming from checkpoint: batch XXXX, XXXXX modules

"Permission denied" when creating output directory

Ensure you have write permissions to:

  • Current directory (for checkpoint files: .checkpoint.json)
  • Output directory (default: Resource/Package/Package-List/)

Solution: Run with appropriate permissions or specify a writable directory:

python mine_go.py --output-dir ~/Downloads

Virtual environment issues

If you encounter errors related to the virtual environment:

  1. Delete the venv folder: rm -rf venv
  2. Re-run the setup script: ./setup.sh
  3. Virtual environments cannot be moved after creation - recreate if you move the directory

Checkpoint file corrupted

If you see errors loading the checkpoint file:

Solution: Delete the checkpoint and start fresh:

rm .checkpoint.json
python mine_go.py

Slow download speed

If the download is slower than expected:

  • Check your network connection speed
  • Ensure no bandwidth-heavy applications are running
  • The script should process 10-20 batches/second
  • If seeing <5 batches/second, check for network congestion

SSL/TLS warnings

If you see warnings about LibreSSL or OpenSSL:

NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+

Note: This is a warning, not an error. The script will still work correctly. To suppress it, upgrade your Python's SSL library or ignore the warning.

Performance Notes

Optimizations

  • Connection Pooling: Reuses HTTP connections (20 connections, 40 max pool size)
  • Automatic Retries: Intelligent retry with exponential backoff for failed requests
  • Compression Support: Accepts gzip encoding to reduce bandwidth
  • Set-Based Deduplication: O(1) lookups for fast duplicate detection
  • Batch CSV Writing: Writes all rows at once for faster I/O
  • Checkpoint System: Saves progress every 1000 batches

Performance Metrics

  • Download Speed: ~3-4 batches/second (optimized)
  • Typical Runtime: ~6-10 minutes for complete download (~8000 batches)
  • Memory Usage: Moderate (~500-800 MB for ~5.7M unique modules)
  • Network Efficiency: Persistent connections reduce overhead by ~60%
  • Total Data: ~16M entries processed, ~5.7M unique modules extracted

Speed Comparison

Version Time Batches/sec Notes
Original ~15-20 min 6-8 Sequential with 0.1s delay
Optimized ~6-10 min 13-20 Connection pooling, no delay
Improvement 50-60% faster 2.5x faster With checkpoint support

Advantages

  • Official Source: Uses Google's official Go module proxy
  • No Rate Limits: Public index with no authentication required
  • Complete Data: Includes all public Go modules (~5.7M+)
  • Efficient Pagination: Batched requests with automatic deduplication
  • Reliable Data: Only uses API-provided Origin data (no inference)
  • Robust & Reliable: Automatic retry, checkpoint system, graceful interruption handling
  • Fast Performance: Optimized connection pooling and batch processing
  • Flexible Output: Customizable output directory and filename
  • Resume Capability: Continue from interruption without re-downloading

Limitations

  • Origin Data Availability: Many modules (especially older ones) lack Origin metadata in Go proxy API
  • Module Versions: Only unique module paths are stored (versions ignored)
  • Private Modules: Only includes public modules
  • Metadata: Limited to what's available in Go proxy API (no descriptions, etc.)

Code Explanation

Architecture

The Go Miner uses the official Go module index API with optimized pagination to fetch all public Go modules. The implementation includes connection pooling, automatic retries, checkpoint system, and batch processing for maximum efficiency.

1. Optimized Session with Connection Pooling

def create_session():
    session = requests.Session()
    adapter = HTTPAdapter(
        max_retries=retry_strategy,
        pool_connections=20,
        pool_maxsize=40
    )
    session.mount("http://", adapter)
    session.mount("https://", adapter)

Purpose: Creates a reusable HTTP session with connection pooling.

Optimizations:

  • Connection Pooling: Reuses TCP connections (20 pool connections, 40 max)
  • Automatic Retry: Retries failed requests with exponential backoff
  • Compression: Requests gzip encoding to reduce bandwidth
  • Persistent Headers: Sets User-Agent and Accept-Encoding once

Benefits:

  • ~60% faster than creating new connections each time
  • Reduces server load and network overhead
  • Handles transient network failures automatically

2. Paginated Index Download with Checkpoints

def download_go_index():
    base_url = "https://index.golang.org/index"
    since = ""
    checkpoint_interval = 1000

    # Load from checkpoint if exists
    if os.path.exists(checkpoint_file):
        checkpoint = json.load(f)
        modules_set = set(checkpoint['modules'])
        since = checkpoint['since']

Purpose: Downloads the complete Go module index with resume capability.

Features:

  • Pagination using since parameter with timestamps
  • Fetches up to 2000 modules per request
  • Checkpoint System: Saves progress every 1000 batches
  • Resume Support: Automatically resumes from last checkpoint
  • Progress Tracking: Shows unique modules, new modules, and total entries

Pagination Logic:

  • Start with no since parameter (gets oldest 2000 modules)
  • Extract timestamp from last entry
  • Use that timestamp as since in next request
  • Save checkpoint every 1000 batches
  • Repeat until fewer than 2000 entries returned

3. Efficient Deduplication with Set

modules_set = set()  # Use set for fast deduplication
if module_path and module_path not in modules_set:
    modules_set.add(module_path)
    new_modules += 1

Purpose: Keeps only unique module paths efficiently.

Optimization:

  • Set instead of Dict: Faster and uses less memory
  • O(1) lookup and insertion
  • Same module appears multiple times (one per version)
  • We only need unique paths, not version info
  • Memory efficient for 5.7M+ modules

4. API Data Retrieval

def get_module_info(module_path, session):
    # Query Go proxy API for Origin metadata
    response = session.get(f"https://proxy.golang.org/{module_path}/@latest")
    origin = response.json().get('Origin', {})
    if origin:
        repo_url = origin.get('URL')

Strategy: Retrieve repository URLs from official Go proxy API.

  • Queries /@latest and /@v/{version}.info endpoints
  • Extracts URL from Origin field when available
  • Returns "nan" if Origin data not present
  • No inference or pattern matching

5. Batch CSV Writing

rows = []
for module in modules:
    rows.append([...])

writer.writerows(rows)  # Write all at once

Purpose: Faster CSV generation.

Optimization:

  • Collect all rows in memory
  • Single write operation instead of thousands
  • Reduces I/O overhead significantly
  • Processes 5.7M modules in seconds

6. Command-Line Interface

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output-dir')
parser.add_argument('-f', '--output-file')

Purpose: Flexible output configuration.

Features:

  • Custom output directory
  • Custom filename
  • Help text with examples
  • Auto-add .csv extension if missing
  • Create directories if they don't exist

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

go_miner-1.0.0.tar.gz (18.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

go_miner-1.0.0-py3-none-any.whl (13.9 kB view details)

Uploaded Python 3

File details

Details for the file go_miner-1.0.0.tar.gz.

File metadata

  • Download URL: go_miner-1.0.0.tar.gz
  • Upload date:
  • Size: 18.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for go_miner-1.0.0.tar.gz
Algorithm Hash digest
SHA256 6d5c47dfb646b2504baca9a634b1a0293733a13ff172f534f47ca3263ddc9380
MD5 1df119c41e74d593db91301974a6f48b
BLAKE2b-256 59025f91afff6625c30cb219916845a37ac6b704184366289cd768319ecb9770

See more details on using hashes here.

File details

Details for the file go_miner-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: go_miner-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 13.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for go_miner-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0e8e38a1c364c5a5ce28a0cf00f8dfb151a7639b2e1946f42a48878e839f4295
MD5 7f0541ae6aaa7ea513c63582943607a3
BLAKE2b-256 bed298f22485e107ee2366e7c044a50354d6071211a26404b67d39e8352d9e9a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page