Skip to content

Commit cc6485f

Browse files
migrate deps map to orderedmap
Signed-off-by: Asish Kumar <[email protected]>
1 parent a4ce1a8 commit cc6485f

15 files changed

+285
-255
lines changed

Diff for: go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ require (
5555
github.com/docker/go-connections v0.5.0 // indirect
5656
github.com/docker/go-metrics v0.0.1 // indirect
5757
github.com/docker/go-units v0.5.0 // indirect
58+
github.com/elliotchance/orderedmap/v2 v2.2.0 // indirect
5859
github.com/emirpasic/gods v1.18.1 // indirect
5960
github.com/fatih/color v1.15.0 // indirect
6061
github.com/felixge/httpsnoop v1.0.4 // indirect
@@ -153,6 +154,7 @@ require (
153154

154155
require (
155156
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
157+
github.com/elliotchance/orderedmap v1.6.0
156158
github.com/go-git/go-git/v5 v5.11.0
157159
github.com/gofrs/flock v0.8.1
158160
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3

Diff for: go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ github.com/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucV
317317
github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc=
318318
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
319319
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
320+
github.com/elliotchance/orderedmap v1.6.0 h1:xjn+kbbKXeDq6v9RVE+WYwRbYfAZKvlWfcJNxM8pvEw=
321+
github.com/elliotchance/orderedmap v1.6.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys=
322+
github.com/elliotchance/orderedmap/v2 v2.2.0 h1:7/2iwO98kYT4XkOjA9mBEIwvi4KpGB4cyHeOFOnj4Vk=
323+
github.com/elliotchance/orderedmap/v2 v2.2.0/go.mod h1:85lZyVbpGaGvHvnKa7Qhx7zncAdBIBq6u56Hb1PRU5Q=
320324
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
321325
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
322326
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

Diff for: pkg/api/kpm_pkg_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func TestPackageApi(t *testing.T) {
2323
assert.Equal(t, pkg.GetPkgName(), "kcl_pkg")
2424
assert.Equal(t, pkg.GetVersion(), "0.0.1")
2525
assert.Equal(t, pkg.GetEdition(), "0.0.1")
26-
assert.Equal(t, len(pkg.GetDependencies().Deps), 1)
26+
assert.Equal(t, pkg.GetDependencies().Deps.Len(), 1)
2727

28-
dep := pkg.GetDependencies().Deps["k8s"]
28+
dep, _ := pkg.GetDependencies().Deps.Get("k8s")
2929
assert.Equal(t, dep.Name, "k8s")
3030
assert.Equal(t, dep.FullName, "k8s_1.27")
3131
assert.Equal(t, dep.Version, "1.27")
@@ -63,7 +63,7 @@ func TestApiGetDependenciesInModFile(t *testing.T) {
6363
pkg_path := filepath.Join(getTestDir("test_get_mod_deps"), "kcl_pkg")
6464
pkg, err := GetKclPackage(pkg_path)
6565
assert.Equal(t, err, nil)
66-
dep := pkg.GetDependenciesInModFile().Deps["k8s"]
66+
dep, _ := pkg.GetDependenciesInModFile().Deps.Get("k8s")
6767
assert.Equal(t, dep.Name, "k8s")
6868
assert.Equal(t, dep.FullName, "k8s_1.27")
6969
assert.Equal(t, dep.Version, "1.27")

Diff for: pkg/client/client.go

+56-43
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/BurntSushi/toml"
1212
"github.com/dominikbraun/graph"
13+
"github.com/elliotchance/orderedmap"
1314
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
1415
"github.com/otiai10/copy"
1516
"golang.org/x/mod/module"
@@ -117,9 +118,10 @@ func (c *KpmClient) LoadPkgFromPath(pkgPath string) (*pkg.KclPkg, error) {
117118
}
118119

119120
// Align the dependencies between kcl.mod and kcl.mod.lock.
120-
for name, dep := range modFile.Dependencies.Deps {
121+
for _, name := range modFile.Dependencies.Deps.Keys() {
122+
dep, _ := modFile.Dependencies.Deps.Get(name)
121123
if dep.Local != nil {
122-
if ldep, ok := deps.Deps[name]; ok {
124+
if ldep, ok := deps.Deps.Get(name); ok {
123125
var localFullPath string
124126
if filepath.IsAbs(dep.Local.Path) {
125127
localFullPath = dep.Local.Path
@@ -132,8 +134,8 @@ func (c *KpmClient) LoadPkgFromPath(pkgPath string) (*pkg.KclPkg, error) {
132134
ldep.LocalFullPath = localFullPath
133135
dep.LocalFullPath = localFullPath
134136
ldep.Source = dep.Source
135-
deps.Deps[name] = ldep
136-
modFile.Dependencies.Deps[name] = dep
137+
deps.Deps.Set(name, ldep)
138+
modFile.Dependencies.Deps.Set(name, dep)
137139
}
138140
}
139141
}
@@ -155,7 +157,7 @@ func (c *KpmClient) LoadModFile(pkgPath string) (*pkg.ModFile, error) {
155157
modFile.HomePath = pkgPath
156158

157159
if modFile.Dependencies.Deps == nil {
158-
modFile.Dependencies.Deps = make(map[string]pkg.Dependency)
160+
modFile.Dependencies.Deps = orderedmap.NewOrderedMap[string, pkg.Dependency]()
159161
}
160162
err = c.FillDependenciesInfo(modFile)
161163
if err != nil {
@@ -172,13 +174,14 @@ func (c *KpmClient) LoadLockDeps(pkgPath string) (*pkg.Dependencies, error) {
172174
return nil, err
173175
}
174176

175-
for name, dep := range deps.Deps {
177+
for _, name := range deps.Deps.Keys() {
178+
dep, _ := deps.Deps.Get(name)
176179
sum, err := c.AcquireDepSum(dep)
177180
if err != nil {
178181
return nil, err
179182
}
180183
dep.Sum = sum
181-
deps.Deps[name] = dep
184+
deps.Deps.Set(name, dep)
182185
}
183186

184187
return deps, nil
@@ -237,7 +240,8 @@ func (c *KpmClient) ResolveDepsIntoMap(kclPkg *pkg.KclPkg) (map[string]string, e
237240
return nil, err
238241
}
239242
var pkgMap map[string]string = make(map[string]string)
240-
for _, d := range depMetadatas.Deps {
243+
for _, k := range depMetadatas.Deps.Keys() {
244+
d, _ := depMetadatas.Deps.Get(k)
241245
pkgMap[d.GetAliasName()] = d.GetLocalFullPath(kclPkg.HomePath)
242246
}
243247

@@ -309,15 +313,17 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
309313
// alian the dependencies between kcl.mod and kcl.mod.lock
310314
// clean the dependencies in kcl.mod.lock which not in kcl.mod
311315
// clean the dependencies in kcl.mod.lock and kcl.mod which have different version
312-
for name, dep := range kclPkg.Dependencies.Deps {
313-
modDep, ok := kclPkg.ModFile.Dependencies.Deps[name]
316+
for _, name := range kclPkg.Dependencies.Deps.Keys() {
317+
dep, _ := kclPkg.Dependencies.Deps.Get(name)
318+
modDep, ok := kclPkg.ModFile.Dependencies.Deps.Get(name)
314319
if !ok || !dep.Equals(modDep) {
315-
delete(kclPkg.Dependencies.Deps, name)
320+
kclPkg.Dependencies.Deps.Delete(name)
316321
}
317322
}
318323
// add the dependencies in kcl.mod which not in kcl.mod.lock
319-
for name, d := range kclPkg.ModFile.Dependencies.Deps {
320-
if _, ok := kclPkg.Dependencies.Deps[name]; !ok {
324+
for _, name := range kclPkg.ModFile.Dependencies.Deps.Keys() {
325+
d, _ := kclPkg.ModFile.Dependencies.Deps.Get(name)
326+
if _, ok := kclPkg.Dependencies.Deps.Get(name); !ok {
321327
if len(d.Version) == 0 {
322328
reporter.ReportMsgTo(
323329
fmt.Sprintf("adding '%s'", name),
@@ -330,7 +336,7 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
330336
)
331337
}
332338

333-
kclPkg.Dependencies.Deps[name] = d
339+
kclPkg.Dependencies.Deps.Set(name, d)
334340
}
335341
}
336342
} else {
@@ -339,7 +345,8 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
339345
kclPkg.Dependencies.Deps = kclPkg.ModFile.Dependencies.Deps
340346
}
341347

342-
for name, d := range kclPkg.Dependencies.Deps {
348+
for _, name := range kclPkg.Dependencies.Deps.Keys() {
349+
d, _ := kclPkg.Dependencies.Deps.Get(name)
343350
searchPath = c.getDepStorePath(kclPkg.HomePath, &d, kclPkg.IsVendorMode())
344351
depPath := searchPath
345352
// if the dependency is not exist
@@ -388,8 +395,8 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
388395
if err != nil {
389396
return err
390397
}
391-
kclPkg.Dependencies.Deps[name] = d
392-
lockDeps.Deps[name] = d
398+
kclPkg.Dependencies.Deps.Set(name, d)
399+
lockDeps.Deps.Set(name, d)
393400
}
394401

395402
// Generate file kcl.mod.lock.
@@ -746,19 +753,19 @@ func (c *KpmClient) AddDepWithOpts(kclPkg *pkg.KclPkg, opt *opt.AddOptions) (*pk
746753
// 3. update the kcl.mod and kcl.mod.lock.
747754
if opt.NewPkgName != "" {
748755
// update the kcl.mod with NewPkgName
749-
tempDeps := kclPkg.ModFile.Dependencies.Deps[d.Name]
756+
tempDeps, _ := kclPkg.ModFile.Dependencies.Deps.Get(d.Name)
750757
tempDeps.Name = opt.NewPkgName
751-
kclPkg.ModFile.Dependencies.Deps[d.Name] = tempDeps
758+
kclPkg.ModFile.Dependencies.Deps.Set(d.Name, tempDeps)
752759

753760
// update the kcl.mod.lock with NewPkgName
754-
tempDeps = kclPkg.Dependencies.Deps[d.Name]
761+
tempDeps, _ = kclPkg.Dependencies.Deps.Get(d.Name)
755762
tempDeps.Name = opt.NewPkgName
756763
tempDeps.FullName = opt.NewPkgName + "_" + tempDeps.Version
757-
kclPkg.Dependencies.Deps[d.Name] = tempDeps
764+
kclPkg.Dependencies.Deps.Set(d.Name, tempDeps)
758765

759766
// update the key of kclPkg.Dependencies.Deps from d.Name to opt.NewPkgName
760-
kclPkg.Dependencies.Deps[opt.NewPkgName] = kclPkg.Dependencies.Deps[d.Name]
761-
delete(kclPkg.Dependencies.Deps, d.Name)
767+
kclPkg.Dependencies.Deps.Set(opt.NewPkgName, kclPkg.Dependencies.Deps.GetOrDefault(d.Name, pkg.TestPkgDependency))
768+
kclPkg.Dependencies.Deps.Delete(d.Name)
762769
}
763770

764771
err = kclPkg.UpdateModAndLockFile()
@@ -788,9 +795,9 @@ func (c *KpmClient) AddDepToPkg(kclPkg *pkg.KclPkg, d *pkg.Dependency) error {
788795

789796
// Some field will be empty when the dependency is add from CLI.
790797
// For avoiding re-download the dependency, just complete part of the fields not all of them.
791-
if !kclPkg.ModFile.Dependencies.Deps[d.Name].Equals(*d) {
798+
if !kclPkg.ModFile.Dependencies.Deps.GetOrDefault(d.Name, pkg.TestPkgDependency).Equals(*d) {
792799
// the dep passed on the cli is different from the kcl.mod.
793-
kclPkg.ModFile.Dependencies.Deps[d.Name] = *d
800+
kclPkg.ModFile.Dependencies.Deps.Set(d.Name, *d)
794801
}
795802

796803
// download all the dependencies.
@@ -851,9 +858,10 @@ func (c *KpmClient) VendorDeps(kclPkg *pkg.KclPkg) error {
851858
return err
852859
}
853860

854-
lockDeps := make([]pkg.Dependency, 0, len(kclPkg.Dependencies.Deps))
861+
lockDeps := make([]pkg.Dependency, 0, kclPkg.Dependencies.Deps.Len())
855862

856-
for _, d := range kclPkg.Dependencies.Deps {
863+
for _, k := range kclPkg.Dependencies.Deps.Keys() {
864+
d, _ := kclPkg.Dependencies.Deps.Get(k)
857865
lockDeps = append(lockDeps, d)
858866
}
859867

@@ -938,12 +946,13 @@ func (c *KpmClient) FillDepInfo(dep *pkg.Dependency, homepath string) error {
938946

939947
// FillDependenciesInfo will fill registry information for all dependencies in a kcl.mod.
940948
func (c *KpmClient) FillDependenciesInfo(modFile *pkg.ModFile) error {
941-
for k, v := range modFile.Deps {
949+
for _, k := range modFile.Deps.Keys() {
950+
v, _ := modFile.Deps.Get(k)
942951
err := c.FillDepInfo(&v, modFile.HomePath)
943952
if err != nil {
944953
return err
945954
}
946-
modFile.Deps[k] = v
955+
modFile.Deps.Set(k, v)
947956
}
948957
return nil
949958
}
@@ -1483,22 +1492,23 @@ func (c *KpmClient) dependencyExistsLocal(searchPath string, dep *pkg.Dependency
14831492
func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependencies, depGraph graph.Graph[module.Version, module.Version], pkghome string, parent module.Version) (*pkg.Dependencies, error) {
14841493

14851494
newDeps := pkg.Dependencies{
1486-
Deps: make(map[string]pkg.Dependency),
1495+
Deps: orderedmap.NewOrderedMap[string, pkg.Dependency](),
14871496
}
14881497

14891498
// Traverse all dependencies in kcl.mod
1490-
for _, d := range deps.Deps {
1499+
for _, k := range deps.Deps.Keys() {
1500+
d, _ := deps.Deps.Get(k)
14911501
if len(d.Name) == 0 {
14921502
return nil, errors.InvalidDependency
14931503
}
14941504

14951505
existDep, err := c.dependencyExistsLocal(pkghome, &d)
14961506
if existDep != nil && err == nil {
1497-
newDeps.Deps[d.Name] = *existDep
1507+
newDeps.Deps.Set(d.Name, *existDep)
14981508
continue
14991509
}
15001510

1501-
expectedSum := lockDeps.Deps[d.Name].Sum
1511+
expectedSum := lockDeps.Deps.GetOrDefault(d.Name, pkg.TestPkgDependency).Sum
15021512
// Clean the cache
15031513
if len(c.homePath) == 0 || len(d.FullName) == 0 {
15041514
return nil, errors.InternalBug
@@ -1516,7 +1526,7 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
15161526
return nil, err
15171527
}
15181528

1519-
if lockedDep.Oci != nil && lockedDep.Equals(lockDeps.Deps[d.Name]) {
1529+
if lockedDep.Oci != nil && lockedDep.Equals(lockDeps.Deps.GetOrDefault(d.Name, pkg.TestPkgDependency)) {
15201530
if !c.noSumCheck && expectedSum != "" &&
15211531
lockedDep.Sum != "" &&
15221532
lockedDep.Sum != expectedSum {
@@ -1528,17 +1538,18 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
15281538
}
15291539
}
15301540

1531-
newDeps.Deps[d.Name] = *lockedDep
1541+
newDeps.Deps.Set(d.Name, *lockedDep)
15321542
// After downloading the dependency in kcl.mod, update the dep into to the kcl.mod
15331543
// Only the direct dependencies are updated to kcl.mod.
1534-
deps.Deps[d.Name] = *lockedDep
1544+
deps.Deps.Set(d.Name, *lockedDep)
15351545
}
15361546

15371547
// necessary to make a copy as when we are updating kcl.mod in below for loop
15381548
// then newDeps.Deps gets updated and range gets an extra value to iterate through
15391549
// this messes up the dependency graph
1540-
newDepsCopy := make(map[string]pkg.Dependency)
1541-
for k, v := range newDeps.Deps {
1550+
newDepsCopy := orderedmap.NewOrderedMap[string, pkg.Dependency]()
1551+
for _, k := range newDeps.Deps.Keys() {
1552+
v, _ := newDeps.Deps.Get(k)
15421553
newDepsCopy[k] = v
15431554
}
15441555

@@ -1587,17 +1598,19 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
15871598
return nil, err
15881599
}
15891600

1590-
for _, d := range nested.Deps {
1591-
if _, ok := newDeps.Deps[d.Name]; !ok {
1592-
newDeps.Deps[d.Name] = d
1601+
for _, k := range nested.Deps.Keys() {
1602+
d, _ := nested.Deps.Get(k)
1603+
if _, ok := newDeps.Deps.Get(d.Name); !ok {
1604+
newDeps.Deps.Set(d.Name, d)
15931605
}
15941606
}
15951607
}
15961608

15971609
// After each dependency is downloaded, update all the new deps to kcl.mod.lock.
15981610
// No matter whether the dependency is directly or indirectly.
1599-
for k, v := range newDeps.Deps {
1600-
lockDeps.Deps[k] = v
1611+
for _, k := range newDeps.Deps.Keys() {
1612+
v, _ := newDeps.Deps.Get(k)
1613+
lockDeps.Deps.Set(k, v)
16011614
}
16021615

16031616
return &newDeps, nil

0 commit comments

Comments
 (0)