Skip to content

Commit

Permalink
Merge pull request #358 from zong-zhe/refactor-parse-url
Browse files Browse the repository at this point in the history
refactor: refactor the function to parse KCL dependency url
  • Loading branch information
Peefy committed Jun 4, 2024
2 parents d7258bd + 433c658 commit 4244558
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 29 deletions.
74 changes: 46 additions & 28 deletions pkg/opt/opt.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,40 +196,66 @@ type RegistryOptions struct {
}

// NewRegistryOptionsFrom will parse the registry options from oci url, oci ref and git url.
// If you do not know the url of the package is git or oci, you can use this function to parse the options.
// By default:
// 'git://', "https://", "http://" will be parsed as git options.
// 'oci://', will be parsed as oci options.
// 'file://' or a file path will be parsed as local options.
//
// If you know the url is git or oci, you can use 'NewGitOptionsFromUrl' or 'NewOciOptionsFromUrl' to parse the options.
// 'oci' and 'http', 'https' are supported for 'NewOciOptionsFromUrl'.
// 'git', 'http', 'https', 'ssh' are supported for 'NewGitOptionsFromUrl'.
func NewRegistryOptionsFrom(rawUrlorOciRef string, settings *settings.Settings) (*RegistryOptions, error) {
parsedUrl, err := url.Parse(rawUrlorOciRef)
if err != nil {
return nil, err
}

// parse the options from the local file path
localOptions, err := NewLocalOptionsFromUrl(parsedUrl)
if localOptions != nil && err == (*reporter.KpmEvent)(nil) {
return &RegistryOptions{
Local: localOptions,
}, nil
if parsedUrl.Scheme == "" || parsedUrl.Scheme == constants.FileEntry {
localOptions, err := NewLocalOptionsFromUrl(parsedUrl)
if localOptions != nil && err == (*reporter.KpmEvent)(nil) {
return &RegistryOptions{
Local: localOptions,
}, nil
}
}

// parse the options from the git url
// https, http, git and ssh are supported
gitOptions := NewGitOptionsFromUrl(parsedUrl)

if gitOptions != nil {
return &RegistryOptions{
Git: gitOptions,
}, nil
if parsedUrl.Scheme == constants.GitScheme ||
parsedUrl.Scheme == constants.HttpScheme ||
parsedUrl.Scheme == constants.HttpsScheme ||
parsedUrl.Scheme == constants.SshScheme {
gitOptions := NewGitOptionsFromUrl(parsedUrl)

if gitOptions != nil {
return &RegistryOptions{
Git: gitOptions,
}, nil
}
}

// parse the options from the oci url
// oci is supported
ociOptions := NewOciOptionsFromUrl(parsedUrl)
if ociOptions == nil {
ociOptions, err = NewOciOptionsFromRef(rawUrlorOciRef, settings)
if err != nil {
return nil, err
if parsedUrl.Scheme == constants.OciScheme ||
parsedUrl.Scheme == constants.HttpScheme ||
parsedUrl.Scheme == constants.HttpsScheme {
ociOptions := NewOciOptionsFromUrl(parsedUrl)

if ociOptions != nil {
return &RegistryOptions{
Oci: ociOptions,
}, nil
}
}

// If all the url are invalid, try to parse the options from the oci ref.
ociOptions, err := NewOciOptionsFromRef(rawUrlorOciRef, settings)
if err != nil {
return nil, err
}

if ociOptions != nil {
return &RegistryOptions{
Oci: ociOptions,
Expand All @@ -242,13 +268,9 @@ func NewRegistryOptionsFrom(rawUrlorOciRef string, settings *settings.Settings)
// NewGitOptionsFromUrl will parse the git options from the git url.
// https, http, git and ssh are supported.
func NewGitOptionsFromUrl(parsedUrl *url.URL) *GitOptions {
if parsedUrl.Scheme != constants.GitScheme &&
parsedUrl.Scheme != constants.HttpScheme &&
parsedUrl.Scheme != constants.HttpsScheme &&
parsedUrl.Scheme != constants.SshScheme {
if parsedUrl.Scheme == "" {
return nil
}

return &GitOptions{
Url: parsedUrl.Host + parsedUrl.Path,
Branch: parsedUrl.Query().Get(constants.GitBranch),
Expand All @@ -258,12 +280,11 @@ func NewGitOptionsFromUrl(parsedUrl *url.URL) *GitOptions {
}

// NewOciOptionsFromUrl will parse the oci options from the oci url.
// oci is supported.
// https, http, oci is supported.
func NewOciOptionsFromUrl(parsedUrl *url.URL) *OciOptions {
if parsedUrl.Scheme != constants.OciScheme {
if parsedUrl.Scheme == "" {
return nil
}

return &OciOptions{
Reg: parsedUrl.Host,
Repo: parsedUrl.Path,
Expand Down Expand Up @@ -308,10 +329,7 @@ func NewOciOptionsFromRef(refStr string, settings *settings.Settings) (*OciOptio
// NewLocalOptionsFromUrl will parse the local options from the local path.
// scheme 'file' and only path is supported.
func NewLocalOptionsFromUrl(parsedUrl *url.URL) (*LocalOptions, error) {
if parsedUrl.Scheme == "" || parsedUrl.Scheme == constants.FileEntry {
return ParseLocalPathOptions(parsedUrl.Path)
}
return nil, nil
return ParseLocalPathOptions(parsedUrl.Path)
}

// parseOciPkgNameAndVersion will parse package name and version
Expand Down
26 changes: 25 additions & 1 deletion pkg/opt/opt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package opt

import (
"net/url"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -32,7 +33,7 @@ func TestInitOptions(t *testing.T) {
assert.Equal(t, o3.Validate(), errors.InvalidVersionFormat)
}

func TestNewOciOptionsFromRef(t *testing.T) {
func TestNewRegistryOptionsFromRef(t *testing.T) {
ref := "test:latest"
settings := settings.GetSettings()
opts, err := NewRegistryOptionsFrom(ref, settings)
Expand Down Expand Up @@ -62,3 +63,26 @@ func TestNewOciOptionsFromRef(t *testing.T) {
assert.Equal(t, opts.Git.Branch, "main")
assert.Equal(t, opts.Git.Url, "github.com/kcl-lang/test1")
}

func TestNewOciOptions(t *testing.T) {
parsedUrl, err := url.Parse("oci://docker.io/kcllang/test1?tag=0.0.1")
assert.Equal(t, err, nil)
ociOptions := NewOciOptionsFromUrl(parsedUrl)
assert.Equal(t, ociOptions.Tag, "0.0.1")
assert.Equal(t, ociOptions.Repo, "/kcllang/test1")
assert.Equal(t, ociOptions.Reg, "docker.io")

parsedUrl, err = url.Parse("http://docker.io/kcllang/test1?tag=0.0.1")
assert.Equal(t, err, nil)
ociOptions = NewOciOptionsFromUrl(parsedUrl)
assert.Equal(t, ociOptions.Tag, "0.0.1")
assert.Equal(t, ociOptions.Repo, "/kcllang/test1")
assert.Equal(t, ociOptions.Reg, "docker.io")

parsedUrl, err = url.Parse("https://docker.io/kcllang/test1?tag=0.0.1")
assert.Equal(t, err, nil)
ociOptions = NewOciOptionsFromUrl(parsedUrl)
assert.Equal(t, ociOptions.Tag, "0.0.1")
assert.Equal(t, ociOptions.Repo, "/kcllang/test1")
assert.Equal(t, ociOptions.Reg, "docker.io")
}

0 comments on commit 4244558

Please sign in to comment.