Skip to content
This repository was archived by the owner on Oct 28, 2026. It is now read-only.

Add bulk checkout selection for core upgrades - #27

Merged
Zippybonzo merged 1 commit into
mainfrom
claude/extension-skin-version-deploy-n4pt0l
Aug 12, 2026
Merged

Zippybonzo merged 1 commit into
mainfrom
claude/extension-skin-version-deploy-n4pt0l

Conversation

@Zippybonzo

@Zippybonzo Zippybonzo commented Aug 12, 2026 •

Copy link
Copy Markdown
Member

Summary

Adds a new bulk selection component (BulkCheckoutSelect) to the deployment wizard that allows operators to select every checkout of one type (e.g., all extensions) in a single core version and assign them all to one ref in a single action. This significantly improves the UX for core upgrades, which typically involve selecting dozens of extensions at once.

Key Changes

  • New BulkCheckoutSelect.vue component: Provides a streamlined interface to select all checkouts of a given type in a specific core version and optionally assign them a common ref. The component:

    • Filters available types and versions based on what's actually offered
    • Defaults to "extensions" when available (the most common upgrade case)
    • Supports selecting "every version" when multiple versions are available
    • Validates that unpinned floating checkouts have a ref provided
    • Emits apply and clear events to update the parent selection
  • Updated CheckoutPicker.vue:

    • Integrates the new bulk selector above the per-repository rows
    • Refactored ref selection logic into a reusable choiceFor() function that intelligently determines ref type (commit vs branch) based on the ref value
    • Added applyBulk() and clearBulk() handlers to apply bulk selections to the model
    • Updated component documentation to explain the relationship between bulk selection and per-row editing
  • Enhanced StoreDeploymentRequest validation:

    • Moved existence checking from per-item rules to withValidator() to avoid N+1 queries when submitting bulk selections (100+ items)
    • Added explicit error message when a checkout no longer exists
    • Improved robustness of item iteration to handle edge cases
  • Added test coverage: New tests verify that bulk selections work correctly and that non-existent checkouts are properly rejected

Implementation Details

  • The bulk selector only sets rows in the existing selection—nothing is hidden. Every checkout it selects appears below as an editable row with its own ref, allowing per-row corrections.
  • Branches are not pre-loaded for bulk selections (avoiding 100+ git calls), but individual rows can load their own refs on demand.
  • The ref type is intelligently inferred: SHA-like strings are treated as commits, everything else as branches.
  • The component respects the deploy/undeploy intent and adjusts its UI accordingly.

https://claude.ai/code/session_01EnxYdUnn47SEpPUC26ZVJE

Summary by CodeRabbit

  • New Features

    • Select all extensions or skins for a chosen core version, or across every version.
    • Assign a shared ref while keeping selected repositories individually editable.
    • Review all deployment actions before execution, with selection counts and ref warnings.
  • Bug Fixes

    • Improved validation for missing or invalid repository-version selections.
    • Prevented malformed selections from causing duplicate or unclear errors.
    • Preserved existing checkout pins when no new ref is provided.
  • Documentation

    • Added guidance for the core-upgrade workflow.

A core upgrade is one sentence — "put 1.46 on REL1_46" — and the wizard made
you say it a hundred times, once per extension row, with the ref retyped each
time. The per-repository "all versions" toggle covers the other axis; this adds
the one an upgrade actually needs.

BulkCheckoutSelect sits above the picker: name a type, a core version and a ref,
and it ticks every checkout that matches. It only writes rows into the selection
the picker already owns, so each one still appears below with its own editable
ref, and the review step still lists every Salt call before anything runs. A
blank ref keeps each checkout's pin, and the panel says how many of the matched
checkouts have no pin to fall back on rather than letting the server refuse the
whole submission later.

The version and type lists are derived from the checkouts the wizard offered, so
a repository the operator may not touch is not selectable in bulk either.

Existence of a line item's checkout now comes from the single query that already
loads them instead of a per-item `exists` rule: a hundred-odd line items is the
normal case now, and a rule per item is a query per item. The refusal names the
offending row the same way, and says what is wrong with it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EnxYdUnn47SEpPUC26ZVJE
@coderabbitai

coderabbitai Bot commented Aug 12, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d84d7f93-6061-479c-8945-6abcf5f7754f

📥 Commits

Reviewing files that changed from the base of the PR and between b267baf and f237ded.

📒 Files selected for processing (5)
  • README.md
  • app/Http/Requests/StoreDeploymentRequest.php
  • resources/js/apps/deployments/components/BulkCheckoutSelect.vue
  • resources/js/apps/deployments/components/CheckoutPicker.vue
  • tests/Feature/WizardAndPermissionsTest.php

📝 Walkthrough

Walkthrough

The deployment wizard now supports bulk selection of extensions or skins by core version, shared ref assignment with individual editing, and validation against resolved checkout records.

Changes

Bulk checkout deployment flow

Layer / File(s) Summary
Bulk checkout selection UI
resources/js/apps/deployments/components/BulkCheckoutSelect.vue, resources/js/apps/deployments/components/CheckoutPicker.vue, README.md
The wizard selects checkout groups by type and core version, applies or clears refs, preserves individual entries, and documents the workflow.
Resolved checkout validation
app/Http/Requests/StoreDeploymentRequest.php, tests/Feature/WizardAndPermissionsTest.php
Deployment validation checks submitted IDs against resolved checkouts and rejects missing or malformed line items. Feature tests cover shared refs and nonexistent checkout IDs.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant CheckoutPicker
  participant BulkCheckoutSelect
  participant StoreDeploymentRequest
  participant Deployment
  Operator->>BulkCheckoutSelect: choose checkout type and core version
  BulkCheckoutSelect->>CheckoutPicker: apply selected checkouts and shared ref
  CheckoutPicker->>CheckoutPicker: update individual checkout entries
  Operator->>StoreDeploymentRequest: submit deployment
  StoreDeploymentRequest->>StoreDeploymentRequest: validate IDs against resolved checkouts
  StoreDeploymentRequest->>Deployment: create deployment
Loading

Possibly related PRs

  • WikiOasis/mw-deploy#2: Introduced the deployment wizard and CheckoutPicker selection flow extended by this change.

Suggested reviewers: claude

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/extension-skin-version-deploy-n4pt0l

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 PHPStan (2.2.7)

Composer install failed: this project depends on private packages that require authentication (e.g. GitLab/GitHub, Laravel Nova, etc.).
CodeRabbit tooling environment cannot access private registries.
If your project requires private packages, disable the PHPStan tool in your coderabbit settings.

Instead, run PHPStan in a CI/CD pipeline where you can use custom packages — our pipeline remediation tool can use the PHPStan output from your CI/CD pipeline.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Zippybonzo
Zippybonzo merged commit 11b7deb into main Aug 12, 2026
3 of 4 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants