diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 09f9e15bf..79ee16656 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -1469,3 +1469,4 @@ func testRunWithOciDownloader(t *testing.T) { assert.Equal(t, buf.String(), "downloading 'zong-zhe/helloworld:0.0.3' from 'ghcr.io/zong-zhe/helloworld:0.0.3'\n") assert.Equal(t, res.GetRawYamlResult(), "The_first_kcl_program: Hello World!") } + diff --git a/pkg/cmd/cmd_tidy.go b/pkg/cmd/cmd_tidy.go new file mode 100644 index 000000000..a1f3f3873 --- /dev/null +++ b/pkg/cmd/cmd_tidy.go @@ -0,0 +1,85 @@ +// Copyright 2024 The KCL Authors. All rights reserved. + +package cmd + +import ( + "fmt" + "os" + + "github.com/dominikbraun/graph" + "github.com/urfave/cli/v2" + "golang.org/x/mod/module" + "kcl-lang.io/kpm/pkg/client" + "kcl-lang.io/kpm/pkg/env" + pkg "kcl-lang.io/kpm/pkg/package" + "kcl-lang.io/kpm/pkg/reporter" +) + +// NewTidyCmd new a Command for `kpm graph`. +func NewTidyCmd(kpmcli *client.KpmClient) *cli.Command { + return &cli.Command{ + Hidden: false, + Name: "graph", + Usage: "prints the module dependency graph", + Action: func(c *cli.Context) error { + return KpmTidy(c, kpmcli) + }, + } +} + +func KpmTidy(c *cli.Context, kpmcli *client.KpmClient) error { + pwd, err := os.Getwd() + + if err != nil { + return reporter.NewErrorEvent(reporter.Bug, err, "internal bugs, please contact us to fix it.") + } + + globalPkgPath, err := env.GetAbsPkgPath() + if err != nil { + return err + } + + kclPkg, err := pkg.LoadKclPkg(pwd) + if err != nil { + return err + } + + err = kclPkg.ValidateKpmHome(globalPkgPath) + if err != (*reporter.KpmEvent)(nil) { + return err + } + + _, depGraph, err := kpmcli.InitGraphAndDownloadDeps(kclPkg) + if err != nil { + return err + } + + adjMap, err := depGraph.AdjacencyMap() + if err != nil { + return err + } + + format := func(m module.Version) string { + formattedMsg := m.Path + if m.Version != "" { + formattedMsg += "@" + m.Version + } + return formattedMsg + } + + // print the dependency graph to stdout. + root := module.Version{Path: kclPkg.GetPkgName(), Version: kclPkg.GetPkgVersion()} + err = graph.BFS(depGraph, root, func(source module.Version) bool { + for target := range adjMap[source] { + reporter.ReportMsgTo( + fmt.Sprint(format(source), " ", format(target)), + kpmcli.GetLogWriter(), + ) + } + return false + }) + if err != nil { + return err + } + return nil +} diff --git a/pkg/git/git.go b/pkg/git/git.go index 8d244ac9e..9e8466d01 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -146,6 +146,7 @@ func CloneWithOpts(opts ...CloneOption) (*git.Repository, error) { return nil, err } + return cloneOpts.Clone() } diff --git a/pkg/graph/graph.go b/pkg/graph/graph.go deleted file mode 100644 index e22d40e23..000000000 --- a/pkg/graph/graph.go +++ /dev/null @@ -1,43 +0,0 @@ -package graph - -import ( - "fmt" - - "github.com/dominikbraun/graph" - "golang.org/x/mod/module" - pkg "kcl-lang.io/kpm/pkg/package" -) - -func ChangeGraphType(g graph.Graph[pkg.Dependency, pkg.Dependency]) (graph.Graph[module.Version, module.Version], error) { - AdjacencyMap, err := g.AdjacencyMap() - if err != nil { - return nil, fmt.Errorf("failed to get adjacency map: %w", err) - } - - m := func(dep pkg.Dependency) module.Version { - return module.Version{Path: dep.Name, Version: dep.Version} - } - - moduleHash := func(m module.Version) module.Version { - return m - } - - depGraph := graph.New(moduleHash, graph.Directed(), graph.PreventCycles()) - for node, edges := range AdjacencyMap { - err := depGraph.AddVertex(m(node)) - if err != nil && err != graph.ErrVertexAlreadyExists { - return nil, fmt.Errorf("failed to add vertex: %w", err) - } - for edge := range edges { - err := depGraph.AddVertex(m(edge)) - if err != nil && err != graph.ErrVertexAlreadyExists { - return nil, fmt.Errorf("failed to add vertex: %w", err) - } - err = depGraph.AddEdge(m(node), m(edge)) - if err != nil { - return nil, fmt.Errorf("failed to add edge: %w", err) - } - } - } - return depGraph, nil -}