1
2
3
4 package localizer
5
6 import (
7 "path/filepath"
8
9 "sigs.k8s.io/kustomize/api/ifc"
10 "sigs.k8s.io/kustomize/api/internal/git"
11 "sigs.k8s.io/kustomize/api/internal/loader"
12 "sigs.k8s.io/kustomize/kyaml/errors"
13 "sigs.k8s.io/kustomize/kyaml/filesys"
14 )
15
16
17 type Args struct {
18
19 Target filesys.ConfirmedDir
20
21
22
23 Scope filesys.ConfirmedDir
24
25
26 NewDir filesys.ConfirmedDir
27 }
28
29
30 type Loader struct {
31 fSys filesys.FileSystem
32
33 args *Args
34
35
36 ifc.Loader
37
38
39 local bool
40 }
41
42 var _ ifc.Loader = &Loader{}
43
44
45
46 func NewLoader(rawTarget string, rawScope string, rawNewDir string, fSys filesys.FileSystem) (*Loader, Args, error) {
47
48 repoSpec, err := git.NewRepoSpecFromURL(rawTarget)
49 if err == nil && repoSpec.Ref == "" {
50 return nil, Args{}, errors.Errorf("localize remote root %q missing ref query string parameter", rawTarget)
51 }
52
53
54 ldr, err := loader.NewLoader(loader.RestrictionRootOnly, rawTarget, fSys)
55 if err != nil {
56 return nil, Args{}, errors.WrapPrefixf(err, "unable to establish localize target %q", rawTarget)
57 }
58
59 scope, err := establishScope(rawScope, rawTarget, ldr, fSys)
60 if err != nil {
61 _ = ldr.Cleanup()
62 return nil, Args{}, errors.WrapPrefixf(err, "invalid localize scope %q", rawScope)
63 }
64
65 newDir, err := createNewDir(rawNewDir, ldr, repoSpec, fSys)
66 if err != nil {
67 _ = ldr.Cleanup()
68 return nil, Args{}, errors.WrapPrefixf(err, "invalid localize destination %q", rawNewDir)
69 }
70
71 args := Args{
72 Target: filesys.ConfirmedDir(ldr.Root()),
73 Scope: scope,
74 NewDir: newDir,
75 }
76 return &Loader{
77 fSys: fSys,
78 args: &args,
79 Loader: ldr,
80 local: scope != "",
81 }, args, nil
82 }
83
84
85
86 func (ll *Loader) Load(path string) ([]byte, error) {
87
88 content, err := ll.Loader.Load(path)
89 if err != nil {
90 return nil, errors.WrapPrefixf(err, "invalid file reference")
91 }
92 if filepath.IsAbs(path) {
93 return nil, errors.Errorf("absolute paths not yet supported in alpha: file path %q is absolute", path)
94 }
95 if !loader.IsRemoteFile(path) && ll.local {
96 cleanPath := cleanFilePath(ll.fSys, filesys.ConfirmedDir(ll.Root()), path)
97 cleanAbs := filepath.Join(ll.Root(), cleanPath)
98 dir := filesys.ConfirmedDir(filepath.Dir(cleanAbs))
99
100
101
102 if dir.HasPrefix(ll.args.NewDir) {
103 return nil, errors.Errorf("file %q at %q enters localize destination %q", path, cleanAbs, ll.args.NewDir)
104 }
105 }
106 return content, nil
107 }
108
109
110
111 func (ll *Loader) New(path string) (ifc.Loader, error) {
112 ldr, err := ll.Loader.New(path)
113 if err != nil {
114 return nil, errors.WrapPrefixf(err, "invalid root reference")
115 }
116
117 if repo := ldr.Repo(); repo == "" {
118 if ll.local && !filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.Scope) {
119 return nil, errors.Errorf("root %q outside localize scope %q", ldr.Root(), ll.args.Scope)
120 }
121 if ll.local && filesys.ConfirmedDir(ldr.Root()).HasPrefix(ll.args.NewDir) {
122 return nil, errors.Errorf(
123 "root %q references into localize destination %q", ldr.Root(), ll.args.NewDir)
124 }
125 } else if !hasRef(path) {
126 return nil, errors.Errorf("localize remote root %q missing ref query string parameter", path)
127 }
128
129 return &Loader{
130 fSys: ll.fSys,
131 args: ll.args,
132 Loader: ldr,
133 local: ll.local && ldr.Repo() == "",
134 }, nil
135 }
136
View as plain text