Skip to content

Commit b951b07

Browse files
rogpeppemvdan
authored andcommitted
cue/load: update for OCI modules
Note: This is an experimental feature and is intended for internal-only use for now. Summary of changes: - adapt cue/load/internal/registrytest to use OCI registry API; - change cue/load to use new internal/mod/modfile package; - change cue/load.TestLoad to use tdtest package for easier test updating; - change cue/load to support inferring major module version from module.cue deps. - remove now-unused packages inside cue/load/internal. For #2330. Signed-off-by: Roger Peppe <[email protected]> Change-Id: I7b6d71993c253e6525fc3a69216e87d814ba6b3e Reviewed-on: https://review.gerrithub.io/c/cue-lang/cue/+/1168508 Reviewed-by: Daniel Martí <[email protected]> TryBot-Result: CUEcueckoo <[email protected]>
1 parent 3c368d3 commit b951b07

29 files changed

+434
-2474
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
! exec cue eval non-existing .
1+
! exec cue eval nonexisting .
22
! stdout .
33
cmp stderr expect-stderr
44

55
-- expect-stderr --
6-
cannot find package "non-existing"
6+
cannot find package "nonexisting"

cue/load/config.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"cuelang.org/go/cue/errors"
2828
"cuelang.org/go/cue/token"
2929
"cuelang.org/go/internal"
30+
"cuelang.org/go/internal/mod/modfile"
3031
)
3132

3233
const (
@@ -139,7 +140,7 @@ type Config struct {
139140
// if no module file was present. If non-nil, then
140141
// after calling Config.complete, modFile.Module will be
141142
// equal to Module.
142-
modFile *modFile
143+
modFile *modfile.File
143144

144145
// Package defines the name of the package to be loaded. If this is not set,
145146
// the package must be uniquely defined from its context. Special values:
@@ -364,6 +365,7 @@ func (c Config) complete() (cfg *Config, err error) {
364365
} else if !filepath.IsAbs(c.ModuleRoot) {
365366
c.ModuleRoot = filepath.Join(c.Dir, c.ModuleRoot)
366367
}
368+
//c.Registry = "registry.cue.works"
367369
if c.Registry != "" {
368370
u, err := url.Parse(c.Registry)
369371
if err != nil {

cue/load/import.go

+23-7
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,20 @@
1515
package load
1616

1717
import (
18+
"context"
1819
"fmt"
1920
"os"
2021
pathpkg "path"
2122
"path/filepath"
2223
"sort"
2324
"strings"
2425

26+
"cuelang.org/go/cue/ast"
2527
"cuelang.org/go/cue/build"
2628
"cuelang.org/go/cue/errors"
2729
"cuelang.org/go/cue/token"
2830
"cuelang.org/go/internal/filetypes"
31+
"cuelang.org/go/internal/mod/module"
2932
)
3033

3134
// importPkg returns details about the CUE package named by the import path,
@@ -353,15 +356,25 @@ func (l *loader) absDirFromImportPath(pos token.Pos, p importPath) (absDir, name
353356
p = p[:i]
354357

355358
default: // p[i] == '/'
356-
name = string(p[i+1:])
359+
mp, _, ok := module.SplitPathVersion(string(p))
360+
if ok {
361+
// import of the form: example.com/foo/bar@v1
362+
if i := strings.LastIndex(mp, "/"); i >= 0 {
363+
name = mp[i+1:]
364+
}
365+
} else {
366+
name = string(p[i+1:])
367+
}
357368
}
358-
359369
// TODO: fully test that name is a valid identifier.
360370
if name == "" {
361371
err = errors.Newf(pos, "empty package name in import path %q", p)
362372
} else if strings.IndexByte(name, '.') >= 0 {
363373
err = errors.Newf(pos,
364374
"cannot determine package name for %q (set explicitly with ':')", p)
375+
} else if !ast.IsValidIdent(name) {
376+
err = errors.Newf(pos,
377+
"implied package identifier %q from import path %q is not valid", name, p)
365378
}
366379

367380
// Determine the directory.
@@ -381,7 +394,7 @@ func (l *loader) absDirFromImportPath(pos token.Pos, p importPath) (absDir, name
381394
absDir, err = l.externalPackageDir(p)
382395
if err != nil {
383396
// TODO why can't we use %w ?
384-
return "", name, errors.Newf(token.NoPos, "cannot get directory for external module %q: %v", p, err)
397+
return "", name, errors.Newf(token.NoPos, "cannot get directory for external module %q (registry %q): %v", p, l.cfg.Registry, err)
385398
}
386399
} else {
387400
absDir = filepath.Join(GenPath(l.cfg.ModuleRoot), sub)
@@ -392,12 +405,15 @@ func (l *loader) absDirFromImportPath(pos token.Pos, p importPath) (absDir, name
392405
}
393406

394407
func (l *loader) externalPackageDir(p importPath) (dir string, err error) {
395-
m, subPath, ok := l.deps.lookup(p)
396-
if !ok {
397-
return "", fmt.Errorf("no dependency found for import path %q", p)
408+
if l.deps == nil {
409+
return "", fmt.Errorf("no dependency found for import path %q (no dependencies at all)", p)
410+
}
411+
m, subPath, err := l.deps.lookup(p)
412+
if err != nil {
413+
return "", err
398414
}
399415

400-
dir, err = l.regClient.getModContents(m)
416+
dir, err = l.regClient.getModContents(context.TODO(), m)
401417
if err != nil {
402418
return "", fmt.Errorf("cannot get contents for %v: %v", m, err)
403419
}

cue/load/import_test.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package load
1616

1717
import (
18+
"fmt"
1819
"os"
1920
"path/filepath"
2021
"reflect"
@@ -37,15 +38,23 @@ func getInst(pkg, cwd string) (*build.Instance, error) {
3738
// all the way to the root of the git repository, causing Go's test caching
3839
// to never kick in, as the .git directory almost always changes.
3940
// Moreover, it's extra work that isn't useful to the tests.
40-
c, _ := (&Config{ModuleRoot: cwd, Dir: cwd}).complete()
41+
c, err := (&Config{ModuleRoot: cwd, Dir: cwd}).complete()
42+
if err != nil {
43+
return nil, fmt.Errorf("unexpected error on Config.complete: %v", err)
44+
}
4145
l := loader{cfg: c}
4246
inst := l.newRelInstance(token.NoPos, pkg, c.Package)
4347
p := l.importPkg(token.NoPos, inst)[0]
4448
return p, p.Err
4549
}
4650

4751
func TestEmptyImport(t *testing.T) {
48-
c, _ := (&Config{}).complete()
52+
c, err := (&Config{
53+
ModuleRoot: ".",
54+
}).complete()
55+
if err != nil {
56+
t.Fatal(err)
57+
}
4958
l := loader{cfg: c}
5059
inst := l.newInstance(token.NoPos, "")
5160
p := l.importPkg(token.NoPos, inst)[0]

cue/load/instances.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package load
2020
// - go/build
2121

2222
import (
23+
"fmt"
2324
"os"
2425

2526
"cuelang.org/go/cue/ast"
@@ -56,12 +57,16 @@ func Instances(args []string, c *Config) []*build.Instance {
5657
if err != nil {
5758
return []*build.Instance{c.newErrInstance(err)}
5859
}
59-
regClient = newRegistryClient(c.Registry, tmpDir)
60+
regClient, err = newRegistryClient(c.Registry, tmpDir)
61+
if err != nil {
62+
return []*build.Instance{c.newErrInstance(fmt.Errorf("cannot make registry client: %v", err))}
63+
}
6064
deps1, err := resolveDependencies(c.modFile, regClient)
6165
if err != nil {
6266
return []*build.Instance{c.newErrInstance(err)}
6367
}
6468
deps = deps1
69+
6570
}
6671
tg := newTagger(c)
6772
l := newLoader(c, tg, deps, regClient)

cue/load/internal/mvs/errors.go

-103
This file was deleted.

0 commit comments

Comments
 (0)