Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add mvs to update command #319

Merged
merged 3 commits into from
May 20, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,12 @@ func (c *KpmClient) UpdateDeps(kclPkg *pkg.KclPkg) error {
return err
}

// update kcl.mod
err = kclPkg.ModFile.StoreModFile()
if err != nil {
return err
}

// Generate file kcl.mod.lock.
if !kclPkg.NoSumCheck {
err := kclPkg.LockDepsVersion()
Expand Down
177 changes: 155 additions & 22 deletions pkg/cmd/cmd_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@
package cmd

import (
"fmt"
"os"
"slices"
"strings"

"github.com/dominikbraun/graph"
"github.com/urfave/cli/v2"
"golang.org/x/mod/module"
mvsExt "kcl-lang.io/kpm/pkg/3rdparty/mvs"
"kcl-lang.io/kpm/pkg/client"
"kcl-lang.io/kpm/pkg/env"
"kcl-lang.io/kpm/pkg/mvs"
pkg "kcl-lang.io/kpm/pkg/package"
"kcl-lang.io/kpm/pkg/reporter"
"kcl-lang.io/kpm/pkg/semver"
)

// NewUpdateCmd new a Command for `kpm update`.
Expand Down Expand Up @@ -48,39 +57,163 @@
}
}()

input_paths := c.Args().Slice()
pkgInfos := c.Args().Slice()

pkg_paths := []string{}
if len(input_paths) == 0 {
pwd, err := os.Getwd()
if err != nil {
return reporter.NewErrorEvent(reporter.Bug, err, "internal bugs, please contact us to fix it")
}
pkg_paths = append(pkg_paths, pwd)
} else {
pkg_paths = input_paths
pwd, err := os.Getwd()
if err != nil {
return reporter.NewErrorEvent(reporter.Bug, err, "internal bugs, please contact us to fix it.")
}

for _, pkg_path := range pkg_paths {
kclPkg, err := kpmcli.LoadPkgFromPath(pkg_path)
if err != nil {
return err
fetchNameAndVersion := func(pkgInfo string) (string, string) {
Peefy marked this conversation as resolved.
Show resolved Hide resolved
// the version is specified after :
if strings.Contains(pkgInfo, ":") {
return strings.Split(pkgInfo, ":")[0], strings.Split(pkgInfo, ":")[1]
}
return pkgInfo, ""
}

globalPkgPath, err := env.GetAbsPkgPath()
if err != nil {
return err
kclPkg, err := kpmcli.LoadPkgFromPath(pwd)
if err != nil {
return err
}

globalPkgPath, err := env.GetAbsPkgPath()
if err != nil {
return err
}

err = kclPkg.ValidateKpmHome(globalPkgPath)
if err != (*reporter.KpmEvent)(nil) {
return err
}

var (
modulesToUpgrade []module.Version
modulesToDowngrade []module.Version
)

// validate if the packages is present in kcl.mod file and
// find the latest version if version is not specified
for _, pkgInfo := range pkgInfos {
Peefy marked this conversation as resolved.
Show resolved Hide resolved
pkgInfo = strings.TrimSpace(pkgInfo)
pkgName, pkgVersion := fetchNameAndVersion(pkgInfo)

var dep pkg.Dependency
var ok bool
if dep, ok = kclPkg.Deps[pkgName]; !ok {
reporter.Report(fmt.Sprintf("package %s not found in kcl.mod file", pkgName))
continue
}

err = kclPkg.ValidateKpmHome(globalPkgPath)
if err != (*reporter.KpmEvent)(nil) {
return err
if pkgVersion == "" {
var releases []string
if dep.Git != nil {
releases, err = mvs.GetReleasesFromSource(dep.GetSourceType(), dep.Git.Url)
} else if dep.Oci != nil {
releases, err = mvs.GetReleasesFromSource(dep.GetSourceType(), "fjdkasd")
}
if err != nil {
reporter.ReportEventToStdout(reporter.NewEvent(
reporter.FailedGetReleases,
fmt.Sprintf("failed to get releases for %s", pkgName),
))
continue
}
pkgVersion, err = semver.LatestCompatibleVersion(releases, dep.Version)
if err != nil {
reporter.NewErrorEvent(

Check failure on line 124 in pkg/cmd/cmd_update.go

View workflow job for this annotation

GitHub Actions / Lint checks

Error return value of `reporter.NewErrorEvent` is not checked (errcheck)
reporter.FailedSelectLatestCompatibleVersion,
err,
fmt.Sprintf("failed to find the latest version for %s", pkgName),
)
continue
}
}
if pkgVersion < dep.Version {
modulesToDowngrade = append(modulesToDowngrade, module.Version{Path: pkgName, Version: pkgVersion})
} else if pkgVersion > dep.Version {
modulesToUpgrade = append(modulesToUpgrade, module.Version{Path: pkgName, Version: pkgVersion})
}
}

_, depGraph, err := kpmcli.InitGraphAndDownloadDeps(kclPkg)
if err != nil {
return err
}

reqs := mvs.ReqsGraph{
Graph: depGraph,
KpmClient: kpmcli,
KpmPkg: kclPkg,
}

target := module.Version{Path: kclPkg.GetPkgName(), Version: kclPkg.GetPkgVersion()}
buildList, err := UpdateBuildList(target, modulesToUpgrade, modulesToDowngrade, &reqs)
if err != nil {
return reporter.NewErrorEvent(reporter.FailedUpdatingBuildList, err, "failed to update build list")
}

modules, err := graph.TopologicalSort(depGraph)
if err != nil {
return reporter.NewErrorEvent(reporter.FailedTopologicalSort, err, "failed to sort the dependencies")
}

err = kpmcli.UpdateDeps(kclPkg)
kclPkg.ModFile.Dependencies.Deps = make(map[string]pkg.Dependency)
Peefy marked this conversation as resolved.
Show resolved Hide resolved

for _, module := range modules {
if module.Path == target.Path || !slices.Contains(buildList, module) {
continue
}
d := pkg.Dependency{
Name: module.Path,
Version: module.Version,
}
d.FullName = d.GenDepFullName()
_, properties, err := depGraph.VertexWithProperties(module)
if err != nil {
return err
return reporter.NewErrorEvent(reporter.FailedGetVertexProperties, err, "failed to get vertex with properties")
}
// there must be one property depending on the download source type
for sourceType, uri := range properties.Attributes {
d.Source, err = pkg.GenSource(sourceType, uri, module.Version)
if err != nil {
return reporter.NewErrorEvent(reporter.FailedGenerateSource, err, "failed to generate source")
}
// if d.Oci != nil && d.Oci.Reg == "ghcr.io" {
// d.Oci = nil
// }
}
kclPkg.ModFile.Dependencies.Deps[module.Path] = d
}

err = kpmcli.UpdateDeps(kclPkg)
if err != nil {
return err
}
return nil
}

func UpdateBuildList(target module.Version, modulesToUpgrade []module.Version, modulesToDowngrade []module.Version, reqs *mvs.ReqsGraph) ([]module.Version, error) {
Peefy marked this conversation as resolved.
Show resolved Hide resolved
var (
UpdBuildLists []module.Version
err error
)

if len(modulesToUpgrade) == 0 {
UpdBuildLists, err = mvsExt.UpgradeAll(target, reqs)
} else {
UpdBuildLists, err = mvsExt.Upgrade(target, reqs, modulesToUpgrade...)
}
if err != nil {
return []module.Version{}, err
}

if len(modulesToDowngrade) != 0 {
UpdBuildLists, err = mvsExt.Downgrade(target, reqs, modulesToDowngrade...)
}
if err != nil {
return []module.Version{}, err
}

return UpdBuildLists, nil
}
61 changes: 35 additions & 26 deletions pkg/mvs/mvs.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (

type ReqsGraph struct {
graph.Graph[module.Version, module.Version]
kpmClient *client.KpmClient
kpmPkg *pkg.KclPkg
KpmClient *client.KpmClient
KpmPkg *pkg.KclPkg
}

func (r ReqsGraph) Max(path, v1, v2 string) string {
Expand Down Expand Up @@ -50,9 +50,17 @@ func (r ReqsGraph) Upgrade(m module.Version) (module.Version, error) {
return module.Version{}, err
}

releases, err := getReleasesFromSource(properties)
if err != nil {
return module.Version{}, err
// there must be only one property depending on the download source type
if len(properties.Attributes) != 1 {
return module.Version{}, errInt.MultipleSources
}

var releases []string
for sourceType, uri := range properties.Attributes {
releases, err = GetReleasesFromSource(sourceType, uri)
if err != nil {
return module.Version{}, err
}
}

if releases == nil {
Expand Down Expand Up @@ -84,7 +92,7 @@ func (r ReqsGraph) Upgrade(m module.Version) (module.Version, error) {
lockDeps := pkg.Dependencies{
Deps: make(map[string]pkg.Dependency),
}
_, err = r.kpmClient.DownloadDeps(&deps, &lockDeps, r.Graph, r.kpmPkg.HomePath, module.Version{})
_, err = r.KpmClient.DownloadDeps(&deps, &lockDeps, r.Graph, r.KpmPkg.HomePath, module.Version{})
if err != nil {
return module.Version{}, err
}
Expand All @@ -98,9 +106,17 @@ func (r ReqsGraph) Previous(m module.Version) (module.Version, error) {
return module.Version{}, err
}

releases, err := getReleasesFromSource(properties)
if err != nil {
return module.Version{}, err
// there must be only one property depending on the download source type
if len(properties.Attributes) != 1 {
return module.Version{}, errInt.MultipleSources
}

var releases []string
for sourceType, uri := range properties.Attributes {
releases, err = GetReleasesFromSource(sourceType, uri)
if err != nil {
return module.Version{}, err
}
}

if releases == nil {
Expand Down Expand Up @@ -140,7 +156,7 @@ func (r ReqsGraph) Previous(m module.Version) (module.Version, error) {
lockDeps := pkg.Dependencies{
Deps: make(map[string]pkg.Dependency),
}
_, err = r.kpmClient.DownloadDeps(&deps, &lockDeps, r.Graph, r.kpmPkg.HomePath, module.Version{})
_, err = r.KpmClient.DownloadDeps(&deps, &lockDeps, r.Graph, r.KpmPkg.HomePath, module.Version{})
if err != nil {
return module.Version{}, err
}
Expand All @@ -160,26 +176,19 @@ func (r ReqsGraph) Required(m module.Version) ([]module.Version, error) {
return reqs, nil
}

func getReleasesFromSource(properties graph.VertexProperties) ([]string, error) {
func GetReleasesFromSource(sourceType, uri string) ([]string, error) {
var releases []string
var err error

// there must be only one property depending on the download source type
if len(properties.Attributes) != 1 {
return nil, errInt.MultipleSources
switch sourceType {
case pkg.GIT:
releases, err = git.GetAllGithubReleases(uri)
case pkg.OCI:
releases, err = oci.GetAllImageTags(uri)
}

for k, v := range properties.Attributes {
switch k {
case pkg.GIT:
releases, err = git.GetAllGithubReleases(v)
case pkg.OCI:
releases, err = oci.GetAllImageTags(v)
}
if err != nil {
return nil, err
}
if err != nil {
return nil, err
}

return releases, nil
}
}
5 changes: 5 additions & 0 deletions pkg/package/modfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ func GenSource(sourceType string, uri string, tagName string) (Source, error) {
}
source.Oci = &oci
}
if sourceType == LOCAL {
source.Local = &Local{
Path: uri,
}
}
return source, nil
}

Expand Down
6 changes: 6 additions & 0 deletions pkg/reporter/reporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ const (
FailedLoadCredential
FailedCreateOciClient
FailedSelectLatestVersion
FailedSelectLatestCompatibleVersion
FailedGetReleases
FailedTopologicalSort
FailedGetVertexProperties
FailedGenerateSource
FailedGetPackageVersions
FailedCreateStorePath
FailedPush
Expand All @@ -81,6 +86,7 @@ const (
WithoutGitTag
FailedCloneFromGit
FailedHashPkg
FailedUpdatingBuildList
Bug

// normal event type means the event is a normal event.
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
adding 'k8s' with version '1.14'
downloading 'test/k8s:1.14' from 'localhost:5001/test/k8s:1.14'
Loading