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

2 participants