Skip to content

feat(extensions): add --force flag to extension add for overwrite reinstall#2530

Open
grissiom wants to merge 2 commits into
github:mainfrom
grissiom:feat/extension-add-force
Open

feat(extensions): add --force flag to extension add for overwrite reinstall#2530
grissiom wants to merge 2 commits into
github:mainfrom
grissiom:feat/extension-add-force

Conversation

@grissiom
Copy link
Copy Markdown

feat(extensions): add --force flag to extension add for overwrite reinstall

Add --force support to specify extension add that allows overwriting an already-installed extension without manually removing it first.

  • install_from_directory() and install_from_zip() accept force=True, automatically calling remove() before installation
  • The --force CLI flag works with all install modes (--dev, --from URL, bundled, and catalog)
  • Config files (*-config.yml) are preserved across force reinstall
  • Error message suggests --force when extension is already installed
  • 6 new tests covering unit and CLI force reinstall flows

Description

If the extension is updated, --force could eliminate the remove/install loop and simplify the workflow.

Testing

  • Tested locally with uv run specify --help
  • Ran existing tests with uv sync && uv run pytest
  • Tested with a sample project (if applicable)

AI Disclosure

  • I did not use AI assistance for this contribution
  • I did use AI assistance (describe below)

Generated by Copilot(model: DeepSeek-V4).

…nstall

Add --force support to `specify extension add` that allows overwriting
an already-installed extension without manually removing it first.

- install_from_directory() and install_from_zip() accept force=True,
  automatically calling remove() before installation
- The --force CLI flag works with all install modes (--dev, --from URL,
  bundled, and catalog)
- Config files (*-config.yml) are preserved across force reinstall
- Error message suggests --force when extension is already installed
- 6 new tests covering unit and CLI force reinstall flows
@grissiom grissiom requested a review from mnriem as a code owner May 12, 2026 15:26
@mnriem mnriem requested a review from Copilot May 12, 2026 16:27
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds --force support to specify extension add so users can overwrite/reinstall an already-installed extension in one step, while preserving *-config.yml files across the reinstall.

Changes:

  • Add force parameter to ExtensionManager.install_from_directory() / install_from_zip() and plumb --force through the CLI.
  • Preserve extension config files across force reinstalls via .specify/extensions/.backup/<ext_id> restore logic.
  • Add unit + CLI tests for force reinstall behavior and updated duplicate-install error messaging.
Show a summary per file
File Description
src/specify_cli/extensions.py Implements force reinstall path, updated duplicate install error text, and config backup restore.
src/specify_cli/__init__.py Adds --force flag to specify extension add and passes it through to install routines.
tests/test_extensions.py Adds tests for force reinstall flows (directory/zip) and CLI coverage for extension add --dev --force.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 3/3 changed files
  • Comments generated: 3

Comment thread src/specify_cli/extensions.py Outdated
Comment thread src/specify_cli/extensions.py
Comment thread tests/test_extensions.py Outdated
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented May 12, 2026

Please address Copilot feedback

- Remove unused `backup_config_dir` variable assignment (Ruff F841)
- Defer `remove()` until after `_validate_install_conflicts()` to prevent
  data loss if validation fails mid-reinstall
- Use `TemporaryDirectory` instead of `NamedTemporaryFile` in ZIP test
  to avoid Windows file-locking failures
@grissiom
Copy link
Copy Markdown
Author

@mnriem fixed the 3 comments, please review it again. Thanks~

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 1

Comment on lines +1208 to +1212
# Restore config files from backup when reinstalling with --force
if force:
backup_config_dir = self.extensions_dir / ".backup" / manifest.id
if backup_config_dir.exists():
for cfg_file in backup_config_dir.iterdir():
Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

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.

3 participants