From 97b4cd09b52d5e6edb8730dac503f703e093dc7b Mon Sep 17 00:00:00 2001 From: Roger Peppe Date: Wed, 15 Apr 2026 16:43:52 +0100 Subject: [PATCH] mod/modregistrytest: add metadata capability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We want the ability to predicate some behavior on the metadata uploaded with a module, so add the capability to specify module metadata inside mod/modregistrytest. Signed-off-by: Roger Peppe Change-Id: I934b4aaf004b0ac9e2ca6e03c37b3fc0d2cc581c Reviewed-on: https://review.gerrithub.io/c/cue-lang/cue/+/1235499 Unity-Result: CUE porcuepine Reviewed-by: Daniel Martí TryBot-Result: CUEcueckoo --- mod/modregistrytest/registry.go | 19 +++++++++--- mod/modregistrytest/registry_test.go | 34 +++++++++++++++++++++ mod/modregistrytest/testdata/metadata.txtar | 13 ++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 mod/modregistrytest/testdata/metadata.txtar diff --git a/mod/modregistrytest/registry.go b/mod/modregistrytest/registry.go index 2efa4196a..a83b5375d 100644 --- a/mod/modregistrytest/registry.go +++ b/mod/modregistrytest/registry.go @@ -354,7 +354,7 @@ func pushContent(ctx context.Context, client *modregistry.Client, mods map[modul if err := m.writeZip(&zipContent); err != nil { return err } - if err := client.PutModule(ctx, v, bytes.NewReader(zipContent.Bytes()), int64(zipContent.Len())); err != nil { + if err := client.PutModuleWithMetadata(ctx, v, bytes.NewReader(zipContent.Bytes()), int64(zipContent.Len()), m.metadata); err != nil { return err } pushed[v] = true @@ -448,6 +448,14 @@ func getModules(fsys fs.FS) (map[module.Version]*moduleContent, []byte, error) { if err != nil { return err } + if rest == moduleMetaFile { + var meta modregistry.Metadata + if err := json.Unmarshal(data, &meta); err != nil { + return fmt.Errorf("cannot parse %s in %s: %v", moduleMetaFile, modver, err) + } + content.metadata = &meta + return nil + } content.files = append(content.files, txtar.File{ Name: rest, Data: data, @@ -469,15 +477,18 @@ func getModules(fsys fs.FS) (map[module.Version]*moduleContent, []byte, error) { } type moduleContent struct { - version module.Version - files []txtar.File - modFile *modfile.File + version module.Version + files []txtar.File + modFile *modfile.File + metadata *modregistry.Metadata } func (c *moduleContent) writeZip(w io.Writer) error { return modzip.Create(w, c.version, c.files, txtarFileIO{}) } +const moduleMetaFile = "_module_meta.json" + func (c *moduleContent) init(versDir string) error { found := false for _, f := range c.files { diff --git a/mod/modregistrytest/registry_test.go b/mod/modregistrytest/registry_test.go index aff16f2e5..c8733768d 100644 --- a/mod/modregistrytest/registry_test.go +++ b/mod/modregistrytest/registry_test.go @@ -2,6 +2,7 @@ package modregistrytest import ( "context" + "encoding/json" "fmt" "os" "path" @@ -81,6 +82,39 @@ func runTest(t *testing.T, registry ociregistry.Interface, script string, ar *tx if string(gotData) != string(wantData) { t.Errorf("unexpected GET response\ngot %q\nwant %q", gotData, wantData) } + case "metadata": + if len(args) < 3 { + t.Fatalf("usage: metadata $version key=value...") + } + mv, err := module.ParseVersion(args[1]) + if err != nil { + t.Fatalf("invalid version %q in metadata", args[1]) + } + m, err := client.GetModule(ctx, mv) + if err != nil { + t.Fatal(err) + } + meta, err := m.Metadata() + if err != nil { + t.Fatal(err) + } + gotData, err := json.Marshal(meta) + if err != nil { + t.Fatal(err) + } + var gotMap map[string]string + if err := json.Unmarshal(gotData, &gotMap); err != nil { + t.Fatal(err) + } + for _, kv := range args[2:] { + k, v, ok := strings.Cut(kv, "=") + if !ok { + t.Fatalf("invalid key=value %q", kv) + } + if got := gotMap[k]; got != v { + t.Errorf("metadata %q: got %q, want %q", k, got, v) + } + } default: t.Fatalf("unknown command %q", line) } diff --git a/mod/modregistrytest/testdata/metadata.txtar b/mod/modregistrytest/testdata/metadata.txtar new file mode 100644 index 000000000..671353ce3 --- /dev/null +++ b/mod/modregistrytest/testdata/metadata.txtar @@ -0,0 +1,13 @@ +metadata foo.com/bar/hello@v0.2.3 org.cuelang.vcs-type=git org.cuelang.vcs-commit=abc123def456 org.cuelang.vcs-commit-time=2024-07-15T10:30:00Z + +-- foo.com_bar_hello_v0.2.3/_module_meta.json -- +{ + "org.cuelang.vcs-type": "git", + "org.cuelang.vcs-commit": "abc123def456", + "org.cuelang.vcs-commit-time": "2024-07-15T10:30:00Z" +} +-- foo.com_bar_hello_v0.2.3/cue.mod/module.cue -- +module: "foo.com/bar/hello@v0" +language: version: "v0.8.0" +-- foo.com_bar_hello_v0.2.3/x.cue -- +package hello -- 2.51.2