Skip to content

cli: one project-resolution story — single name precedence, no swallowed load error, strict service validation - #14151

Open
ndeloof wants to merge 1 commit into
docker:mainfrom
ndeloof:f4-project-resolution
Open

cli: one project-resolution story — single name precedence, no swallowed load error, strict service validation#14151
ndeloof wants to merge 1 commit into
docker:mainfrom
ndeloof:f4-project-resolution

Conversation

@ndeloof

@ndeloof ndeloof commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Epic #14074, F.4, per the agreed behavior:

One name precedence (Q1), documented on both resolvers and applied identically by compose-go while loading: --project-name > COMPOSE_PROJECT_NAME > the model's name. projectOrName and toProjectName used to disagree.

Explicit failure policy (Q2.c) — projectOrName used to swallow any load error when COMPOSE_PROJECT_NAME was set, silently sending stop/down/ps… into label-based reconstruction, even for an explicit --file:

  • unreadable explicit --file → hard error;
  • no compose file around + COMPOSE_PROJECT_NAME → the normal file-less workflow, silent;
  • present-but-broken implicit file + COMPOSE_PROJECT_NAME → label-based fallback with a warning.

Strict service validation whenever a model is available (Q3): restart and wait no longer silently no-op on a typo (profile-disabled services remain legitimate targets); the hand-rolled checks in ps/volumes are removed as dead code — load-time selection already rejects unknown names (pinned by test).

Behavioral changes: restart/wait on an unknown service now error; a broken explicit --file now errors instead of silently falling back; a broken implicit file now warns. Unit tests cover the full resolution matrix.

🤖 Generated with Claude Code

…wed load error, strict service validation

projectOrName and toProjectName resolved the project with opposite
precedences, and projectOrName silently swallowed any load error when
COMPOSE_PROJECT_NAME was set: a broken compose file sent stop, down,
ps... into label-based reconstruction without a word — even when the
file was named explicitly with --file.

One precedence now, documented on both resolvers and applied
identically by compose-go while loading: --project-name, then
COMPOSE_PROJECT_NAME, then the model's name. The failure policy
becomes explicit: an unreadable explicit --file is a hard error; no
file around with COMPOSE_PROJECT_NAME set stays the silent file-less
workflow; a present-but-broken implicit file falls back to label-based
mode with a warning.

Service-name validation follows one rule — strict whenever a model is
available: restart and wait no longer silently no-op on a typo
(validateServiceNames, profile-disabled services remain legitimate
targets), and the hand-rolled checks in ps and volumes are removed as
dead code, the load-time selection already rejecting unknown names
(pinned by test).

Epic docker#14074, F.4.

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>

@docker-agent docker-agent left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Assessment: 🟢 APPROVE

The PR is well-structured and implements the described behavior correctly:

  • Name precedence (--project-name > COMPOSE_PROJECT_NAME > model name) is applied consistently through the refactored projectOrName and toProjectName.
  • Error handling for explicit --file failures (hard error), missing files with env name (silent), and broken implicit files with env name (warning + fallback) is correct and clearly documented.
  • validateServiceNames correctly handles the nil-project case (label-based mode has no manifest to validate against) and covers profile-disabled services as legitimate targets.
  • The removal of hand-rolled service checks in ps.go and volumes.go is safe: ToProject service-selection already rejects unknowns at load time when a model is available.
  • The new test file covers the full resolution matrix with t.Context() and clearly-named subtests.

@codecov

codecov Bot commented Aug 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 71.42857% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
cmd/compose/restart.go 0.00% 1 Missing and 1 partial ⚠️
cmd/compose/wait.go 33.33% 1 Missing and 1 partial ⚠️
cmd/compose/ps.go 0.00% 0 Missing and 1 partial ⚠️
cmd/compose/volumes.go 0.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

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.

2 participants