Skip to content

Commit f8685e0

Browse files
committed
feat: add kcl mod graph command
Signed-off-by: peefy <[email protected]>
1 parent b7d5d2e commit f8685e0

File tree

4 files changed

+169
-66
lines changed

4 files changed

+169
-66
lines changed

Diff for: cmd/kcl/commands/mod.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ const (
2020
kcl mod pull k8s
2121
2222
# Push the module
23-
kcl mod push`
23+
kcl mod push
24+
25+
# Print the current module dependency graph.
26+
kcl mod graph`
2427
)
2528

2629
var (
@@ -61,6 +64,7 @@ func NewModCmd() *cobra.Command {
6164
cmd.AddCommand(NewModPushCmd(cli))
6265
cmd.AddCommand(NewModPullCmd(cli))
6366
cmd.AddCommand(NewModUpdateCmd(cli))
67+
cmd.AddCommand(NewModGraphCmd(cli))
6468

6569
return cmd
6670
}

Diff for: cmd/kcl/commands/mod_graph.go

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/dominikbraun/graph"
8+
"github.com/spf13/cobra"
9+
"kcl-lang.io/kpm/pkg/client"
10+
"kcl-lang.io/kpm/pkg/env"
11+
pkg "kcl-lang.io/kpm/pkg/package"
12+
"kcl-lang.io/kpm/pkg/reporter"
13+
)
14+
15+
const (
16+
modGraphDesc = `This command prints the module dependency graph.
17+
Each module is identified as a string of the form path@version.
18+
`
19+
modGraphExample = ` # Print the current module dependency graph.
20+
kcl mod graph`
21+
)
22+
23+
// NewModGraphCmd returns the mod graph command.
24+
func NewModGraphCmd(cli *client.KpmClient) *cobra.Command {
25+
cmd := &cobra.Command{
26+
Use: "graph",
27+
Short: "prints dependencies",
28+
Long: modGraphDesc,
29+
Example: modGraphExample,
30+
RunE: func(_ *cobra.Command, args []string) error {
31+
return ModGraph(cli, args)
32+
},
33+
SilenceUsage: true,
34+
}
35+
return cmd
36+
}
37+
38+
func ModGraph(cli *client.KpmClient, args []string) error {
39+
// acquire the lock of the package cache.
40+
err := cli.AcquirePackageCacheLock()
41+
if err != nil {
42+
return err
43+
}
44+
45+
defer func() {
46+
// release the lock of the package cache after the function returns.
47+
releaseErr := cli.ReleasePackageCacheLock()
48+
if releaseErr != nil && err == nil {
49+
err = releaseErr
50+
}
51+
}()
52+
53+
pwd, err := os.Getwd()
54+
55+
if err != nil {
56+
return reporter.NewErrorEvent(reporter.Bug, err, "internal bugs, please contact us to fix it.")
57+
}
58+
59+
globalPkgPath, err := env.GetAbsPkgPath()
60+
if err != nil {
61+
return err
62+
}
63+
64+
kclPkg, err := pkg.LoadKclPkg(pwd)
65+
if err != nil {
66+
return err
67+
}
68+
69+
err = kclPkg.ValidateKpmHome(globalPkgPath)
70+
if err != (*reporter.KpmEvent)(nil) {
71+
return err
72+
}
73+
74+
depGraph, err := cli.GetDependencyGraph(kclPkg)
75+
if err != nil {
76+
return err
77+
}
78+
79+
adjMap, err := depGraph.AdjacencyMap()
80+
if err != nil {
81+
return err
82+
}
83+
84+
// Print the dependency graph to stdout.
85+
root := fmt.Sprintf("%s@%s", kclPkg.GetPkgName(), kclPkg.GetPkgVersion())
86+
err = graph.BFS(depGraph, root, func(source string) bool {
87+
for target := range adjMap[source] {
88+
reporter.ReportMsgTo(
89+
fmt.Sprint(source, " ", target),
90+
cli.GetLogWriter(),
91+
)
92+
}
93+
return false
94+
})
95+
if err != nil {
96+
return err
97+
}
98+
return nil
99+
}

Diff for: go.mod

+61-63
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@ require (
88
kcl-lang.io/kcl-go v0.7.5
99
kcl-lang.io/kcl-openapi v0.5.5
1010
kcl-lang.io/kcl-playground v0.5.1
11-
kcl-lang.io/kpm v0.7.1-0.20240218030334-f67db1b477d9
11+
kcl-lang.io/kpm v0.7.1-0.20240218044217-0224b99dc9f7
1212
)
1313

1414
require (
1515
dario.cat/mergo v1.0.0 // indirect
1616
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect
1717
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
1818
github.com/BurntSushi/toml v1.2.1 // indirect
19+
github.com/Microsoft/go-winio v0.6.1 // indirect
20+
github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
1921
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
22+
github.com/bahlo/generic-list-go v0.2.0 // indirect
2023
github.com/beorn7/perks v1.0.1 // indirect
24+
github.com/boltdb/bolt v1.3.1 // indirect
25+
github.com/buger/jsonparser v1.1.1 // indirect
2126
github.com/cespare/xxhash/v2 v2.2.0 // indirect
2227
github.com/chai2010/jsonv v1.1.3 // indirect
2328
github.com/chai2010/protorpc v1.1.4 // indirect
29+
github.com/cloudflare/circl v1.3.7 // indirect
2430
github.com/containerd/containerd v1.7.0 // indirect
2531
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
2632
github.com/docker/cli v23.0.1+incompatible // indirect
@@ -30,127 +36,119 @@ require (
3036
github.com/docker/go-connections v0.4.0 // indirect
3137
github.com/docker/go-metrics v0.0.1 // indirect
3238
github.com/docker/go-units v0.5.0 // indirect
39+
github.com/dominikbraun/graph v0.23.0 // indirect
40+
github.com/emirpasic/gods v1.18.1 // indirect
41+
github.com/fatih/color v1.10.0 // indirect
3342
github.com/getkin/kin-openapi v0.122.0 // indirect
43+
github.com/gin-contrib/sse v0.1.0 // indirect
44+
github.com/gin-gonic/gin v1.7.7 // indirect
45+
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
46+
github.com/go-git/go-billy/v5 v5.5.0 // indirect
47+
github.com/go-git/go-git/v5 v5.11.0 // indirect
3448
github.com/go-logr/logr v1.2.4 // indirect
3549
github.com/go-logr/stdr v1.2.2 // indirect
50+
github.com/go-openapi/analysis v0.21.2 // indirect
51+
github.com/go-openapi/errors v0.20.2 // indirect
52+
github.com/go-openapi/inflect v0.19.0 // indirect
3653
github.com/go-openapi/jsonpointer v0.19.6 // indirect
3754
github.com/go-openapi/jsonreference v0.20.2 // indirect
55+
github.com/go-openapi/loads v0.21.1 // indirect
56+
github.com/go-openapi/spec v0.20.6 // indirect
57+
github.com/go-openapi/strfmt v0.21.2 // indirect
3858
github.com/go-openapi/swag v0.22.4 // indirect
59+
github.com/go-openapi/validate v0.21.0 // indirect
60+
github.com/go-playground/locales v0.13.0 // indirect
61+
github.com/go-playground/universal-translator v0.17.0 // indirect
62+
github.com/go-playground/validator/v10 v10.4.1 // indirect
63+
github.com/go-stack/stack v1.8.1 // indirect
64+
github.com/goccy/go-yaml v1.11.0 // indirect
65+
github.com/gofrs/flock v0.8.1 // indirect
3966
github.com/gogo/protobuf v1.3.2 // indirect
67+
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
4068
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
4169
github.com/golang/protobuf v1.5.3 // indirect
4270
github.com/golang/snappy v0.0.3 // indirect
71+
github.com/google/gnostic-models v0.6.8 // indirect
4372
github.com/google/go-cmp v0.6.0 // indirect
4473
github.com/google/gofuzz v1.2.0 // indirect
4574
github.com/gorilla/mux v1.8.0 // indirect
75+
github.com/hashicorp/go-version v1.6.0 // indirect
76+
github.com/iancoleman/strcase v0.3.0 // indirect
4677
github.com/inconshreveable/mousetrap v1.1.0 // indirect
4778
github.com/invopop/yaml v0.2.0 // indirect
79+
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
4880
github.com/josharian/intern v1.0.0 // indirect
4981
github.com/json-iterator/go v1.1.12 // indirect
5082
github.com/julienschmidt/httprouter v1.3.0 // indirect
83+
github.com/kevinburke/ssh_config v1.2.0 // indirect
5184
github.com/klauspost/compress v1.16.0 // indirect
85+
github.com/kr/pretty v0.3.1 // indirect
86+
github.com/kr/text v0.2.0 // indirect
87+
github.com/leodido/go-urn v1.2.0 // indirect
5288
github.com/mailru/easyjson v0.7.7 // indirect
89+
github.com/mattn/go-colorable v0.1.8 // indirect
90+
github.com/mattn/go-isatty v0.0.12 // indirect
5391
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
5492
github.com/mitchellh/mapstructure v1.5.0 // indirect
5593
github.com/moby/locker v1.0.1 // indirect
94+
github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect
5695
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
5796
github.com/modern-go/reflect2 v1.0.2 // indirect
5897
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
5998
github.com/morikuni/aec v1.0.0 // indirect
99+
github.com/oklog/ulid v1.3.1 // indirect
60100
github.com/opencontainers/go-digest v1.0.0 // indirect
61101
github.com/opencontainers/image-spec v1.1.0-rc4 // indirect
102+
github.com/otiai10/copy v1.9.0 // indirect
62103
github.com/perimeterx/marshmallow v1.1.5 // indirect
104+
github.com/pjbgf/sha1cd v0.3.0 // indirect
63105
github.com/pkg/errors v0.9.1
64106
github.com/powerman/rpc-codec v1.2.2 // indirect
65107
github.com/prometheus/client_golang v1.14.0 // indirect
66108
github.com/prometheus/client_model v0.3.0 // indirect
67109
github.com/prometheus/common v0.37.0 // indirect
68110
github.com/prometheus/procfs v0.8.0 // indirect
111+
github.com/qri-io/jsonpointer v0.1.1 // indirect
112+
github.com/rogpeppe/go-internal v1.11.0 // indirect
113+
github.com/sergi/go-diff v1.1.0 // indirect
69114
github.com/sirupsen/logrus v1.9.0 // indirect
115+
github.com/skeema/knownhosts v1.2.1 // indirect
70116
github.com/spf13/pflag v1.0.5
117+
github.com/thoas/go-funk v0.9.3 // indirect
118+
github.com/ugorji/go/codec v1.2.7 // indirect
119+
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
120+
github.com/xanzy/ssh-agent v0.3.3 // indirect
71121
github.com/yuin/goldmark v1.4.13 // indirect
122+
go.mongodb.org/mongo-driver v1.9.1 // indirect
72123
go.opentelemetry.io/otel v1.14.0 // indirect
73124
go.opentelemetry.io/otel/trace v1.14.0 // indirect
125+
golang.org/x/crypto v0.17.0 // indirect
126+
golang.org/x/mod v0.12.0 // indirect
74127
golang.org/x/net v0.19.0 // indirect
75128
golang.org/x/sync v0.3.0 // indirect
76129
golang.org/x/sys v0.15.0 // indirect
77130
golang.org/x/text v0.14.0 // indirect
131+
golang.org/x/tools v0.13.0 // indirect
132+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
78133
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
79134
google.golang.org/grpc v1.56.3 // indirect
80135
google.golang.org/protobuf v1.30.0 // indirect
81136
gopkg.in/inf.v0 v0.9.1 // indirect
137+
gopkg.in/warnings.v0 v0.1.2 // indirect
82138
gopkg.in/yaml.v2 v2.4.0 // indirect
83139
gopkg.in/yaml.v3 v3.0.1 // indirect
140+
gotest.tools/v3 v3.5.1
84141
k8s.io/api v0.28.3 // indirect
85142
k8s.io/apiextensions-apiserver v0.24.1 // indirect
86143
k8s.io/apimachinery v0.28.3 // indirect
87144
k8s.io/client-go v0.28.3 // indirect
88145
k8s.io/klog/v2 v2.100.1 // indirect
89146
k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect
90147
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect
91-
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
92-
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
93-
sigs.k8s.io/yaml v1.3.0 // indirect
94-
)
95-
96-
require (
97-
github.com/Microsoft/go-winio v0.6.1 // indirect
98-
github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
99-
github.com/bahlo/generic-list-go v0.2.0 // indirect
100-
github.com/boltdb/bolt v1.3.1 // indirect
101-
github.com/buger/jsonparser v1.1.1 // indirect
102-
github.com/cloudflare/circl v1.3.7 // indirect
103-
github.com/emirpasic/gods v1.18.1 // indirect
104-
github.com/fatih/color v1.10.0 // indirect
105-
github.com/gin-contrib/sse v0.1.0 // indirect
106-
github.com/gin-gonic/gin v1.7.7 // indirect
107-
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
108-
github.com/go-git/go-billy/v5 v5.5.0 // indirect
109-
github.com/go-git/go-git/v5 v5.11.0 // indirect
110-
github.com/go-openapi/analysis v0.21.2 // indirect
111-
github.com/go-openapi/errors v0.20.2 // indirect
112-
github.com/go-openapi/inflect v0.19.0 // indirect
113-
github.com/go-openapi/loads v0.21.1 // indirect
114-
github.com/go-openapi/spec v0.20.6 // indirect
115-
github.com/go-openapi/strfmt v0.21.2 // indirect
116-
github.com/go-openapi/validate v0.21.0 // indirect
117-
github.com/go-playground/locales v0.13.0 // indirect
118-
github.com/go-playground/universal-translator v0.17.0 // indirect
119-
github.com/go-playground/validator/v10 v10.4.1 // indirect
120-
github.com/go-stack/stack v1.8.1 // indirect
121-
github.com/goccy/go-yaml v1.11.0 // indirect
122-
github.com/gofrs/flock v0.8.1 // indirect
123-
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
124-
github.com/google/gnostic-models v0.6.8 // indirect
125-
github.com/hashicorp/go-version v1.6.0 // indirect
126-
github.com/iancoleman/strcase v0.3.0 // indirect
127-
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
128-
github.com/kevinburke/ssh_config v1.2.0 // indirect
129-
github.com/kr/pretty v0.3.1 // indirect
130-
github.com/kr/text v0.2.0 // indirect
131-
github.com/leodido/go-urn v1.2.0 // indirect
132-
github.com/mattn/go-colorable v0.1.8 // indirect
133-
github.com/mattn/go-isatty v0.0.12 // indirect
134-
github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect
135-
github.com/oklog/ulid v1.3.1 // indirect
136-
github.com/otiai10/copy v1.9.0 // indirect
137-
github.com/pjbgf/sha1cd v0.3.0 // indirect
138-
github.com/qri-io/jsonpointer v0.1.1 // indirect
139-
github.com/rogpeppe/go-internal v1.11.0 // indirect
140-
github.com/sergi/go-diff v1.1.0 // indirect
141-
github.com/skeema/knownhosts v1.2.1 // indirect
142-
github.com/thoas/go-funk v0.9.3 // indirect
143-
github.com/ugorji/go/codec v1.2.7 // indirect
144-
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
145-
github.com/xanzy/ssh-agent v0.3.3 // indirect
146-
go.mongodb.org/mongo-driver v1.9.1 // indirect
147-
golang.org/x/crypto v0.17.0 // indirect
148-
golang.org/x/mod v0.12.0 // indirect
149-
golang.org/x/tools v0.13.0 // indirect
150-
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
151-
gopkg.in/warnings.v0 v0.1.2 // indirect
152-
gotest.tools/v3 v3.5.1
153148
kcl-lang.io/lib v0.7.8 // indirect
154149
oras.land/oras-go v1.2.3 // indirect
155150
oras.land/oras-go/v2 v2.3.0 // indirect
151+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
152+
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
153+
sigs.k8s.io/yaml v1.3.0 // indirect
156154
)

Diff for: go.sum

+4-2
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
187187
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4=
188188
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
189189
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
190+
github.com/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo=
191+
github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc=
190192
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
191193
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
192194
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
@@ -1323,8 +1325,8 @@ kcl-lang.io/kcl-openapi v0.5.5 h1:6LSbiy53nczagm7Ohgdy1DVgQ+5ffMihsOUY7PGkbh0=
13231325
kcl-lang.io/kcl-openapi v0.5.5/go.mod h1:Ai9mFztCVKkRSFabczO/r5hCNdqaNtAc2ZIRxTeV0Mk=
13241326
kcl-lang.io/kcl-playground v0.5.1 h1:MKQQUHgt4+2QyU2NVwa73oksOaBJGDi4keGoggA0MiU=
13251327
kcl-lang.io/kcl-playground v0.5.1/go.mod h1:IFmnlw7m011ccX8OidMUfnnN2u/TWdtQGxyABRTbmow=
1326-
kcl-lang.io/kpm v0.7.1-0.20240218030334-f67db1b477d9 h1:+1k8IvGCYTJSzEYC6+jKsdJto6MAkhBCe49kDtX93ik=
1327-
kcl-lang.io/kpm v0.7.1-0.20240218030334-f67db1b477d9/go.mod h1:s9w+2itB6AcCNjdppZv2Tc9vGhKk/axtJ5XJYaWNR+0=
1328+
kcl-lang.io/kpm v0.7.1-0.20240218044217-0224b99dc9f7 h1:8aCVXsLYqcrzyxmCVtVaeAp2JiGGLYRRivwT1mISRDI=
1329+
kcl-lang.io/kpm v0.7.1-0.20240218044217-0224b99dc9f7/go.mod h1:4qKzxK349peQk1txQN/cwRwc9Q+hKJWriTCjExdI2aQ=
13281330
kcl-lang.io/lib v0.7.8 h1:kOYlrFqZkwzCG/CFs63cwbX3pPCNUci1Xvj7zqqnLno=
13291331
kcl-lang.io/lib v0.7.8/go.mod h1:ubsalGXxJaa5II/EsHmsI/tL2EluYHIcW+BwzQPt+uY=
13301332
oras.land/oras-go v1.2.3 h1:v8PJl+gEAntI1pJ/LCrDgsuk+1PKVavVEPsYIHFE5uY=

0 commit comments

Comments
 (0)