← Back to issue list

Incorrect metadata for `application/x.go.module.git-repo` (parsing `go.mod`)

View original Github issue

Metadata

Project
fetch-service
Number
#381
Type
issue
State
open
Author
Vyom-Yadav
Labels
Created
Updated
Closed

Current evaluation

Go module git-repo metadata parsing bug: manual go.mod parsing produces incorrect name/vendor fields. Issue is 510 days old with no maintainer triage or labels.

Suggested action: needs triage

Reason: The issue has no labels, no maintainer response (only an auto-generated Jira sync comment), and no assignee after 510 days. The bug is valid—the code at inspectors/gomod/go_module_git.go lines 184-217 uses naive string matching to parse go.mod instead of golang.org/x/mod/modfile, causing incorrect name/vendor extraction (e.g., splitting module path into vendor/name instead of using the full module path as the name).

Impact: 50 Quick Win: 30.0 Staleness: 75 Complexity: 40 Confidence: 70 Support Request: 15

Issue body

Before going into the parsing bug. **Fetch service shouldn't parse `go.mod` and `go.sum` as that essentially goes against the idea of a proxy service.** Many build pipelines run `go mod tidy` which can potentially update the `go.mod` and `go.sum`, so parsing them isn't full proof and actual artifacts downloaded during the build should be present rather than relying on a potentially outdated lock file. ### Bug Description The metadata parsing is incorrect for `application/x.go.module.git-repo`. ```json { "artifact-metadata-version": "0.1", "request-inspection": { "craft.rockcraft": { "opinion": "Pending", "reason": "valid URL for rockcraft download" }, "craft.snapcraft": { "opinion": "Pending", "reason": "valid URL for snapcraft download" }, "craft.sourcecraft": { "opinion": "Pending", "reason": "valid URL for sourcecraft download" }, "git.upload-pack": { "opinion": "Pending", "reason": "valid URL for git upload-pack", "annotations": { "client-request": [ "command=fetch", "agent=git/2.43.0", "", "thin-pack", "no-progress", "include-tag", "ofs-delta", "deepen 1", "want 452bdf49c8b34e026352ec988055190f60b5d2c5", "done" ], "command": "fetch", "is-shallow": true, "num-wants": 1, "project": "bowenfan-text", "protocol": "version=2", "repository": "https://git.staging.snapcraftcontent.com:443/ubuntu/public/sourcecraft/bowenfan-text", "server": "git.staging.snapcraftcontent.com", "wants": [ "452bdf49c8b34e026352ec988055190f60b5d2c5" ] } } }, "response-inspection": { "craft.rockcraft": { "opinion": "Unknown", "reason": "git repository does not contain a rockcraft.yaml file" }, "craft.snapcraft": { "opinion": "Unknown", "reason": "git repository does not contain a snapcraft.yaml file" }, "craft.sourcecraft": { "opinion": "Approved", "reason": "sourcecraft repository found" }, "git.upload-pack": { "opinion": "Unknown", "reason": "git fetch response is valid but content is unknown", "annotations": { "git-checkout-path": "/var/snap/fetch-service/common/spool/2344f06816d745cfb081c6e4d6554b50/cache/git-3265196343" "heads": { "0.1-24.04_edge": "452bdf49c8b34e026352ec988055190f60b5d2c5" }, "server-response": [ "shallow-info", "shallow 452bdf49c8b34e026352ec988055190f60b5d2c5", "", "packfile" ], "tags": { "r1": "452bdf49c8b34e026352ec988055190f60b5d2c5" } } }, "go.module.git": { "opinion": "Approved", "reason": "go module found", "annotations": { "module": "github.com/kr/text" } } }, "result": "Approved", "metadata": { "type": "application/x.go.module.git-repo", "sha1": "af7100d1c92ef01f69d64ec68d491ffb5bd1e1e6", "sha256": "bee7dd40faaa175c670b3437e4ff2a6dd0446c226e617049226792bbb761029e", "size": 10761, "name": "text", "version": "r1", "vendor": "kr", "description": "", "author": "", "license": "MIT" }, ``` The other package: ```json { "artifact-metadata-version": "0.1", "request-inspection": { "craft.rockcraft": { "opinion": "Pending", "reason": "valid URL for rockcraft download" }, "craft.snapcraft": { "opinion": "Pending", "reason": "valid URL for snapcraft download" }, "craft.sourcecraft": { "opinion": "Pending", "reason": "valid URL for sourcecraft download" }, "git.upload-pack": { "opinion": "Pending", "reason": "valid URL for git upload-pack", "annotations": { "client-request": [ "command=fetch", "agent=git/2.43.0", "", "thin-pack", "no-progress", "include-tag", "ofs-delta", "deepen 1", "want ca086ffa507c7c1f5577959ccf258468375ad071", "done" ], "command": "fetch", "is-shallow": true, "num-wants": 1, "project": "bowenfan-pretty", "protocol": "version=2", "repository": "https://git.staging.snapcraftcontent.com:443/ubuntu/public/sourcecraft/bowenfan-pretty", "server": "git.staging.snapcraftcontent.com", "wants": [ "ca086ffa507c7c1f5577959ccf258468375ad071" ] } } }, "response-inspection": { "craft.rockcraft": { "opinion": "Unknown", "reason": "git repository does not contain a rockcraft.yaml file" }, "craft.snapcraft": { "opinion": "Unknown", "reason": "git repository does not contain a snapcraft.yaml file" }, "craft.sourcecraft": { "opinion": "Approved", "reason": "sourcecraft repository found" }, "git.upload-pack": { "opinion": "Unknown", "reason": "git fetch response is valid but content is unknown", "annotations": { "git-checkout-path": "/var/snap/fetch-service/common/spool/2344f06816d745cfb081c6e4d6554b50/cache/git-890371728", "heads": { "0.2-24.04_edge": "ca086ffa507c7c1f5577959ccf258468375ad071" }, "server-response": [ "shallow-info", "shallow ca086ffa507c7c1f5577959ccf258468375ad071", "", "packfile" ], "tags": { "r1": "ca086ffa507c7c1f5577959ccf258468375ad071" } } }, "go.module.git": { "opinion": "Approved", "reason": "go module found", "annotations": { "go": "1.12", "module": "github.com/kr/pretty" } } }, "result": "Approved", "metadata": { "type": "application/x.go.module.git-repo", "sha1": "b6276b28b0ad2e849db8d7668fab388e825673db", "sha256": "0cbf2ecceeeff05770855aab1416d6f295ccd6748deb241441cce51bef8ac8c5", "size": 10464, "name": "pretty", "version": "r1", "vendor": "kr", "description": "", "author": "", "license": "MIT" }, ``` Here is the original `go.mod` it was supposed to parse: ``` module "github.com/kr/text" require "github.com/kr/pty" v1.1.1 ``` Currently, go mod is parsed manually, which isn't recommend imo. Ideally `golang.org/x/mod/modfile` should be used. For reference, see how syft parses go.mod file: https://github.com/anchore/syft/blob/c53f2fbad369b7c19d28b3b63511c95a04e33ff1/syft/pkg/cataloger/golang/parse_go_mod.go#L35-L114 Current implementation should be changed to that imo: https://github.com/canonical/fetch-service/blob/be430cb11d46c2002562681721d0e04d50265676/inspectors/gomod/go_module_git.go#L184-L217 Additionally, the code should also parse the `go.sum` file if that's present as that contains other valuable information. When doing that, the artifact hash in `go.sum` and the fetched artifact hash should also be matched. ### To Reproduce This was picked from: https://git.staging.snapcraftcontent.com/ubuntu/public/sourcecraft/bowenfan-text/tree/go.mod?h=r1 ### Relevant log output ```shell N/A ```

Evaluation history

Date Model Scores Action Summary
qwen/qwen3.6-35b-a3b
Impact: 50
Quick Win: 30.0
Staleness: 75
Complexity: 40
Confidence: 70
Support Request: 15
needs triage Go module git-repo metadata parsing bug: manual go.mod parsing produces incorrect name/vendor fields. Issue is 510 days old with no maintainer triage or labels.

Update history

Date Change
created

Related issues

No related issues found above the similarity threshold.