Skip to content

fix(git): preserve relative paths in git_submodule_add (#168)#170

Merged
MementoRC merged 5 commits into
developmentfrom
fix/submodule-relative-path-168
May 13, 2026
Merged

fix(git): preserve relative paths in git_submodule_add (#168)#170
MementoRC merged 5 commits into
developmentfrom
fix/submodule-relative-path-168

Conversation

@MementoRC
Copy link
Copy Markdown
Owner

Root Cause

git_submodule_add was writing absolute filesystem paths into .gitmodules and .git/config, producing non-portable repos like:

[submodule "/home/user/repo/sub-packages/remote-iface"]
    path = /home/user/repo/sub-packages/remote-iface

The data flow:

  1. GitLeanInterface._validate_path_parameters enforces an "all params with path in their name must start with /" rule (interface.py:156).
  2. This rejects relative paths with ValueError — it does not coerce them to absolute.
  3. Since callers are forced to pass an absolute path (e.g. /home/user/repo/sub-packages/remote-iface), that absolute value is forwarded verbatim to repo.git.submodule("add", url, path) inside _submodule_ops.py — no os.path.abspath() involved.
  4. Git then writes that absolute path into .gitmodules, breaking portability.

Submodule paths are repo-relative by git's own convention (see gitmodules(5)). The fix introduces a per-tool opt-out rather than weakening the global rule.

Implementation — Strategy A: Per-tool exemption

ToolDefinition (interface.py)

Added optional relative_path_params: set[str] | None field. Parameters in this set bypass the "must be absolute" check while still rejecting empty strings and .. traversal.

_validate_path_parameters (interface.py)

Updated to accept the exemption set. For exempted parameters, only traversal/empty guards run. For all other path parameters, the existing absolute-path requirement is unchanged.

execute_tool_direct (interface.py)

Passes tool_def.relative_path_params to the validator so per-tool exemptions are applied at execution time.

git_submodule_add registration (registry_git.py)

Registered with relative_path_params={"path"}. The repo_path parameter (the repo to operate on) still requires an absolute path.

Tests Added (tests/unit/git/test_submodule_relative_path.py)

  • TestValidatePathParametersExemption — unit-tests the exemption mechanism directly:
    • Exempt param accepts relative path
    • Exempt param still rejects .. (direct and nested)
    • Non-exempt param still requires absolute path
    • No-exemption call rejects relative path
    • Exempt param rejects empty string
  • TestGitSubmoduleAddRelativePath — verifies git_submodule_add passes the relative path verbatim to repo.git.submodule (regression for [bug] git_submodule_add writes absolute path verbatim into .gitmodules and .git/config #168)
  • TestSubmoduleAddViaLeanInterface — end-to-end via execute_tool_direct:
    • Rejects .. traversal in path
    • Rejects relative repo_path (non-exempted)

Closes #168

git_submodule_add was writing ABSOLUTE filesystem paths into .gitmodules
and .git/config because the lean interface's generic "all *path*
parameters must be absolute" validation forced callers to pass absolute
paths, which then propagated verbatim to `git submodule add`. The
result was non-portable repos with entries like:

  [submodule "/home/user/repo/sub-packages/remote-iface"]
      path = /home/user/repo/sub-packages/remote-iface

Submodule paths are repo-relative by git's own convention (see
gitmodules(5)), so this commit introduces a per-tool exemption:
git_submodule_add's `path` parameter now bypasses the absolute-path
requirement while still rejecting `..` and path-traversal attempts.

After the fix:
- Callers pass `path="sub-packages/remote-iface"` (relative)
- The relative path is passed verbatim to `repo.git.submodule(add, ...)`
- .gitmodules entries are portable, matching native git behavior

Tests added:
- Submodule add accepts relative path (regression test for #168)
- Submodule add still rejects `..` traversal
- Validator exemption mechanism unit test
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 12, 2026

Claude finished @MementoRC's task —— View job


Code Review Complete ✅

Todo List:

  • Read and analyze changed files
  • Review code quality and architecture
  • Check for potential bugs and edge cases
  • Evaluate security implications
  • Assess test coverage
  • Provide comprehensive feedback

Summary

This PR provides a well-designed solution to issue #168 by implementing a per-tool exemption mechanism for path validation. The implementation preserves Git's convention that submodule paths should be repo-relative while maintaining strong security for other path parameters.

Code Quality & Architecture ⭐⭐⭐⭐⭐

Excellent design choices:

  • Clean separation of concerns: The exemption mechanism is properly isolated in the ToolDefinition class
  • Backward compatibility: Existing tools continue to work unchanged; only git_submodule_add gets the exemption
  • Clear documentation: Inline comments explain the Git convention and security reasoning (interface.py:154-157)
  • Intuitive API: relative_path_params is self-documenting and type-safe

Security Analysis ⭐⭐⭐⭐⭐

Strong security posture maintained:

  • Path traversal protection preserved: .. components are still rejected even for exempted parameters (interface.py:171)
  • Empty string validation: Still blocks empty paths across all parameters
  • Selective exemption: Only the path parameter for git_submodule_add gets the exemption; repo_path still requires absolute paths
  • Input validation maintained: The existing dangerous character checks in git_submodule_add (_submodule_ops.py:84-89) continue to protect against shell injection

Test Coverage ⭐⭐⭐⭐⭐

Comprehensive test suite:

Potential Issues & Suggestions

Minor: Documentation Enhancement

The PR description is excellent, but consider adding a docstring example to ToolDefinition.__init__ showing how to use relative_path_params:

# Example in interface.py around line 32
def __init__(
    self,
    # ... other params
    relative_path_params: set[str] | None = None,
):
    """
    Args:
        relative_path_params: Parameter names exempt from absolute path requirement.
                             Example: {"path"} for git submodule operations where paths
                             should be repo-relative per Git convention.
    """

Edge Case: Path Normalization

Consider whether paths like ./lib/submod or lib//submod should be normalized. Currently they would be accepted for exempted parameters, which is probably fine but worth documenting the behavior.

Performance Considerations ⭐⭐⭐⭐⭐

No performance concerns. The path validation is O(n) where n is the number of path components, which is negligible for typical use cases.

Recommendation

Strong approval ✅ This is a well-crafted solution that:

  • Fixes the core issue while preserving security
  • Maintains backward compatibility
  • Includes thorough test coverage
  • Documents the design decisions clearly

The implementation demonstrates good software engineering practices and should be merged.


PR #170 reordered _validate_path_parameters so the traversal check
('..' component rejection) runs before the absolute-path check.
As a result, repo_path='..' now raises the traversal error
("Invalid path '..': empty paths and '..' traversal components are
not allowed.") instead of the older "Relative path '..' not supported"
message.

Update test_relative_dotdot_rejected to assert against the new
behavior. The test now confirms both that '..' appears in the message
and that it is rejected for traversal reasons — which is the more
precise, security-aligned diagnosis.

Resolves CI failures in:
- ci / Test Python 3.12 on ubuntu-latest
- ci / Code Quality

Co-Authored-By: MementoRC (https://github.com/MementoRC)
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 12, 2026

Claude finished @MementoRC's task —— View job


Code Review Complete ✅

Todo List:

  • Read and analyze changed files
  • Review code quality and architecture
  • Check for potential bugs and edge cases
  • Evaluate security implications
  • Assess test coverage
  • Provide comprehensive feedback

Summary

This PR provides a well-designed solution to issue #168 by implementing a per-tool exemption mechanism for path validation. The implementation preserves Git's convention that submodule paths should be repo-relative while maintaining strong security for other path parameters.

Code Quality & Architecture ⭐⭐⭐⭐⭐

Excellent design choices:

  • Clean separation of concerns: The exemption mechanism is properly isolated in the ToolDefinition class
  • Backward compatibility: Existing tools continue to work unchanged; only git_submodule_add gets the exemption
  • Clear documentation: Inline comments explain the Git convention and security reasoning (interface.py:154-157)
  • Intuitive API: relative_path_params is self-documenting and type-safe

Security Analysis ⭐⭐⭐⭐⭐

Strong security posture maintained:

  • Path traversal protection preserved: .. components are still rejected even for exempted parameters (interface.py:171)
  • Empty string validation: Still blocks empty paths across all parameters
  • Selective exemption: Only the path parameter for git_submodule_add gets the exemption; repo_path still requires absolute paths
  • Input validation maintained: The existing dangerous character checks in git_submodule_add (_submodule_ops.py:84-89) continue to protect against shell injection

Test Coverage ⭐⭐⭐⭐⭐

Comprehensive test suite:

Potential Issues & Suggestions

Minor: Documentation Enhancement

The PR description is excellent, but consider adding a docstring example to ToolDefinition.__init__ showing how to use relative_path_params:

# Example in interface.py around line 32
def __init__(
    self,
    # ... other params
    relative_path_params: set[str] | None = None,
):
    """
    Args:
        relative_path_params: Parameter names exempt from absolute path requirement.
                             Example: {"path"} for git submodule operations where paths
                             should be repo-relative per Git convention.
    """

Edge Case: Path Normalization

Consider whether paths like ./lib/submod or lib//submod should be normalized. Currently they would be accepted for exempted parameters, which is probably fine but worth documenting the behavior.

Performance Considerations ⭐⭐⭐⭐⭐

No performance concerns. The path validation is O(n) where n is the number of path components, which is negligible for typical use cases.

Recommendation

Strong approval ✅ This is a well-crafted solution that:

  • Fixes the core issue while preserving security
  • Maintains backward compatibility
  • Includes thorough test coverage
  • Documents the design decisions clearly

The implementation demonstrates good software engineering practices and should be merged.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 12, 2026

Claude finished @MementoRC's task —— View job


Code Review Complete ✅

Todo List:

  • Read and analyze changed files
  • Review code quality and architecture
  • Check for potential bugs and edge cases
  • Evaluate security implications
  • Assess test coverage
  • Provide comprehensive feedback

Summary

This PR provides a well-engineered solution to issue #168 by implementing a selective exemption mechanism for path validation. The implementation preserves Git's convention that submodule paths should be repo-relative while maintaining strong security for other path parameters.

Code Quality & Architecture ⭐⭐⭐⭐⭐

Excellent design choices:

  • Clean separation of concerns: The exemption mechanism is properly isolated in the ToolDefinition class
  • Backward compatibility: Existing tools continue to work unchanged; only git_submodule_add gets the exemption
  • Clear documentation: Inline comments explain the Git convention and security reasoning (interface.py:53-58, 171-174)
  • Intuitive API: relative_path_params is self-documenting and type-safe
  • Minimal scope: The exemption is limited to the specific parameter that needs it (path), while repo_path still requires absolute paths

Security Analysis ⭐⭐⭐⭐⭐

Strong security posture maintained:

  • Path traversal protection preserved: .. components are still rejected even for exempted parameters (interface.py:188-192)
  • Empty string validation: Still blocks empty paths across all parameters
  • Selective exemption: Only the path parameter for git_submodule_add gets the exemption; repo_path still requires absolute paths
  • Input validation maintained: The existing dangerous character checks in git_submodule_add (_submodule_ops.py:84-89) continue to protect against shell injection
  • No weakening of global policy: The general path validation remains strict for all other tools

Test Coverage ⭐⭐⭐⭐⭐

Comprehensive test suite added:

  • Unit tests: Direct validation of the exemption mechanism (test_submodule_relative_path.py:32-84)
  • Integration tests: End-to-end testing via execute_tool_direct (test_submodule_relative_path.py:143-176)
  • Edge case coverage: Tests for .. traversal, empty strings, and mixed exemption scenarios
  • Regression protection: Specific test for issue [bug] git_submodule_add writes absolute path verbatim into .gitmodules and .git/config #168 ensures the relative path is passed verbatim to Git
  • Existing tests updated: The lean interface tests were properly updated to reflect the new functionality

Technical Implementation ⭐⭐⭐⭐⭐

Well-implemented changes:

  • interface.py: Clean addition of relative_path_params field with proper documentation and validation logic
  • Validation logic: The path validation correctly handles exemptions while preserving security checks
  • Tool registration: The git_submodule_add tool is properly registered with relative_path_params={"path"} (registry_git.py)
  • No code duplication: The implementation reuses existing validation infrastructure

Potential Issues & Suggestions

Minor: Enhanced Documentation

Consider adding a usage example to the ToolDefinition docstring to clarify how to use relative_path_params:

# Example usage in docstring:
relative_path_params={"path"}  # Allow repo-relative paths for Git submodules

Edge Case: Path Normalization

The current implementation accepts paths like ./lib/submod or lib//submod for exempted parameters. This is probably fine since Git can handle these, but documenting this behavior might be helpful.

Code Style: Parameter Validation Logic

The validation logic at interface.py:202-208 seems to have unreachable code. The condition checks if param_value is in (".", "..") or doesn't start with "/", but this code path only executes for non-path parameters (since path parameters are handled above). This appears to be dead code that could be cleaned up.

Performance Considerations ⭐⭐⭐⭐⭐

No performance concerns. The path validation is O(n) where n is the number of path components, which is negligible for typical use cases. The exemption check is O(1) set lookup.

Recommendation

Strong approval ✅ This is a well-crafted solution that:

  • Fixes the core issue while preserving security
  • Maintains backward compatibility
  • Includes thorough test coverage
  • Documents the design decisions clearly
  • Follows established patterns in the codebase

The implementation demonstrates excellent software engineering practices with careful attention to security, testability, and maintainability.


Addresses minor reviewer feedback on PR #170:
- ToolDefinition class docstring now includes a full Args: section
  documenting relative_path_params with the gitmodules(5) rationale
  and a concrete example (``{"path"}`` for git_submodule_add).
- _validate_path_parameters docstring adds a Note: that paths such as
  ``./lib/submod`` or ``lib//submod`` are NOT normalised here — git
  canonicalises them downstream; we only enforce no-``..`` components
  and non-empty values.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 12, 2026

Claude finished @MementoRC's task —— View job


Code Review Complete ✅

Todo List:

  • Read and analyze changed files
  • Review code quality and architecture
  • Check for potential bugs and edge cases
  • Evaluate security implications
  • Assess test coverage
  • Provide comprehensive feedback

Summary

This PR provides an excellent solution to issue #168 by implementing a selective exemption mechanism for path validation in the Git submodule operations. The implementation allows git_submodule_add to accept repo-relative paths (as per Git convention) while maintaining strong security for all other path parameters.

Code Quality & Architecture ⭐⭐⭐⭐⭐

Excellent design choices:

  • Clean separation of concerns: The relative_path_params field is properly encapsulated in the ToolDefinition class (interface.py:56)
  • Backward compatibility: All existing tools continue to work unchanged; only git_submodule_add gets the exemption
  • Self-documenting: The parameter name relative_path_params clearly communicates its purpose
  • Minimal scope: The exemption is surgical - only the path parameter for git_submodule_add is exempt, while repo_path still requires absolute paths (registry_git.py:399)
  • Excellent documentation: Clear inline comments explain the Git convention and security rationale (interface.py:40-44, 186-194, registry_git.py:396-399)

Security Analysis ⭐⭐⭐⭐⭐

Strong security posture maintained:

  • Path traversal protection preserved: .. components are still rejected for all parameters, including exempted ones (interface.py:206-211)
  • Empty string validation maintained: Empty paths are blocked across all parameters
  • No weakening of global policy: The general "absolute paths only" rule remains strict for non-exempted parameters
  • Selective exemption only: Only the specific path parameter for git_submodule_add gets special treatment
  • Input validation unchanged: The existing dangerous character checks in git_submodule_add continue to provide protection

Test Coverage ⭐⭐⭐⭐⭐

Comprehensive test suite:

  • Unit tests for exemption mechanism: Direct validation of _validate_path_parameters with exemption sets (test_submodule_relative_path.py:32-84)
  • Function-level tests: Tests ensuring git_submodule_add passes relative paths verbatim to Git (test_submodule_relative_path.py:90-137)
  • Integration tests: End-to-end testing via execute_tool_direct (test_submodule_relative_path.py:143-176)
  • Edge case coverage: Tests for .. traversal, empty strings, and mixed exemption scenarios
  • Regression protection: Specific test for issue [bug] git_submodule_add writes absolute path verbatim into .gitmodules and .git/config #168 ensures relative paths are preserved

Technical Implementation ⭐⭐⭐⭐⭐

Well-implemented changes:

  • Clean API design: The relative_path_params parameter follows Python conventions and is properly typed
  • Efficient validation: The exemption check uses set lookup for O(1) performance (interface.py:202)
  • Proper tool registration: git_submodule_add correctly registered with relative_path_params={"path"} (registry_git.py:399)
  • Consistent error handling: Validation errors provide clear, helpful messages

Potential Issues & Suggestions

Minor: Enhanced Code Documentation

Consider adding a docstring example to the ToolDefinition class showing usage:

# In ToolDefinition.__init__ docstring:
relative_path_params: Set of parameter names whose path-shaped values 
    are allowed to be repo-relative. Example: {"path"} for git_submodule_add
    where paths should be relative per gitmodules(5) convention.

Code Quality: Unreachable Code

Lines interface.py:221-227 appear unreachable since the code path only executes for non-path parameters, but the condition checks path-related values. This may be dead code that could be cleaned up in a future refactor.

Edge Case: Path Normalization

The implementation accepts paths like ./lib/submod or lib//submod for exempted parameters. This is probably fine since Git handles normalization, but documenting this behavior would be helpful.

Performance Considerations ⭐⭐⭐⭐⭐

No performance concerns. The path validation logic is efficient with O(1) set lookups and O(n) path component checks where n is the number of path segments.

Recommendation

Strong approval ✅ This is an exemplary implementation that:

  • ✅ Fixes the core issue while preserving security
  • ✅ Maintains perfect backward compatibility
  • ✅ Includes thorough test coverage with regression protection
  • ✅ Documents design decisions clearly
  • ✅ Follows established patterns in the codebase
  • ✅ Demonstrates excellent software engineering practices

The solution is well-architected, secure, and maintainable. It addresses the Git convention requirement (repo-relative submodule paths) without compromising the overall security model.


_validate_path_parameters had a dead second-pass block that iterated
through every parameter (not just path ones) and rejected any value not
starting with '/'. This caused four CI failures on PR #170:

- test_multiple_params_with_one_invalid_path: the outer block caught
  ``other_param='value'`` before the path-aware branch reached
  ``another_path='relative/bad'``, so the assertion on 'relative/bad'
  failed.
- test_non_path_params_ignored: ``branch_name='main'`` and similar
  non-path strings were rejected with 'Relative path' errors.
- test_path_param_with_non_string_value_ignored: the fallback called
  ``.startswith('/')`` on an int, raising AttributeError.
- test_submodule_add_rejects_path_traversal: the URL value (not a path
  param) was rejected first, masking the expected traversal error on
  ``path='../escape'``.

Fix: collapse to a single guarded branch. Skip any parameter that is
not a string or whose name does not contain 'path'. For string path
params, always reject empty / '..' traversal, then require absolute
unless the param is in the per-tool exempt set (e.g. submodule_add's
'path').

This preserves the exemption mechanism introduced for issue #168 and
restores correct behavior for non-path params and non-string values.

Co-Authored-By: MementoRC (https://github.com/MementoRC)
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 12, 2026

Claude finished @MementoRC's task —— View job


Code Review Complete ✅

Todo List:

  • Read and analyze changed files
  • Review code quality and architecture
  • Check for potential bugs and edge cases
  • Evaluate security implications
  • Assess test coverage
  • Provide comprehensive feedback

Summary

This PR provides an excellent, well-engineered solution to issue #168 by implementing a selective exemption mechanism for path validation. The implementation preserves Git's convention that submodule paths should be repo-relative while maintaining strong security for all other path parameters throughout the system.

Code Quality & Architecture ⭐⭐⭐⭐⭐

Outstanding design choices:

  • Clean separation of concerns: The relative_path_params field is properly encapsulated in the ToolDefinition class (interface.py:56) with clear purpose and scope
  • Backward compatibility: All existing tools continue to work unchanged; only git_submodule_add receives the exemption
  • Self-documenting: The parameter name relative_path_params clearly communicates its purpose
  • Minimal scope: The exemption is surgical - only the path parameter for git_submodule_add is exempt, while repo_path still requires absolute paths (registry_git.py:399)
  • Excellent documentation: Clear inline comments explain the Git convention and security rationale throughout:
    • interface.py:40-44: Purpose and examples
    • interface.py:186-194: Technical implementation details
    • registry_git.py:396-399: Usage justification
  • Type safety: Proper typing with set[str] | None and defensive defaults

Security Analysis ⭐⭐⭐⭐⭐

Exemplary security posture maintained:

  • Path traversal protection preserved: .. components are still rejected for all parameters, including exempted ones (interface.py:212-216)
  • Empty string validation maintained: Empty paths are blocked across all parameters
  • No weakening of global policy: The general "absolute paths only" rule remains strict for non-exempted parameters (interface.py:220-225)
  • Selective exemption only: Only the specific path parameter for git_submodule_add gets special treatment
  • Input validation unchanged: The existing dangerous character checks in git_submodule_add continue to provide protection
  • Clear security boundaries: The validation logic clearly separates exempt vs non-exempt parameters with detailed error messages

Test Coverage ⭐⭐⭐⭐⭐

Comprehensive test suite demonstrates thorough engineering:

  • Unit tests for exemption mechanism: Direct validation of _validate_path_parameters with exemption sets (test_submodule_relative_path.py:32-84)
  • Function-level tests: Tests ensuring git_submodule_add passes relative paths verbatim to Git (test_submodule_relative_path.py:90-137)
  • Integration tests: End-to-end testing via execute_tool_direct (test_submodule_relative_path.py:143-176)
  • Edge case coverage: Tests for .. traversal, empty strings, and mixed exemption scenarios
  • Regression protection: Specific test for issue [bug] git_submodule_add writes absolute path verbatim into .gitmodules and .git/config #168 ensures relative paths are preserved
  • Boundary testing: Verifies both exempt and non-exempt parameters behave correctly
  • Updated existing tests: The lean interface tests were properly updated to reflect the new functionality

Technical Implementation ⭐⭐⭐⭐⭐

Well-implemented changes across the codebase:

  • Clean API design: The relative_path_params parameter follows Python conventions and is properly typed
  • Efficient validation: The exemption check uses set lookup for O(1) performance (interface.py:202)
  • Proper tool registration: git_submodule_add correctly registered with relative_path_params={"path"} (registry_git.py:399)
  • Consistent error handling: Validation errors provide clear, helpful messages that explain the security rationale
  • No code duplication: The implementation reuses existing validation infrastructure elegantly
  • Defensive programming: Proper defaults and null checks throughout

Performance Considerations ⭐⭐⭐⭐⭐

No performance concerns. The path validation logic is efficient with:

  • O(1) set lookups for exemption checks
  • O(n) path component checks where n is the number of path segments (minimal overhead)
  • No impact on non-path parameters

Potential Minor Improvements

1. Enhanced Documentation

Consider adding a usage example to the ToolDefinition class docstring:

# In ToolDefinition.__init__ docstring:
relative_path_params: Set of parameter names whose path-shaped values 
    are allowed to be repo-relative. Example: {"path"} for git_submodule_add
    where paths should be relative per gitmodules(5) convention.

2. Edge Case: Path Normalization

The implementation accepts paths like ./lib/submod or lib//submod for exempted parameters. This is probably fine since Git handles normalization, but documenting this behavior would be helpful for future maintainers.

3. Code Style: Validation Logic

The validation logic is well-structured, though the comment at interface.py:191-194 could be slightly clearer about the normalization behavior mentioned above.

Security Deep Dive

The implementation demonstrates excellent security engineering:

  1. Defense in Depth: Multiple validation layers prevent different attack vectors
  2. Fail-Safe Defaults: The exemption set defaults to empty, requiring explicit opt-in
  3. Clear Security Boundaries: Exempt vs non-exempt parameters are clearly separated
  4. Detailed Error Messages: Help legitimate users while not revealing internal structure
  5. Selective Exemption: Only the minimum necessary parameter gets relaxed validation

Recommendation

Strong approval ✅ This is an exemplary implementation that demonstrates:

  • ✅ Fixes the core issue while preserving security
  • ✅ Maintains perfect backward compatibility
  • ✅ Includes thorough test coverage with regression protection
  • ✅ Documents design decisions clearly with proper rationale
  • ✅ Follows established patterns in the codebase
  • ✅ Demonstrates excellent software engineering practices
  • ✅ Shows careful attention to security implications
  • ✅ Provides clear error messages for debugging

The solution elegantly addresses the Git convention requirement (repo-relative submodule paths) without compromising the overall security model. The per-tool exemption approach is architecturally sound and could be extended to other similar cases in the future if needed.

This is production-ready code that demonstrates mature software engineering practices.


@MementoRC MementoRC merged commit 8ec9a2a into development May 13, 2026
16 checks passed
@MementoRC MementoRC deleted the fix/submodule-relative-path-168 branch May 13, 2026 01:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] git_submodule_add writes absolute path verbatim into .gitmodules and .git/config

1 participant