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.
Invoke-RepoHerdfunction as the module entry point for PowerShell Gallery users- After
Install-Module RepoHerd, users can callInvoke-RepoHerddirectly - Defaults to
dependencies.jsonin the current working directory - Same parameters as
RepoHerd.ps1
- After
RepoHerd.ps1refactored to a thin wrapper that delegates toInvoke-RepoHerd
- BREAKING: Renamed project from LsiGitCheckout to RepoHerd
- Module renamed:
LsiGitCheckout.psm1→RepoHerd.psm1 - Entry point renamed:
LsiGitCheckout.ps1→RepoHerd.ps1 - Manifest renamed:
LsiGitCheckout.psd1→RepoHerd.psd1 - Initialization function renamed:
Initialize-LsiGitCheckout→Initialize-RepoHerd - Error file renamed:
LsiGitCheckout_Errors.txt→RepoHerd_Errors.txt
- Module renamed:
- GitHub Pages landing page (
index.html) with SEO metadata, sitemap, and robots.txt - Split detailed documentation from README into dedicated files under
docs/
- Renamed functions to use approved PowerShell verbs:
Parse-VersionPattern→ConvertTo-VersionPattern,Parse-RepositoryVersions→Get-RepositoryVersions,Validate-DependencyConfiguration→Test-DependencyConfiguration,Sort-TagsByDate→Resolve-TagsByDate,Process-DependencyFile→Invoke-DependencyFile,Process-RecursiveDependencies→Invoke-RecursiveDependencies
- 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
pwshinstead ofpowershell.exe - Replaced verbose null-check patterns with
??null-coalescing operator - Entry point refactored to
try/catch/finallypattern 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
- Cross-platform SSH support: OpenSSH on macOS/Linux via
GIT_SSH_COMMAND, PuTTY/plink on WindowsTest-SshTransportAvailablereplacesTest-PlinkInstalled(platform-aware)Set-GitSshKeyOpenSshfor Unix: validates key format, checks permissions, setsGIT_SSH_COMMANDSet-GitSshKeyPlinkfor Windows: existing PuTTY/Pageant logic (unchanged behavior)Read-CredentialsFilenow warns about wrong key format for the current platform
RepoHerd.psm1module file containing all function definitionsRepoHerd.psd1module manifestInitialize-RepoHerdfunction 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
-OutputFileparameter for CI/CD pipeline integration- Schema version 1.0.0 with execution metadata, per-repository results, summary counters, and error messages
Export-CheckoutResultsfunction generates the JSON output- Output is guaranteed even on failure (written in
finallyblock)
- Post-checkout script tracking in JSON output per repository (
postCheckoutScriptfield with configured, found, executed, status, reason) and at root level (rootPostCheckoutScriptsarray) requestedByfield on each repository entry showing which parent repo or dependency file requested itTest-InteractiveSessionhelper to detect non-interactive environments- Error message collector in
Write-Logfor structured output docs/test_repositories_reference.md— catalog of all test repo tags and their dependencies
- Show-ErrorDialog pipeline leakage:
MessageBox::Show()return value leaked to pipeline, causing failures to be counted as successes - Non-interactive GUI dialogs:
Show-ErrorDialogandShow-ConfirmDialognow skip GUI inpwsh -NonInteractiveand 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 behindRecursiveMode, causing empty tags when using-DisableRecursionwith SemVer mode
- 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-VersionPatternfunction to handle floating version pattern parsing and validation- Enhanced
Test-SemVerCompatibilityfunction to support floating pattern compatibility testing Select-VersionFromIntersectionfunction for intelligent version selection based on pattern typesGet-CompatibleVersionsForPatternfunction for floating pattern version resolution- Comprehensive floating version examples in documentation and migration guide
- 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
- Version selection now properly handles mixed floating and fixed version requirements
- SemVer conflict resolution provides clearer error messages with pattern type information
- None
- None
- None
-
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
- 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
- New functions:
Test-SemVerCompatibility,Parse-RepositoryVersions,Get-CompatibleSemVersions,Get-SemVersionIntersection,Format-SemVersion,Update-SemVerRepository - Modified
Update-RepositoryDictionaryto handle both Agnostic and SemVer modes - Extended repository dictionary structure to include SemVer-specific fields
- Maintained backward compatibility with existing Agnostic mode configurations
- 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
- 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
- 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
- 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
{
"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"
}
]
}Environment Variables Provided:
LSIGIT_REPOSITORY_URL: Empty stringLSIGIT_REPOSITORY_PATH: Input dependency file directory pathLSIGIT_TAG: Empty stringLSIGIT_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>
- 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
- 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
- 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
- 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
- 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
- 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
- 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
{
"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"
}
]
}[
{
"Repository URL": "https://github.com/myorg/project.git",
"Base Path": "repos/project",
"Tag": "v1.0.0"
}
]# 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"- 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
- 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
- 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
- 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-CustomDependencyFilePathfunction for resolving custom dependency file locations with proper path resolution - Summary statistics showing count of repositories using custom dependency file configurations
- 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
- 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
- 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
{
"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 URL": "https://github.com/myorg/library.git",
"Base Path": "libs/library",
"Tag": "v2.0.0",
"Dependency File Name": "modules.json"
}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)
- 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-AbsoluteBasePathfunction with repository root context parameter - Updated
Process-DependencyFile,Invoke-GitCheckout, andUpdate-RepositoryDictionaryfunctions to support repository root path context - Maintains full backward compatibility with existing dependency file conventions
- 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
- BREAKING: Removed
-DisableTagSortingparameter - 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
- 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
- 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
-DisableTagSortingparameter and all associated functionality$script:EnableTagSortingvariable 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
- 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
- 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
- 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
- BREAKING: Renamed
-Recursiveparameter to-DisableRecursionfor cleaner API design - BREAKING: Renamed
-EnableTagSortingparameter to-DisableTagSortingfor consistent naming conventions - BREAKING: Recursive mode and tag temporal sorting are now enabled by default (no parameters needed for optimal behavior)
- 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
- 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
- Old:
.\RepoHerd.ps1 -Recursive -EnableTagSorting→ New:.\RepoHerd.ps1(default) - Old:
.\RepoHerd.ps1 -Recursive:$false -EnableTagSorting:$false→ New:.\RepoHerd.ps1 -DisableRecursion -DisableTagSorting - All JSON configuration files work without modification
- Functionality remains identical with improved parameter usability
- Default Intelligent Behavior: Made
-Recursiveand-EnableTagSortingenabled 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-GitTagDatesfunction for efficient tag date fetching usinggit for-each-refSort-TagsByDatefunction for chronological tag sorting with comprehensive debug logging- Enhanced
Get-TagUnionfunction 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
- BREAKING (Default Behavior):
-Recursivenow defaults to$true(enabled by default) - BREAKING (Default Behavior):
-EnableTagSortingnow defaults to$true(enabled by default) - Enhanced repository dictionary structure to include
TagDatesfield 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
- PowerShell string interpolation issues with datetime formatting in log messages
- Improved tag sorting object creation using
[PSCustomObject]for reliableSort-Objectoperations - Enhanced temporal verification logging with proper variable delimiting
- Optimized on-demand processing: Tag dates fetched only when conflicts require resolution during recursive processing
- Efficient
git for-each-refcommand usage instead of individualgit logcalls per tag - Tag date caching eliminates redundant git operations during recursive processing
- Reduced unnecessary tag date fetching and sorting operations
- Behavior Change: Default behavior now includes recursive processing and intelligent tag sorting
- Legacy Support: Use
-Recursive:$false -EnableTagSorting:$falseto restore v4.1.x behavior - Non-breaking: All existing configurations work without modification
- Manual temporal ordering requirements preserved when tag sorting is explicitly disabled
- 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
- Temporal ordering preserved in union operations for Permissive mode
- Union algorithm now maintains the chronological order of tags when constraints are met
- 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
- "API Compatibility" field in dependencies.json with "Strict" and "Permissive" modes
-ApiCompatibilityparameter 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
- 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
- Improved handling of tag ordering in union operations
- Git checkout error capture now properly displays stderr messages for missing tags
- Improved error reporting clarity when tags don't exist in repositories
- Switched from
Invoke-Expressionto&operator for more reliable error capture
- Cleanup of failed clones to prevent repositories in undefined states
- CheckoutFailed tracking to skip dependency processing for failed repositories
- Error handling for missing tags now provides detailed error messages
- Repositories that fail to checkout no longer have their dependencies processed
- Enhanced error message capture and display for all git operations
- Recursive dependency discovery and processing with
-Recursiveflag - 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
-MaxDepthparameter to control recursion depth (default: 5)- JSON dependency file content logging in debug mode
- Dynamic tag checkout when newer compatible version is found
- Improved path normalization to resolve relative paths correctly
- Enhanced debug logging for better troubleshooting
- Repository dictionary tracks all discovered repositories
- PowerShell HashSet compatibility issues across different versions
- Path resolution for nested relative paths with ".." segments
- 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
- New
-CredentialsFileparameter to specify custom SSH credentials file - Automatic hostname extraction from repository URLs
- Support for hostnames with and without
ssh://prefix in credentials file
- "SSH Key Path" field from Repository configuration in dependencies.json
- "SSH Key Path" field from Submodule Config in dependencies.json
- Create a new
git_credentials.jsonfile with hostname-to-key mappings - Remove all "SSH Key Path" fields from your dependencies.json
- The script will automatically look up SSH keys based on repository hostnames
- Removed dead code: Get-SshKeyPassword function (not used with PuTTY/Pageant)
- Script structure syntax errors
- BREAKING: Removed OpenSSH support - now PuTTY/plink only
- Simplified SSH key handling to only support PuTTY format (.ppk)
- Removed -SshClient parameter
- All OpenSSH-related code branches
- SSH client mode selection
- 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
- Submodule LFS inheritance issues
- Debug message accuracy
- SSH key support for individual submodules during update
- Submodules can now use different SSH keys as configured
- Improved error handling for SSH submodule authentication
- Merged "Submodule SSH Keys" into "Submodule Config" for cleaner JSON format
- "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
- 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
- Support for repository paths with spaces
- Proper quoting for all path operations
- Clone operations failing when repository path contains spaces
- Git commands not properly handling quoted paths
- Git LFS support with automatic detection
- Submodule SSH key configuration
- Dry run mode (-DryRun parameter)
- Debug logging (-EnableDebugLog parameter)
- Improved error handling and user feedback
- Enhanced logging system with multiple levels
- 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