@@ -10,6 +10,7 @@ import (
10
10
11
11
"github.com/BurntSushi/toml"
12
12
"github.com/dominikbraun/graph"
13
+ "github.com/elliotchance/orderedmap"
13
14
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
14
15
"github.com/otiai10/copy"
15
16
"golang.org/x/mod/module"
@@ -117,9 +118,10 @@ func (c *KpmClient) LoadPkgFromPath(pkgPath string) (*pkg.KclPkg, error) {
117
118
}
118
119
119
120
// 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 )
121
123
if dep .Local != nil {
122
- if ldep , ok := deps .Deps [ name ] ; ok {
124
+ if ldep , ok := deps .Deps . Get ( name ) ; ok {
123
125
var localFullPath string
124
126
if filepath .IsAbs (dep .Local .Path ) {
125
127
localFullPath = dep .Local .Path
@@ -132,8 +134,8 @@ func (c *KpmClient) LoadPkgFromPath(pkgPath string) (*pkg.KclPkg, error) {
132
134
ldep .LocalFullPath = localFullPath
133
135
dep .LocalFullPath = localFullPath
134
136
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 )
137
139
}
138
140
}
139
141
}
@@ -155,7 +157,7 @@ func (c *KpmClient) LoadModFile(pkgPath string) (*pkg.ModFile, error) {
155
157
modFile .HomePath = pkgPath
156
158
157
159
if modFile .Dependencies .Deps == nil {
158
- modFile .Dependencies .Deps = make ( map [string ] pkg.Dependency )
160
+ modFile .Dependencies .Deps = orderedmap . NewOrderedMap [string , pkg.Dependency ]( )
159
161
}
160
162
err = c .FillDependenciesInfo (modFile )
161
163
if err != nil {
@@ -172,13 +174,14 @@ func (c *KpmClient) LoadLockDeps(pkgPath string) (*pkg.Dependencies, error) {
172
174
return nil , err
173
175
}
174
176
175
- for name , dep := range deps .Deps {
177
+ for _ , name := range deps .Deps .Keys () {
178
+ dep , _ := deps .Deps .Get (name )
176
179
sum , err := c .AcquireDepSum (dep )
177
180
if err != nil {
178
181
return nil , err
179
182
}
180
183
dep .Sum = sum
181
- deps .Deps [ name ] = dep
184
+ deps .Deps . Set ( name , dep )
182
185
}
183
186
184
187
return deps , nil
@@ -237,7 +240,8 @@ func (c *KpmClient) ResolveDepsIntoMap(kclPkg *pkg.KclPkg) (map[string]string, e
237
240
return nil , err
238
241
}
239
242
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 )
241
245
pkgMap [d .GetAliasName ()] = d .GetLocalFullPath (kclPkg .HomePath )
242
246
}
243
247
@@ -309,15 +313,17 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
309
313
// alian the dependencies between kcl.mod and kcl.mod.lock
310
314
// clean the dependencies in kcl.mod.lock which not in kcl.mod
311
315
// 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 )
314
319
if ! ok || ! dep .Equals (modDep ) {
315
- delete ( kclPkg .Dependencies .Deps , name )
320
+ kclPkg .Dependencies .Deps . Delete ( name )
316
321
}
317
322
}
318
323
// 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 {
321
327
if len (d .Version ) == 0 {
322
328
reporter .ReportMsgTo (
323
329
fmt .Sprintf ("adding '%s'" , name ),
@@ -330,7 +336,7 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
330
336
)
331
337
}
332
338
333
- kclPkg .Dependencies .Deps [ name ] = d
339
+ kclPkg .Dependencies .Deps . Set ( name , d )
334
340
}
335
341
}
336
342
} else {
@@ -339,7 +345,8 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
339
345
kclPkg .Dependencies .Deps = kclPkg .ModFile .Dependencies .Deps
340
346
}
341
347
342
- for name , d := range kclPkg .Dependencies .Deps {
348
+ for _ , name := range kclPkg .Dependencies .Deps .Keys () {
349
+ d , _ := kclPkg .Dependencies .Deps .Get (name )
343
350
searchPath = c .getDepStorePath (kclPkg .HomePath , & d , kclPkg .IsVendorMode ())
344
351
depPath := searchPath
345
352
// if the dependency is not exist
@@ -388,8 +395,8 @@ func (c *KpmClient) resolvePkgDeps(kclPkg *pkg.KclPkg, lockDeps *pkg.Dependencie
388
395
if err != nil {
389
396
return err
390
397
}
391
- kclPkg .Dependencies .Deps [ name ] = d
392
- lockDeps .Deps [ name ] = d
398
+ kclPkg .Dependencies .Deps . Set ( name , d )
399
+ lockDeps .Deps . Set ( name , d )
393
400
}
394
401
395
402
// Generate file kcl.mod.lock.
@@ -746,19 +753,19 @@ func (c *KpmClient) AddDepWithOpts(kclPkg *pkg.KclPkg, opt *opt.AddOptions) (*pk
746
753
// 3. update the kcl.mod and kcl.mod.lock.
747
754
if opt .NewPkgName != "" {
748
755
// update the kcl.mod with NewPkgName
749
- tempDeps := kclPkg .ModFile .Dependencies .Deps [ d .Name ]
756
+ tempDeps , _ := kclPkg .ModFile .Dependencies .Deps . Get ( d .Name )
750
757
tempDeps .Name = opt .NewPkgName
751
- kclPkg .ModFile .Dependencies .Deps [ d .Name ] = tempDeps
758
+ kclPkg .ModFile .Dependencies .Deps . Set ( d .Name , tempDeps )
752
759
753
760
// update the kcl.mod.lock with NewPkgName
754
- tempDeps = kclPkg .Dependencies .Deps [ d .Name ]
761
+ tempDeps , _ = kclPkg .Dependencies .Deps . Get ( d .Name )
755
762
tempDeps .Name = opt .NewPkgName
756
763
tempDeps .FullName = opt .NewPkgName + "_" + tempDeps .Version
757
- kclPkg .Dependencies .Deps [ d .Name ] = tempDeps
764
+ kclPkg .Dependencies .Deps . Set ( d .Name , tempDeps )
758
765
759
766
// 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 )
762
769
}
763
770
764
771
err = kclPkg .UpdateModAndLockFile ()
@@ -788,9 +795,9 @@ func (c *KpmClient) AddDepToPkg(kclPkg *pkg.KclPkg, d *pkg.Dependency) error {
788
795
789
796
// Some field will be empty when the dependency is add from CLI.
790
797
// 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 ) {
792
799
// 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 )
794
801
}
795
802
796
803
// download all the dependencies.
@@ -851,9 +858,10 @@ func (c *KpmClient) VendorDeps(kclPkg *pkg.KclPkg) error {
851
858
return err
852
859
}
853
860
854
- lockDeps := make ([]pkg.Dependency , 0 , len ( kclPkg .Dependencies .Deps ))
861
+ lockDeps := make ([]pkg.Dependency , 0 , kclPkg .Dependencies .Deps . Len ( ))
855
862
856
- for _ , d := range kclPkg .Dependencies .Deps {
863
+ for _ , k := range kclPkg .Dependencies .Deps .Keys () {
864
+ d , _ := kclPkg .Dependencies .Deps .Get (k )
857
865
lockDeps = append (lockDeps , d )
858
866
}
859
867
@@ -938,12 +946,13 @@ func (c *KpmClient) FillDepInfo(dep *pkg.Dependency, homepath string) error {
938
946
939
947
// FillDependenciesInfo will fill registry information for all dependencies in a kcl.mod.
940
948
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 )
942
951
err := c .FillDepInfo (& v , modFile .HomePath )
943
952
if err != nil {
944
953
return err
945
954
}
946
- modFile .Deps [ k ] = v
955
+ modFile .Deps . Set ( k , v )
947
956
}
948
957
return nil
949
958
}
@@ -1483,22 +1492,23 @@ func (c *KpmClient) dependencyExistsLocal(searchPath string, dep *pkg.Dependency
1483
1492
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 ) {
1484
1493
1485
1494
newDeps := pkg.Dependencies {
1486
- Deps : make ( map [string ] pkg.Dependency ),
1495
+ Deps : orderedmap . NewOrderedMap [string , pkg.Dependency ]( ),
1487
1496
}
1488
1497
1489
1498
// 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 )
1491
1501
if len (d .Name ) == 0 {
1492
1502
return nil , errors .InvalidDependency
1493
1503
}
1494
1504
1495
1505
existDep , err := c .dependencyExistsLocal (pkghome , & d )
1496
1506
if existDep != nil && err == nil {
1497
- newDeps .Deps [ d .Name ] = * existDep
1507
+ newDeps .Deps . Set ( d .Name , * existDep )
1498
1508
continue
1499
1509
}
1500
1510
1501
- expectedSum := lockDeps .Deps [ d .Name ] .Sum
1511
+ expectedSum := lockDeps .Deps . GetOrDefault ( d .Name , pkg . TestPkgDependency ) .Sum
1502
1512
// Clean the cache
1503
1513
if len (c .homePath ) == 0 || len (d .FullName ) == 0 {
1504
1514
return nil , errors .InternalBug
@@ -1516,7 +1526,7 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
1516
1526
return nil , err
1517
1527
}
1518
1528
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 ) ) {
1520
1530
if ! c .noSumCheck && expectedSum != "" &&
1521
1531
lockedDep .Sum != "" &&
1522
1532
lockedDep .Sum != expectedSum {
@@ -1528,17 +1538,18 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
1528
1538
}
1529
1539
}
1530
1540
1531
- newDeps .Deps [ d .Name ] = * lockedDep
1541
+ newDeps .Deps . Set ( d .Name , * lockedDep )
1532
1542
// After downloading the dependency in kcl.mod, update the dep into to the kcl.mod
1533
1543
// Only the direct dependencies are updated to kcl.mod.
1534
- deps .Deps [ d .Name ] = * lockedDep
1544
+ deps .Deps . Set ( d .Name , * lockedDep )
1535
1545
}
1536
1546
1537
1547
// necessary to make a copy as when we are updating kcl.mod in below for loop
1538
1548
// then newDeps.Deps gets updated and range gets an extra value to iterate through
1539
1549
// 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 )
1542
1553
newDepsCopy [k ] = v
1543
1554
}
1544
1555
@@ -1587,17 +1598,19 @@ func (c *KpmClient) DownloadDeps(deps *pkg.Dependencies, lockDeps *pkg.Dependenc
1587
1598
return nil , err
1588
1599
}
1589
1600
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 )
1593
1605
}
1594
1606
}
1595
1607
}
1596
1608
1597
1609
// After each dependency is downloaded, update all the new deps to kcl.mod.lock.
1598
1610
// 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 )
1601
1614
}
1602
1615
1603
1616
return & newDeps , nil
0 commit comments