feat(extensions): port git extension scripts to Python#3400
Merged
Conversation
Ports git-common, initialize-repo, auto-commit, and create-new-feature-branch to extensions/git/scripts/python/, mirroring the bash/PowerShell twins. Parity tests run each bash script and its Python twin in identical projects and compare output, exit codes, and resulting git state. Fixes github#3282 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR adds Python equivalents for the extensions/git workflow scripts, aiming to preserve behavior while reducing dual-maintenance across bash/PowerShell. It also introduces a parity-focused test suite to validate the Python ports against the existing bash implementations.
Changes:
- Added Python ports for
create-new-feature-branch,initialize-repo,auto-commit, and shared git helpers. - Introduced a parity test suite that runs bash vs Python “twin projects” and compares outcomes.
- Added unit tests for
git_common.pyhelper behavior.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/extensions/git/test_git_extension_python_parity.py | Adds parity tests (bash vs Python) plus unit tests for git_common.py. |
| extensions/git/scripts/python/git_common.py | Implements git detection + feature-branch validation helpers. |
| extensions/git/scripts/python/initialize_repo.py | Initializes a repo and makes an initial commit using optional config-driven message. |
| extensions/git/scripts/python/auto_commit.py | Parses git-config.yml auto-commit settings and commits changes per event. |
| extensions/git/scripts/python/create_new_feature_branch.py | Implements feature-branch naming/numbering/template logic and branch creation, mirroring bash behavior. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
An unreadable config file raised OSError with a full traceback from _parse_auto_commit_config. Treat it like a missing config: auto-commit stays disabled. Covered by a chmod-000 test (skipped on non-POSIX and as root). _assert_parity now also compares stderr so warning or usage-text regressions between the bash and Python twins fail the suite. All existing parity tests pass with the stricter assertion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…utside-repo callers Without script_file, core.get_repo_root() falls back to Path.cwd() when SPECIFY_INIT_DIR is unset and no .specify root is found upward — the bash twin instead falls back to the script's install location (.specify/scripts/...). Pass script_file so both twins resolve the same repo_root; TypeError fallback keeps older cores working. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…back - Catch (OSError, UnicodeDecodeError) when reading git-config.yml in create_new_feature_branch.py, initialize_repo.py, and auto_commit.py so invalid UTF-8 config falls back to defaults instead of crashing with a traceback. - Fall back to USERNAME (then "unknown") when USER is unset when deriving the branch author token, matching the PowerShell twin's Windows-friendly fallback chain. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@copilot review |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@copilot review |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@copilot review |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@copilot review |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@copilot review |
mnriem
approved these changes
Jul 14, 2026
Collaborator
|
Thank you! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #3282 — part of #3277. Last script port in the porting phase:
extensions/git/scripts/{bash,powershell}/now has Python twins inextensions/git/scripts/python/.Changes
git_common.py—has_git,effective_branch_name,check_feature_branch(port of git-common.sh)initialize_repo.py— repo init with configurable initial commit messageauto_commit.py— per-event auto-commit, mirroring the line-based git-config.yml parser including the default/explicit-false precedence rulescreate_new_feature_branch.py— full port: slug generation with stop-word filtering and acronym handling, sequential numbering across specs/local branches/remote refs,branch_template/branch_prefixwith scoped numbering,GIT_BRANCH_NAMEoverride, 244-byte truncation,SPECIFY_INIT_DIRvia the corecommon.pyresolver (same refusal as bash when core scripts are missing)Same conventions as the merged check-prerequisites PoC and the #3280/#3281 ports: stdlib only, standalone scripts, no runtime wiring changes.
Testing
43 new tests in
tests/extensions/git/test_git_extension_python_parity.py. The parity tests run each bash script and its Python twin in identical twin projects and assert matching stdout, exit codes, stderr, and resulting git state (branches created, commit messages). Covers branch creation and commit behavior per the issue's acceptance criteria, plus template validation errors, existing-branch handling, and no-git degradation.uv run pytest tests/extensions/git/— 97 passeduvx ruff check— cleanChecklist