diff --git a/pkg/client/run_test.go b/pkg/client/run_test.go new file mode 100644 index 00000000..d617d190 --- /dev/null +++ b/pkg/client/run_test.go @@ -0,0 +1,47 @@ +package client + +import ( + "bytes" + "os" + "testing" + + "gotest.tools/v3/assert" + "kcl-lang.io/kpm/pkg/downloader" + "kcl-lang.io/kpm/pkg/utils" +) + +func TestFixAddGitDep(t *testing.T) { + modPath := getTestDir("test_add_git_dep") + kpmcli, err := NewKpmClient() + if err != nil { + t.Fatal(err) + } + + tmpKpmHome, err := os.MkdirTemp("", "kpm_home") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpKpmHome) + + kpmcli.SetHomePath(tmpKpmHome) + + var buf bytes.Buffer + kpmcli.SetLogWriter(&buf) + + res, err := kpmcli.Run( + WithRunSource( + &downloader.Source{ + Local: &downloader.Local{ + Path: modPath, + }, + }, + ), + ) + + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, utils.RmNewline(res.GetRawYamlResult()), "name: flask_manifestsreplicas: 1labels: app: flask_manifests") + assert.Equal(t, buf.String(), "cloning 'git://github.com/kcl-lang/flask-demo-kcl-manifests.git' with tag 'v0.1.0'\n") +} diff --git a/pkg/client/test_data/test_add_git_dep/kcl.mod b/pkg/client/test_data/test_add_git_dep/kcl.mod new file mode 100644 index 00000000..a66332ce --- /dev/null +++ b/pkg/client/test_data/test_add_git_dep/kcl.mod @@ -0,0 +1,8 @@ +[package] +name = "test_add_git_dep" +edition = "v0.11.0" +version = "0.0.1" + +[dependencies] +flask_manifests = { git = "git://github.com/kcl-lang/flask-demo-kcl-manifests.git", tag = "v0.1.0" } + diff --git a/pkg/client/test_data/test_add_git_dep/kcl.mod.lock b/pkg/client/test_data/test_add_git_dep/kcl.mod.lock new file mode 100644 index 00000000..4ecd3536 --- /dev/null +++ b/pkg/client/test_data/test_add_git_dep/kcl.mod.lock @@ -0,0 +1,7 @@ +[dependencies] + [dependencies.flask_manifests] + name = "flask_manifests" + full_name = "flask_manifests_0.0.1" + version = "0.0.1" + url = "git://github.com/kcl-lang/flask-demo-kcl-manifests.git" + git_tag = "v0.1.0" diff --git a/pkg/client/test_data/test_add_git_dep/main.k b/pkg/client/test_data/test_add_git_dep/main.k new file mode 100644 index 00000000..e4c84f67 --- /dev/null +++ b/pkg/client/test_data/test_add_git_dep/main.k @@ -0,0 +1,5 @@ +import flask_manifests.app + +app.App{ + name: "flask_manifests", +} \ No newline at end of file diff --git a/pkg/downloader/downloader.go b/pkg/downloader/downloader.go index 2369e3d0..73b5e9a1 100644 --- a/pkg/downloader/downloader.go +++ b/pkg/downloader/downloader.go @@ -240,11 +240,17 @@ func (d *GitDownloader) Download(opts DownloadOptions) error { return errors.New("git source is nil") } - _, err := git.CloneWithOpts( + // get the canonicalized git url + gitUrl, err := gitSource.GetCanonicalizedUrl() + if err != nil { + return err + } + + _, err = git.CloneWithOpts( git.WithCommit(gitSource.Commit), git.WithBranch(gitSource.Branch), git.WithTag(gitSource.Tag), - git.WithRepoURL(gitSource.Url), + git.WithRepoURL(gitUrl), git.WithLocalPath(opts.LocalPath), ) diff --git a/pkg/downloader/source.go b/pkg/downloader/source.go index 5cec444e..e0b16445 100644 --- a/pkg/downloader/source.go +++ b/pkg/downloader/source.go @@ -41,6 +41,21 @@ type Git struct { Version string `toml:"version,omitempty"` } +// Transform the git url to the canonicalized url. +func (git *Git) GetCanonicalizedUrl() (string, error) { + url, err := url.Parse(git.Url) + if err != nil { + return "", err + } + + // If the scheme is git, change it to https + if url.Scheme == constants.GitScheme { + url.Scheme = constants.HttpsScheme + } + + return url.String(), nil +} + type Registry struct { *Oci `toml:"-"` Name string `toml:"-"`