diff --git a/.gitignore b/.gitignore index 3b3e1459..ffc377f8 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ cmd/errorutil/errorutil **errorutil_errors_export.json *.DS_Store coverage.txt +.idea diff --git a/generators/github/git_repo_test.go b/generators/github/git_repo_test.go new file mode 100644 index 00000000..81e4bf14 --- /dev/null +++ b/generators/github/git_repo_test.go @@ -0,0 +1,21 @@ +package github + +import ( + "net/url" + "testing" +) + +func TestGetVersion(t *testing.T) { + gitProtoString := "git://github.com/kubernetes-sigs/metrics-server/master/charts" + parsedUrl, _ := url.Parse(gitProtoString) + testData := NewDownloaderForScheme("git", parsedUrl, "metrics-server") + output, _ := testData.GetContent() + + if output == nil { + t.Fatalf("Expected non-nil data, got nil") + } + + if version := output.GetVersion(); version != "metrics-server-helm-chart-3.12.1" { + t.Errorf("Expected version metrics-server-helm-chart-3.12.1, got %s", version) + } +} diff --git a/generators/github/url.go b/generators/github/url.go index 89541251..be6f6480 100644 --- a/generators/github/url.go +++ b/generators/github/url.go @@ -2,6 +2,7 @@ package github import ( "bufio" + "fmt" "io" "net/url" @@ -19,7 +20,7 @@ type URL struct { PackageName string } -// < http/https://url/version> +// < http/https://url/ > //close the descriptors func (u URL) GetContent() (models.Package, error) { @@ -27,7 +28,13 @@ func (u URL) GetContent() (models.Package, error) { _ = os.MkdirAll(downloadDirPath, 0755) url := u.URL.String() - version := url[strings.LastIndex(url, "/")+1:] + owner, repo, errr := extractDetail(url) + versions, errr := utils.GetLatestReleaseTagsSorted(owner, repo) + if errr != nil { + return nil, ErrInvalidGitHubSourceURL(errr) + } + version := versions[len(versions)-1] + url, _ = strings.CutSuffix(url, "/"+version) fileName := utils.GetRandomAlphabetsOfDigit(6) @@ -61,6 +68,18 @@ func (u URL) GetContent() (models.Package, error) { }, nil } +func extractDetail(url string) (owner string, repo string, err error) { + parts := strings.SplitN(strings.TrimPrefix(url, "/"), "/", 5) + size := len(parts) + if size > 4 { + owner = parts[3] + repo = parts[4] + } else { + err = ErrInvalidGitHubSourceURL(fmt.Errorf("Source URL %s is invalid", url)) + } + return +} + func ProcessContent(w io.Writer, downloadDirPath, downloadfilePath string) error { var err error if utils.IsTarGz(downloadfilePath) { diff --git a/generators/github/url_test.go b/generators/github/url_test.go new file mode 100644 index 00000000..ff70069c --- /dev/null +++ b/generators/github/url_test.go @@ -0,0 +1,21 @@ +package github + +import ( + "net/url" + "testing" +) + +func TestURL_GetVersion(t *testing.T) { + UrlString := "https://github.com/kubernetes-sigs/metrics-server" + parsedUrl, _ := url.Parse(UrlString) + testData := NewDownloaderForScheme("https", parsedUrl, "metrics-server") + output, _ := testData.GetContent() + + if output == nil { + t.Fatalf("Expected non-nil data, got nil") + } + + if version := output.GetVersion(); version != "metrics-server-helm-chart-3.12.1" { + t.Errorf("Expected version metrics-server-helm-chart-3.12.1, got %s", version) + } +}