{"record":{"id":"d56fe8f1a8b245b9","repo":"dagger/dagger","slug":"resolve-latest-git-release-q-w","errorCode":null,"errorMessage":"resolve latest git release %q: %w","messagePattern":"resolve latest git release %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/git.go","lineNumber":129,"sourceCode":"\t}\n\tif bestRef == \"\" && tagPrefix != \"\" {\n\t\tbestRef, err = selectLatestGitRelease(remote, \"\")\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif bestRef == \"\" {\n\t\tref, err := remote.Lookup(\"HEAD\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"resolve git remote HEAD: %w\", err)\n\t\t}\n\t\treturn ref, nil\n\t}\n\n\tref, err := remote.Lookup(bestRef)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve latest git release %q: %w\", bestRef, err)\n\t}\n\treturn ref, nil\n}\n\nfunc selectLatestGitRelease(\n\tremote *gitutil.Remote,\n\ttagPrefix string,\n) (string, error) {\n\tcandidates := make([]releaseTagCandidate, 0, len(remote.Tags().Refs))\n\trefs := map[string]string{}\n\tfor _, ref := range remote.Tags().Refs {\n\t\tversion := ref.ShortName()\n\t\tif tagPrefix != \"\" {\n\t\t\tvar ok bool\n\t\t\tversion, ok = strings.CutPrefix(version, tagPrefix)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/core/git.go#L111-L147","documentation":"This error wraps a failure to look up the best-matching release ref on the git remote after a release tag was selected. The library throws it because remote.Lookup(bestRef) failed even though the tag name was determined from the remote's tag listing — a race or permission anomaly.","triggerScenarios":"SelectLatestGitRefWithTagPrefix picked bestRef from the tag list, then remote.Lookup(bestRef) errored — e.g. the tag was deleted concurrently, or the listing and lookup see different views (auth scopes, shallow fetch).","commonSituations":"Tag deleted between listing and lookup; credentials allow listing but not fetching a specific ref; transient network failure; mirrored repo missing the ref.","solutions":["Retry the operation — often transient (deleted-then-restored tag, network blip)","Inspect the wrapped error to distinguish auth vs missing-ref","Verify the tag still exists on the remote: git ls-remote --tags origin <bestRef>","Check credentials/permissions allow fetching tags, not just listing"],"exampleFix":"// before\nref, err := remote.Lookup(bestRef)\nif err != nil { return nil, err }\n// after\nref, err := remote.Lookup(bestRef)\nif err != nil {\n    return nil, retryOnce(func() (*gitutil.Ref, error) { return remote.Lookup(bestRef) })\n}","handlingStrategy":"retry","validationCode":"out, err := exec.Command(\"git\", \"ls-remote\", \"--tags\", remoteURL, bestRef).Output()\nif err != nil || len(out) == 0 {\n    return nil, fmt.Errorf(\"tag %s missing or unfetchable\", bestRef)\n}","typeGuard":null,"tryCatchPattern":"ref, err := SelectLatestGitRef(remote)\nif err != nil {\n    if strings.Contains(err.Error(), \"resolve latest git release\") {\n        // tag may have vanished or transient failure; retry once\n        time.Sleep(time.Second)\n        ref, err = SelectLatestGitRef(remote)\n    }\n    if err != nil { return err }\n}","preventionTips":["Retry transient lookup failures with backoff","Avoid deleting tags while consumers resolve latest releases","Ensure credentials permit fetching tags, not just listing","Prefer immutable release tags in CI pipelines"],"tags":["git","network","remote","tags","race-condition"],"backgroundTag":"git-ref-lookup-failed","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"}