purger 0.4.1

A tool for cleaning Rust project build directories
Documentation
# Purger Publishing Script (PowerShell)
# This script helps with local publishing and version management

param(
    [Parameter(Position=0)]
    [string]$Command = "help",
    
    [switch]$SkipTests,
    [switch]$SkipChecks,
    [string]$BumpType
)

# Function to print colored output
function Write-Info {
    param([string]$Message)
    Write-Host "ℹ️  $Message" -ForegroundColor Blue
}

function Write-Success {
    param([string]$Message)
    Write-Host "✅ $Message" -ForegroundColor Green
}

function Write-Warning {
    param([string]$Message)
    Write-Host "⚠️  $Message" -ForegroundColor Yellow
}

function Write-Error {
    param([string]$Message)
    Write-Host "❌ $Message" -ForegroundColor Red
}

# Function to show usage
function Show-Usage {
    Write-Host "Usage: .\scripts\publish.ps1 [COMMAND] [OPTIONS]"
    Write-Host ""
    Write-Host "Commands:"
    Write-Host "  check       - Run pre-publish checks (format, clippy, tests)"
    Write-Host "  dry-run     - Test publishing without actually publishing"
    Write-Host "  publish     - Publish all packages to crates.io"
    Write-Host "  version     - Show current version information"
    Write-Host ""
    Write-Host "Options:"
    Write-Host "  -SkipTests    - Skip running tests"
    Write-Host "  -SkipChecks   - Skip format and clippy checks"
    Write-Host ""
    Write-Host "Examples:"
    Write-Host "  .\scripts\publish.ps1 check                    # Run all checks"
    Write-Host "  .\scripts\publish.ps1 dry-run                  # Test publishing"
    Write-Host "  .\scripts\publish.ps1 publish                  # Publish to crates.io"
    Write-Host "  .\scripts\publish.ps1 version                  # Show version info"
}

# Function to check if cargo is available
function Test-Cargo {
    if (-not (Get-Command cargo -ErrorAction SilentlyContinue)) {
        Write-Error "cargo is not installed or not in PATH"
        exit 1
    }
}

# Function to get current version
function Get-CurrentVersion {
    $metadata = cargo metadata --no-deps --format-version 1 | ConvertFrom-Json
    $purgerPackage = $metadata.packages | Where-Object { $_.name -eq "purger" }
    return $purgerPackage.version
}

# Function to run pre-publish checks
function Invoke-Checks {
    param(
        [bool]$SkipTests = $false,
        [bool]$SkipChecks = $false
    )
    
    Write-Info "Running pre-publish checks..."
    
    if (-not $SkipChecks) {
        Write-Info "Checking code formatting..."
        $formatResult = cargo fmt --all -- --check
        if ($LASTEXITCODE -eq 0) {
            Write-Success "Code formatting is correct"
        } else {
            Write-Error "Code formatting issues found. Run 'cargo fmt' to fix."
            return $false
        }
        
        Write-Info "Running clippy..."
        $clippyResult = cargo clippy --workspace --all-targets --all-features -- -D warnings
        if ($LASTEXITCODE -eq 0) {
            Write-Success "Clippy checks passed"
        } else {
            Write-Error "Clippy found issues"
            return $false
        }
    }
    
    if (-not $SkipTests) {
        Write-Info "Running tests..."
        $testResult = cargo test --workspace --all-features
        if ($LASTEXITCODE -eq 0) {
            Write-Success "All tests passed"
        } else {
            Write-Error "Some tests failed"
            return $false
        }
    }
    
    Write-Success "All checks passed!"
    return $true
}

# Function to dry run publishing
function Invoke-DryRunPublish {
    Write-Info "Running dry-run publishing..."
    
    Write-Info "Dry-run: purger-core"
    cargo publish --dry-run -p purger-core --allow-dirty
    if ($LASTEXITCODE -ne 0) { return $false }

    Write-Info "Dry-run: purger-cli"
    cargo publish --dry-run -p purger-cli --allow-dirty
    if ($LASTEXITCODE -ne 0) { return $false }

    Write-Info "Dry-run: purger-gui"
    cargo publish --dry-run -p purger-gui --allow-dirty
    if ($LASTEXITCODE -ne 0) { return $false }

    Write-Info "Dry-run: purger"
    cargo publish --dry-run -p purger --allow-dirty
    if ($LASTEXITCODE -ne 0) { return $false }
    
    Write-Success "Dry-run completed successfully!"
    return $true
}

# Function to publish packages
function Invoke-PublishPackages {
    Write-Info "Publishing packages to crates.io..."
    
    # Check if CARGO_REGISTRY_TOKEN is set
    if (-not $env:CARGO_REGISTRY_TOKEN) {
        Write-Warning "CARGO_REGISTRY_TOKEN not set. Make sure you're logged in with 'cargo login'"
    }
    
    Write-Info "Publishing purger-core..."
    cargo publish -p purger-core
    if ($LASTEXITCODE -ne 0) { 
        Write-Error "Failed to publish purger-core"
        return $false 
    }
    Write-Success "purger-core published!"
    
    Write-Info "Waiting 60 seconds for crates.io to propagate..."
    Start-Sleep -Seconds 60
    
    Write-Info "Publishing purger-cli..."
    cargo publish -p purger-cli
    if ($LASTEXITCODE -ne 0) { 
        Write-Error "Failed to publish purger-cli"
        return $false 
    }
    Write-Success "purger-cli published!"
    
    Write-Info "Publishing purger-gui..."
    cargo publish -p purger-gui
    if ($LASTEXITCODE -ne 0) { 
        Write-Error "Failed to publish purger-gui"
        return $false 
    }
    Write-Success "purger-gui published!"
    
    Write-Info "Waiting 30 seconds for dependencies to propagate..."
    Start-Sleep -Seconds 30
    
    Write-Info "Publishing purger..."
    cargo publish -p purger
    if ($LASTEXITCODE -ne 0) { 
        Write-Error "Failed to publish purger"
        return $false 
    }
    Write-Success "purger published!"
    
    Write-Success "All packages published successfully!"
    Write-Host ""
    Write-Info "Links:"
    Write-Host "  - https://crates.io/crates/purger-core"
    Write-Host "  - https://crates.io/crates/purger-cli"
    Write-Host "  - https://crates.io/crates/purger-gui"
    Write-Host "  - https://crates.io/crates/purger"
    
    return $true
}

# Function to show version information
function Show-Version {
    Write-Info "Current version information:"
    Write-Host ""
    
    $metadata = cargo metadata --no-deps --format-version 1 | ConvertFrom-Json
    foreach ($package in $metadata.packages) {
        Write-Host "  $($package.name): $($package.version)"
    }
}

# Main script logic
function Main {
    Test-Cargo
    
    switch ($Command.ToLower()) {
        "check" {
            $result = Invoke-Checks -SkipTests $SkipTests -SkipChecks $SkipChecks
            if (-not $result) { exit 1 }
        }
        "dry-run" {
            $checksResult = Invoke-Checks -SkipTests $SkipTests -SkipChecks $SkipChecks
            if (-not $checksResult) { exit 1 }
            
            $dryRunResult = Invoke-DryRunPublish
            if (-not $dryRunResult) { exit 1 }
        }
        "publish" {
            $checksResult = Invoke-Checks -SkipTests $SkipTests -SkipChecks $SkipChecks
            if (-not $checksResult) { exit 1 }
            
            $publishResult = Invoke-PublishPackages
            if (-not $publishResult) { exit 1 }
        }
        "version" {
            Show-Version
        }
        { $_ -in @("help", "--help", "-h") } {
            Show-Usage
        }
        default {
            Write-Error "Unknown command: $Command"
            Write-Host ""
            Show-Usage
            exit 1
        }
    }
}

# Run main function
Main