{"record":{"id":"722e22cdbcb2d194","repo":"dagger/dagger","slug":"ref-must-not-be-empty","errorCode":null,"errorMessage":"ref must not be empty","messagePattern":"ref must not be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cmd/dagger/main.go","lineNumber":545,"sourceCode":"\t}\n\texecArgs := append([]string{binPath}, args...)\n\tif err := execCLI(binPath, execArgs, env); err != nil {\n\t\treturn fmt.Errorf(\"exec experimental release CLI: %w\", err)\n\t}\n\treturn nil\n}\n\nfunc xReleaseReleaseRef(ref string) (downloadRef string, engineRef string, ok bool) {\n\tmaybeTag := strings.TrimPrefix(ref, \"v\")\n\tif !semver.IsValid(\"v\" + maybeTag) {\n\t\treturn \"\", \"\", false\n\t}\n\treturn maybeTag, \"v\" + maybeTag, true\n}\n\nfunc resolveXReleaseRef(ctx context.Context, ref string) (string, bool, error) {\n\tif ref == \"\" {\n\t\treturn \"\", false, fmt.Errorf(\"ref must not be empty\")\n\t}\n\tif len(ref) == 40 {\n\t\treturn strings.ToLower(ref), false, nil\n\t}\n\n\tcommitURL := githubCommitAPI + url.PathEscape(ref)\n\treq, err := http.NewRequestWithContext(ctx, http.MethodGet, commitURL, nil)\n\tif err != nil {\n\t\treturn \"\", false, fmt.Errorf(\"create GitHub commit request: %w\", err)\n\t}\n\tresp, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\treturn \"\", false, fmt.Errorf(\"resolve git ref from GitHub: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\tif resp.StatusCode != http.StatusOK {\n\t\tbody, _ := io.ReadAll(io.LimitReader(resp.Body, 1024))\n\t\treturn \"\", false, fmt.Errorf(\"resolve git ref from GitHub: %s: %s\", resp.Status, strings.TrimSpace(string(body)))","sourceCodeStart":527,"sourceCodeEnd":563,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/internal/cmd/dagger/main.go#L527-L563","documentation":"A plain sentinel error returned by resolveXReleaseRef when the ref string is empty. execXRelease should never pass an empty ref (it trims xRelease first), so this guards against empty input slipping through to the GitHub API path.","triggerScenarios":"Call resolveXReleaseRef with ref == \"\" at main.go:545 — only reachable if xRelease trimming yields an empty string (e.g. x-release flag set to whitespace only).","commonSituations":"Passing `dagger x-release \"  \"` or an environment-driven value that is blank/whitespace.","solutions":["Provide a non-empty ref: a v-tag, commit SHA, branch, or PR ref.","Check shell variables feeding the flag (e.g. $DAGGER_REF) are actually set."],"exampleFix":"// before\nDAGGER_REF=\"\"; dagger x-release \"$DAGGER_REF\"\n// after\ndagger x-release v0.15.0","handlingStrategy":"validation","validationCode":"ref := strings.TrimSpace(os.Getenv(\"DAGGER_REF\"))\nif ref == \"\" { return errors.New(\"x-release ref is empty; set DAGGER_REF or pass it explicitly\") }","typeGuard":null,"tryCatchPattern":"if err := execXRelease(ctx, ref, args); err != nil && strings.Contains(err.Error(), \"ref must not be empty\") { /* prompt for a valid ref */ }","preventionTips":["Never pass whitespace-only values to x-release.","Check that shell variables feeding the ref are non-empty before invoking.","Quote arguments in scripts to catch accidental empty expansions early."],"tags":["cli","validation","release"],"backgroundTag":"empty-required-argument","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}