Skip to content

Latest commit

 

History

History
714 lines (570 loc) · 35.2 KB

File metadata and controls

714 lines (570 loc) · 35.2 KB

Changelog

All notable changes to RepoHerd will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[9.1.0] - 2026-04-05

Added

  • Invoke-RepoHerd function as the module entry point for PowerShell Gallery users
    • After Install-Module RepoHerd, users can call Invoke-RepoHerd directly
    • Defaults to dependencies.json in the current working directory
    • Same parameters as RepoHerd.ps1

Changed

  • RepoHerd.ps1 refactored to a thin wrapper that delegates to Invoke-RepoHerd

[9.0.0] - 2026-03-31

Changed

  • BREAKING: Renamed project from LsiGitCheckout to RepoHerd
    • Module renamed: LsiGitCheckout.psm1RepoHerd.psm1
    • Entry point renamed: LsiGitCheckout.ps1RepoHerd.ps1
    • Manifest renamed: LsiGitCheckout.psd1RepoHerd.psd1
    • Initialization function renamed: Initialize-LsiGitCheckoutInitialize-RepoHerd
    • Error file renamed: LsiGitCheckout_Errors.txtRepoHerd_Errors.txt

Added

  • GitHub Pages landing page (index.html) with SEO metadata, sitemap, and robots.txt
  • Split detailed documentation from README into dedicated files under docs/

[8.0.1] - 2026-03-21

Changed

  • Renamed functions to use approved PowerShell verbs: Parse-VersionPatternConvertTo-VersionPattern, Parse-RepositoryVersionsGet-RepositoryVersions, Validate-DependencyConfigurationTest-DependencyConfiguration, Sort-TagsByDateResolve-TagsByDate, Process-DependencyFileInvoke-DependencyFile, Process-RecursiveDependenciesInvoke-RecursiveDependencies

[8.0.0] - 2026-03-21

Changed

  • BREAKING: Requires PowerShell 7.6 LTS or later (previously 5.1). PowerShell 7.6 installs side-by-side with Windows PowerShell 5.1.
  • Refactored monolithic script into module architecture: RepoHerd.psm1 (functions) + RepoHerd.ps1 (entry point)
  • Post-checkout scripts now execute via pwsh instead of powershell.exe
  • Replaced verbose null-check patterns with ?? null-coalescing operator
  • Entry point refactored to try/catch/finally pattern for guaranteed output file writing
  • Integration tests now perform actual git clones (no -DryRun) with full recursive checkout
  • Integration tests validate structured JSON output schema, not just exit codes
  • Integration tests clean up cloned repos between runs for test isolation
  • API incompatibility test configs now use "Dependency File Name" override for recursive lookup

Added

  • Cross-platform SSH support: OpenSSH on macOS/Linux via GIT_SSH_COMMAND, PuTTY/plink on Windows
    • Test-SshTransportAvailable replaces Test-PlinkInstalled (platform-aware)
    • Set-GitSshKeyOpenSsh for Unix: validates key format, checks permissions, sets GIT_SSH_COMMAND
    • Set-GitSshKeyPlink for Windows: existing PuTTY/Pageant logic (unchanged behavior)
    • Read-CredentialsFile now warns about wrong key format for the current platform
  • RepoHerd.psm1 module file containing all function definitions
  • RepoHerd.psd1 module manifest
  • Initialize-RepoHerd function for module state initialization
  • Automated unit tests using Pester 5.x (tests/RepoHerd.Unit.Tests.ps1)
  • Automated integration tests for all 16 test configs (tests/RepoHerd.Integration.Tests.ps1)
  • Structured JSON output via -OutputFile parameter for CI/CD pipeline integration
    • Schema version 1.0.0 with execution metadata, per-repository results, summary counters, and error messages
    • Export-CheckoutResults function generates the JSON output
    • Output is guaranteed even on failure (written in finally block)
  • Post-checkout script tracking in JSON output per repository (postCheckoutScript field with configured, found, executed, status, reason) and at root level (rootPostCheckoutScripts array)
  • requestedBy field on each repository entry showing which parent repo or dependency file requested it
  • Test-InteractiveSession helper to detect non-interactive environments
  • Error message collector in Write-Log for structured output
  • docs/test_repositories_reference.md — catalog of all test repo tags and their dependencies

Fixed

  • Show-ErrorDialog pipeline leakage: MessageBox::Show() return value leaked to pipeline, causing failures to be counted as successes
  • Non-interactive GUI dialogs: Show-ErrorDialog and Show-ConfirmDialog now skip GUI in pwsh -NonInteractive and CI environments
  • SemVer version parsing in DryRun: added guard to skip parsing when repo is not cloned
  • SemVer version resolution with -DisableRecursion (#16): version resolution was gated behind RecursiveMode, causing empty tags when using -DisableRecursion with SemVer mode

[7.1.0] - 2025-09-02

Added

  • Floating versions support for SemVer dependency resolution mode
  • New version pattern x.y.* for automatic patch version updates (e.g., "Version": "2.1.*")
  • New version pattern x.* for automatic minor and patch version updates (e.g., "Version": "2.*")
  • Mixed specification mode: when any dependency uses floating versions, automatically select highest compatible version
  • Parse-VersionPattern function to handle floating version pattern parsing and validation
  • Enhanced Test-SemVerCompatibility function to support floating pattern compatibility testing
  • Select-VersionFromIntersection function for intelligent version selection based on pattern types
  • Get-CompatibleVersionsForPattern function for floating pattern version resolution
  • Comprehensive floating version examples in documentation and migration guide

Changed

  • SemVer version selection behavior: now selects highest compatible version when floating patterns are present
  • Enhanced error messages to display floating pattern types and detailed compatibility information
  • Updated migration guide with floating version examples for all SemVer scenarios
  • Improved debug logging to show floating pattern types and selection reasoning

Fixed

  • Version selection now properly handles mixed floating and fixed version requirements
  • SemVer conflict resolution provides clearer error messages with pattern type information

Deprecated

  • None

Removed

  • None

Security

  • None

[7.0.0] - 2025-01-27

Added

  • Semantic Versioning (SemVer) Support - New dependency resolution mode based on SemVer 2.0.0 rules

    • Automatic version compatibility resolution without explicit API Compatible Tags lists
    • "Dependency Resolution" field to specify resolution mode ("Agnostic" or "SemVer")
    • "Version" field for specifying SemVer requirements (e.g., "2.1.0")
    • "Version Regex" field for custom version tag patterns (optional)
    • Intelligent version selection (chooses lowest compatible version)
    • Comprehensive conflict detection and reporting across the dependency tree
    • Support for 0.x.y version handling per SemVer 2.0.0 specification
  • Mixed Mode Support - Ability to use both Agnostic and SemVer repositories in the same dependency tree

    • Each repository's resolution mode is immutable once established
    • Seamless integration between different resolution strategies
  • Enhanced Version Parsing

    • One-time tag parsing with caching for performance
    • Support for custom version tag formats via regex patterns
    • Built-in validation for regex patterns (requires 3 capture groups)
  • Improved Conflict Reporting

    • Detailed conflict messages showing all requestors and their requirements
    • Clear indication of which versions would satisfy each requirement
    • Enhanced error context with full stack traces for debugging

Changed

  • Repository dictionary now tracks dependency resolution mode for each repository
  • Version information stored separately from tag information for SemVer repositories
  • Error handling enhanced to provide better context for SemVer conflicts

Technical Details

  • New functions: Test-SemVerCompatibility, Parse-RepositoryVersions, Get-CompatibleSemVersions, Get-SemVersionIntersection, Format-SemVersion, Update-SemVerRepository
  • Modified Update-RepositoryDictionary to handle both Agnostic and SemVer modes
  • Extended repository dictionary structure to include SemVer-specific fields
  • Maintained backward compatibility with existing Agnostic mode configurations

[6.2.1] - 2025-01-27

Added

  • Root-Level Post-Checkout Scripts: Added support for executing post-checkout scripts at depth 0 (root level) when configured in the input dependency file
  • Enhanced Script Path Construction: Post-checkout scripts at depth 0 use the input dependency file location as the base path for script resolution
  • Depth 0 Environment Variables: Environment variables at depth 0 are provided as empty strings (except LSIGIT_SCRIPT_VERSION) for consistent script interface

Changed

  • Post-Checkout Script Execution: Scripts can now execute before processing repositories when configured in the main input dependency file
  • Improved Depth Handling: Post-checkout scripts execute at any depth level, including depth 0 (root level)
  • Enhanced Logging: Added specific logging for depth 0 post-checkout script execution with base path information

Fixed

  • Root-Level Limitation Removed: Previously post-checkout scripts could only be configured for depths > 0; now supports depth 0 execution
  • Environment Variable Consistency: Provides consistent environment variable interface across all depth levels

Benefits

  • Complete Coverage: Post-checkout scripts can now be executed at every level of dependency processing
  • Enhanced Integration: Root-level scripts enable pre-repository setup tasks and global configuration
  • Consistent Interface: Uniform environment variable handling across all depth levels
  • Flexible Setup: Scripts can perform root-level initialization before any repository processing begins

Configuration Examples

Root-Level Post-Checkout Script Configuration

{
  "Post-Checkout Script File Name": "root-setup.ps1",
  "Post-Checkout Script File Path": "scripts",
  "Repositories": [
    {
      "Repository URL": "https://github.com/myorg/project.git",
      "Base Path": "repos/project",
      "Tag": "v1.0.0"
    }
  ]
}

Script Execution at Depth 0

Environment Variables Provided:

  • LSIGIT_REPOSITORY_URL: Empty string
  • LSIGIT_REPOSITORY_PATH: Input dependency file directory path
  • LSIGIT_TAG: Empty string
  • LSIGIT_SCRIPT_VERSION: Current RepoHerd version

Working Directory: Input dependency file directory

Script Path Resolution:

  • Base path: Directory containing the input dependency file
  • Script location: <input_file_directory>/<Post-Checkout Script File Path>/<Post-Checkout Script File Name>

Use Cases for Root-Level Scripts

  • Global Environment Setup: Configure development environment before any repository checkout
  • Credential Validation: Verify SSH keys and authentication before processing
  • Workspace Preparation: Create directory structures and set permissions
  • Pre-Flight Checks: Validate system requirements and dependencies
  • Logging Initialization: Set up centralized logging for the entire checkout process

Migration Notes

  • Zero Breaking Changes: All existing v6.2.0 configurations work without modification
  • Optional Enhancement: Root-level scripts are completely optional
  • Backward Compatibility: Maintains full compatibility with nested post-checkout scripts
  • Enhanced Capability: Extends post-checkout script functionality to cover all depth levels

Technical Implementation

  • Post-checkout scripts at depth 0 execute before processing the repositories listed in the input dependency file
  • Script path resolution uses the input dependency file directory as the base path
  • Environment variables follow the same pattern as nested scripts but with empty strings for repository-specific values
  • Logging clearly indicates depth 0 execution context for debugging and monitoring
  • Error handling ensures root-level script failures don't prevent repository processing

[6.2.0] - 2025-01-24

Added

  • Post-Checkout Script Execution: Added support for executing PowerShell scripts after successful repository checkouts
  • New JSON Object Format: Enhanced dependency file format with top-level configuration options while maintaining full backward compatibility with legacy array format
  • Post-Checkout Script File Name: Optional field to specify PowerShell script name for execution after checkout
  • Post-Checkout Script File Path: Optional field to specify subdirectory within repository where post-checkout script is located
  • Script Execution Context: Environment variables provided to scripts (LSIGIT_REPOSITORY_URL, LSIGIT_REPOSITORY_PATH, LSIGIT_TAG, LSIGIT_SCRIPT_VERSION)
  • -DisablePostCheckoutScripts Parameter: Command line option to disable post-checkout script execution
  • Script Timeout Protection: Automatic termination of scripts that exceed 5-minute execution limit
  • Comprehensive Script Logging: Detailed logging of script discovery, execution, and results
  • Script Execution Statistics: Summary reporting of script executions and failures
  • External Integration Support: Enable integration with npm, NuGet, pip, and other dependency management systems via post-checkout scripts

Changed

  • Enhanced JSON Format Support: Now supports both new object format ({"Repositories": [...]}) and legacy array format ([...])
  • Improved Repository Processing: Post-checkout scripts execute for the repository containing the dependency file configuration, not for individual repositories listed in the dependency file
  • Extended Summary Reporting: Added post-checkout script execution statistics to summary output
  • Enhanced Debug Logging: More detailed logging for script discovery, execution timing, and error handling
  • Refined Execution Context: Scripts execute with repository root as working directory and receive rich context via environment variables

Fixed

  • Script Execution Isolation: Each post-checkout script runs in its own PowerShell process with proper environment cleanup
  • Error Handling Robustness: Script failures are logged but don't affect repository checkout success status
  • Working Directory Management: Ensures scripts always execute from the correct repository root directory

Benefits

  • Multi-System Integration: Seamlessly integrate RepoHerd with existing package managers and build systems
  • Automated Setup: Automatically configure development environments after repository checkout
  • Flexible Extensibility: Support for custom post-checkout workflows via PowerShell scripting
  • Zero Breaking Changes: All existing dependency files continue to work without modification
  • Enhanced Observability: Comprehensive logging and statistics for script execution monitoring
  • Security Controls: Scripts can be disabled entirely via command line parameter for untrusted environments

Configuration Examples

New Object Format with Post-Checkout Scripts

{
  "Post-Checkout Script File Name": "setup-environment.ps1",
  "Post-Checkout Script File Path": "scripts/build",
  "Repositories": [
    {
      "Repository URL": "https://github.com/myorg/project.git",
      "Base Path": "repos/project",
      "Tag": "v1.0.0"
    }
  ]
}

Legacy Array Format (Fully Compatible)

[
  {
    "Repository URL": "https://github.com/myorg/project.git",
    "Base Path": "repos/project",
    "Tag": "v1.0.0"
  }
]

Example Post-Checkout Script

# setup-environment.ps1
Write-Host "Setting up environment for $env:LSIGIT_REPOSITORY_URL at tag $env:LSIGIT_TAG"

# Install npm dependencies
if (Test-Path "package.json") {
    npm install
}

# Restore NuGet packages
if (Test-Path "*.csproj") {
    dotnet restore
}

Write-Host "Environment setup completed for $env:LSIGIT_REPOSITORY_PATH"

Technical Implementation

  • Post-checkout script configuration applies to all repositories in a dependency file
  • Scripts execute only after successful repository checkouts (clone or tag change)
  • Environment variables provide script context about the checkout operation
  • Scripts run with 5-minute timeout protection and comprehensive error handling
  • Script execution is fully optional and can be disabled via command line parameter
  • Legacy array format maintains 100% backward compatibility
  • Enhanced JSON parsing supports both object and array root formats

Migration Notes

  • Zero configuration changes required: All existing dependency files work without modification
  • Optional enhancement: Convert to object format to add post-checkout scripts
  • Gradual adoption: Add post-checkout scripts to repositories as needed
  • Full compatibility: Legacy array format support preserved indefinitely
  • Enhanced integration: Use post-checkout scripts to integrate with existing build and dependency management systems

Use Cases

  • Package Manager Integration: Automatically run npm install, dotnet restore, pip install, etc.
  • Build Environment Setup: Configure development environments after checkout
  • License and Security Scanning: Run automated compliance checks on checked-out code
  • Custom Initialization: Execute project-specific setup procedures
  • Multi-System Orchestration: Coordinate between RepoHerd and other tools

[6.1.0] - 2025-01-24

Added

  • Custom Dependency File Support: Added support for per-repository custom dependency file paths and names via "Dependency File Path" and "Dependency File Name" fields
  • Repository-Level Dependency Configuration: Each repository can specify its own dependency file location without affecting nested repositories
  • Proper Path Resolution: Relative paths in dependency files are now correctly resolved from repository root directories, not dependency file locations
  • Isolation of Custom Settings: Custom dependency file settings are not propagated to nested repositories (preserves dependency isolation)
  • Enhanced logging for custom dependency file configurations showing when custom paths/names are used
  • New Get-CustomDependencyFilePath function for resolving custom dependency file locations with proper path resolution
  • Summary statistics showing count of repositories using custom dependency file configurations

Changed

  • Repository Dictionary Enhancement: Extended repository dictionary to track custom dependency file settings per repository
  • Recursive Processing Improvement: Modified recursive dependency processing to handle per-repository custom dependency files while maintaining isolation
  • Path Resolution Fix: Fixed critical issue where relative paths were incorrectly resolved from dependency file directories instead of repository roots
  • Enhanced verbose logging to show custom dependency file path and name configurations during repository processing
  • Improved dependency file resolution logic to support both relative and absolute custom paths with correct base path calculation
  • Updated function signatures to support repository root path context for proper relative path resolution

Fixed

  • Critical Path Resolution Bug: Relative paths in nested dependency files now correctly resolve from the repository root instead of the dependency file's directory location
  • Resolved issue where custom dependency file paths could create incorrect absolute paths leading to repository conflicts
  • Fixed path calculation logic to properly handle ".." segments relative to repository roots

Benefits

  • Flexible Dependency Management: Repositories can use different dependency file naming conventions (e.g., "project-deps.json", "modules.json")
  • Custom Directory Structure Support: Dependency files can be located in subdirectories (e.g., "config/deps", "build/dependencies")
  • Correct Path Behavior: Relative paths in dependency files work as users expect (relative to repository root)
  • Backward Compatibility: All existing repositories continue to work without modification
  • Dependency Isolation: Custom settings don't leak to nested repositories, preventing unintended dependency file lookups
  • Mixed Convention Support: Teams can mix different dependency file conventions within the same project hierarchy
  • Robust Path Resolution: Eliminates path conflicts caused by incorrect relative path calculation

Configuration Examples

Repository with Custom Dependency File Path and Name

{
  "Repository URL": "https://github.com/myorg/project.git",
  "Base Path": "repos/project",
  "Tag": "v1.0.0",
  "Dependency File Path": "config/deps",
  "Dependency File Name": "project-dependencies.json"
}

Repository with Custom File Name Only

{
  "Repository URL": "https://github.com/myorg/library.git",
  "Base Path": "libs/library",
  "Tag": "v2.0.0",
  "Dependency File Name": "modules.json"
}

Correct Path Resolution Example

Repository root: /project/
Custom dependency file: /project/build/config/deps.json
Relative path in deps.json: ../libs/shared
Correctly resolves to: /project/libs/shared (relative to repository root)

Technical Implementation

  • Custom dependency file settings are stored in the repository dictionary but not propagated during recursive processing
  • Nested repositories always use the default dependency file name from the root invocation
  • Path resolution supports both relative paths (relative to repository root) and subdirectories
  • Enhanced Get-AbsoluteBasePath function with repository root context parameter
  • Updated Process-DependencyFile, Invoke-GitCheckout, and Update-RepositoryDictionary functions to support repository root path context
  • Maintains full backward compatibility with existing dependency file conventions

Migration Notes

  • Zero configuration changes required: All existing repositories work without modification
  • Optional feature: Custom dependency file settings are completely optional
  • Gradual adoption: Teams can add custom settings to repositories as needed
  • Path resolution improvement: Existing relative paths now work more intuitively
  • Enhanced debugging: Better logging for troubleshooting path resolution issues

[6.0.0] - 2025-01-24

Breaking Changes

  • BREAKING: Removed -DisableTagSorting parameter - tag temporal sorting is now always enabled
  • BREAKING: Eliminated all legacy manual ordering code paths for API Compatible Tags
  • BREAKING: API Compatible Tags can now be listed in any order - automatic chronological sorting is always applied

Added

  • Always-on intelligent tag temporal sorting using actual git tag dates
  • Enhanced performance with optimized tag sorting algorithms that run only when needed
  • Simplified codebase with single, consistent code paths for tag handling
  • Improved user experience with no configuration required for optimal tag ordering

Changed

  • Major Simplification: Removed 195+ lines of conditional logic and legacy fallback code (26% reduction)
  • API compatibility resolution now always uses chronological tag intelligence
  • Tag selection algorithms simplified to single code paths for both Strict and Permissive modes
  • Documentation streamlined to reflect always-enabled temporal sorting
  • Startup logging simplified with clear indication that tag sorting is always active

Removed

  • -DisableTagSorting parameter and all associated functionality
  • $script:EnableTagSorting variable and conditional logic
  • Legacy manual ordering requirements and validation
  • Complex fallback algorithms for manual tag ordering compatibility
  • Conditional warnings for incompatible manually-ordered tag lists
  • All code branches that handled disabled tag sorting

Performance

  • Optimized algorithms: Tag date fetching only occurs when needed for conflict resolution
  • Reduced complexity: Single execution path eliminates branching overhead
  • Cleaner memory usage: Removed unused variables and conditional state tracking
  • Faster conflict resolution: Always uses optimal chronological intelligence

Migration Notes

  • Zero configuration changes: All existing JSON files work without modification
  • Improved behavior: Users automatically get optimal tag ordering without any parameter changes
  • Enhanced reliability: Eliminates the possibility of manual ordering errors
  • Better developer experience: API Compatible Tags can be listed in any order

Benefits

  • Cleaner codebase: 26% reduction in code complexity
  • Better maintainability: Single code path for all tag operations
  • Enhanced user experience: Always uses intelligent behavior by default
  • Consistent performance: Optimized algorithms used in all scenarios
  • Simplified documentation: Easier to understand and use

[5.0.0] - 2025-01-17

Breaking Changes

  • BREAKING: Renamed -Recursive parameter to -DisableRecursion for cleaner API design
  • BREAKING: Renamed -EnableTagSorting parameter to -DisableTagSorting for consistent naming conventions
  • BREAKING: Recursive mode and tag temporal sorting are now enabled by default (no parameters needed for optimal behavior)

Added

  • Clean parameter API following PowerShell switch parameter best practices
  • Intuitive default behavior requiring zero configuration for most use cases
  • Consistent naming conventions for all disable flags

Changed

  • Switch parameters now use proper naming conventions (disable flags instead of enable flags with defaults)
  • Default behavior provides intelligent recursive processing and tag sorting out-of-the-box
  • Enhanced user experience with no required parameters for optimal functionality

Migration

  • Old: .\RepoHerd.ps1 -Recursive -EnableTagSortingNew: .\RepoHerd.ps1 (default)
  • Old: .\RepoHerd.ps1 -Recursive:$false -EnableTagSorting:$falseNew: .\RepoHerd.ps1 -DisableRecursion -DisableTagSorting
  • All JSON configuration files work without modification
  • Functionality remains identical with improved parameter usability

[4.2.0] - 2025-01-17

Added

  • Default Intelligent Behavior: Made -Recursive and -EnableTagSorting enabled by default for optimal out-of-the-box experience
  • Performance-Optimized Tag Temporal Sorting: Intelligent tag selection algorithm that prioritizes existing/new "Tag" values when resolving repository conflicts
  • Get-GitTagDates function for efficient tag date fetching using git for-each-ref
  • Sort-TagsByDate function for chronological tag sorting with comprehensive debug logging
  • Enhanced Get-TagUnion function with temporal sorting support when tag dates are available
  • Priority-based tag selection: prefers specified "Tag" values over other compatible tags when both are compatible
  • Fallback to chronologically most recent tag when neither existing nor new "Tag" is compatible
  • Comprehensive verbose and debug logging for tag temporal sorting operations
  • Tag date verification and temporal order display in verbose mode
  • Tag date caching in repository dictionary for performance optimization
  • Enhanced repository conflict detection logging with clear status indicators

Changed

  • BREAKING (Default Behavior): -Recursive now defaults to $true (enabled by default)
  • BREAKING (Default Behavior): -EnableTagSorting now defaults to $true (enabled by default)
  • Enhanced repository dictionary structure to include TagDates field for storing tag date mappings
  • Improved tag selection logic in all API compatibility scenarios (Strict-Strict, Strict-Permissive, Permissive-Permissive, Permissive-Strict)
  • Updated summary report to display tag temporal sorting status and statistics
  • Enhanced union algorithm to use temporal sorting when enabled, falling back to original logic when disabled
  • Optimized tag sorting to only run when needed during API compatibility resolution
  • Improved repository conflict logging to clearly indicate when repositories already exist in dictionary
  • Enhanced error handling for tag date parsing and git command failures

Fixed

  • PowerShell string interpolation issues with datetime formatting in log messages
  • Improved tag sorting object creation using [PSCustomObject] for reliable Sort-Object operations
  • Enhanced temporal verification logging with proper variable delimiting

Performance

  • Optimized on-demand processing: Tag dates fetched only when conflicts require resolution during recursive processing
  • Efficient git for-each-ref command usage instead of individual git log calls per tag
  • Tag date caching eliminates redundant git operations during recursive processing
  • Reduced unnecessary tag date fetching and sorting operations

Backward Compatibility

  • Behavior Change: Default behavior now includes recursive processing and intelligent tag sorting
  • Legacy Support: Use -Recursive:$false -EnableTagSorting:$false to restore v4.1.x behavior
  • Non-breaking: All existing configurations work without modification
  • Manual temporal ordering requirements preserved when tag sorting is explicitly disabled

Migration Notes

  • Zero configuration upgrade: Most users get optimal behavior without any parameter changes
  • Enhanced user experience: New users get intelligent behavior by default
  • Optional legacy mode: Previous behavior available via explicit parameter flags
  • Performance benefits: Automatic optimization for complex dependency graphs

[4.1.1] - 2025-01-16

Fixed

  • Temporal ordering preserved in union operations for Permissive mode
  • Union algorithm now maintains the chronological order of tags when constraints are met

Added

  • Warning when tag lists don't start with the same tag (falls back to unordered union)
  • Warning when tag lists have same length but different content (falls back to unordered union)
  • Debug logging for edge cases in union operations

[4.1.0] - 2025-01-16

Added

  • "API Compatibility" field in dependencies.json with "Strict" and "Permissive" modes
  • -ApiCompatibility parameter to set default compatibility mode (defaults to "Permissive")
  • Enhanced tag selection algorithm based on compatibility mode:
    • Strict mode: Uses intersection of compatible tags (existing behavior)
    • Permissive mode: Uses union of compatible tags for more flexible version management
  • Compatibility mode inheritance rules:
    • Strict + Strict = Use intersection algorithm
    • Strict + Permissive = Keep existing Strict repository unchanged
    • Permissive + Permissive = Use union algorithm
    • Permissive + Strict = Adopt Strict mode and its tags

Changed

  • Tag selection in Permissive mode now selects the most recent tag from the union of all compatible versions
  • Repository dictionary now tracks API Compatibility mode for each repository
  • Summary report now displays the default API Compatibility mode

Fixed

  • Improved handling of tag ordering in union operations

[4.0.2] - 2025-01-15

Fixed

  • Git checkout error capture now properly displays stderr messages for missing tags
  • Improved error reporting clarity when tags don't exist in repositories

Changed

  • Switched from Invoke-Expression to & operator for more reliable error capture

[4.0.1] - 2025-01-15

Added

  • Cleanup of failed clones to prevent repositories in undefined states
  • CheckoutFailed tracking to skip dependency processing for failed repositories

Fixed

  • Error handling for missing tags now provides detailed error messages
  • Repositories that fail to checkout no longer have their dependencies processed

Changed

  • Enhanced error message capture and display for all git operations

[4.0.0] - 2025-01-15

Added

  • Recursive dependency discovery and processing with -Recursive flag
  • API compatibility checking for shared dependencies
  • "API Compatible Tags" field for version compatibility management
  • Automatic version selection (most recent compatible version)
  • Path conflict detection for duplicate repositories
  • -MaxDepth parameter to control recursion depth (default: 5)
  • JSON dependency file content logging in debug mode
  • Dynamic tag checkout when newer compatible version is found

Changed

  • Improved path normalization to resolve relative paths correctly
  • Enhanced debug logging for better troubleshooting
  • Repository dictionary tracks all discovered repositories

Fixed

  • PowerShell HashSet compatibility issues across different versions
  • Path resolution for nested relative paths with ".." segments

[3.0.0] - 2025-01-14

Changed

  • BREAKING: Moved SSH key configuration from dependencies.json to separate git_credentials.json file
  • SSH keys are now mapped by hostname instead of per-repository
  • Improved security by separating credentials from repository configuration

Added

  • New -CredentialsFile parameter to specify custom SSH credentials file
  • Automatic hostname extraction from repository URLs
  • Support for hostnames with and without ssh:// prefix in credentials file

Removed

  • "SSH Key Path" field from Repository configuration in dependencies.json
  • "SSH Key Path" field from Submodule Config in dependencies.json

Migration Guide

  1. Create a new git_credentials.json file with hostname-to-key mappings
  2. Remove all "SSH Key Path" fields from your dependencies.json
  3. The script will automatically look up SSH keys based on repository hostnames

[2.1.2] - 2025-01-10

Removed

  • Removed dead code: Get-SshKeyPassword function (not used with PuTTY/Pageant)

Fixed

  • Script structure syntax errors

[2.1.0] - 2025-01-10

Changed

  • BREAKING: Removed OpenSSH support - now PuTTY/plink only
  • Simplified SSH key handling to only support PuTTY format (.ppk)
  • Removed -SshClient parameter

Removed

  • All OpenSSH-related code branches
  • SSH client mode selection

[2.0.0] - 2025-01-09

Changed

  • BREAKING: Removed per-submodule Skip LFS configuration
  • Skip LFS now applies to the entire repository including all submodules
  • Significantly simplified code by removing complex LFS override logic

Fixed

  • Submodule LFS inheritance issues
  • Debug message accuracy

[1.5.0] - 2025-01-09

Added

  • SSH key support for individual submodules during update
  • Submodules can now use different SSH keys as configured
  • Improved error handling for SSH submodule authentication

Changed

  • Merged "Submodule SSH Keys" into "Submodule Config" for cleaner JSON format

[1.4.0] - 2025-01-09

Added

  • "Skip LFS" configuration option for repositories
  • "Submodule Config" section with per-submodule LFS control
  • LFS pulls can now be skipped on a per-repository or per-submodule basis

[1.3.0] - 2025-01-08

Added

  • Support for PuTTY/plink SSH client
  • -SshClient parameter to choose between OpenSSH and PuTTY
  • Automatic detection of key format (OpenSSH vs PuTTY)
  • Integration with Pageant for PuTTY keys

[1.2.0] - 2025-01-08

Added

  • Support for repository paths with spaces
  • Proper quoting for all path operations

Fixed

  • Clone operations failing when repository path contains spaces
  • Git commands not properly handling quoted paths

[1.1.0] - 2025-01-08

Added

  • Git LFS support with automatic detection
  • Submodule SSH key configuration
  • Dry run mode (-DryRun parameter)
  • Debug logging (-EnableDebugLog parameter)

Changed

  • Improved error handling and user feedback
  • Enhanced logging system with multiple levels

[1.0.0] - 2025-01-07

Added

  • Initial release
  • Multiple repository management from JSON configuration
  • Tag-based checkout
  • SSH key support for repositories
  • Automatic repository reset
  • Submodule initialization and update
  • Comprehensive error handling
  • Summary report generation