From 6157ed66a059a66e5dda717307d43a246188530e Mon Sep 17 00:00:00 2001 From: DataHearth Date: Mon, 21 Aug 2023 16:59:05 +0200 Subject: [PATCH] fix: newer golang archive aren't decompressed correctly --- cmd/cmd.go | 2 +- pkg/release.go | 35 +++++++++++++++++++++++++++++++---- pkg/tags.go | 8 ++++---- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index f394db4..2b383ae 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -305,7 +305,7 @@ func ls(ctx *cli.Context) error { for _, i := range items { if i.IsDir() && i.Name() != "go" { - fmt.Println(i.Name()) + fmt.Println(strings.Replace(i.Name(), "go", "", 1)) } } diff --git a/pkg/release.go b/pkg/release.go index b6cf428..bfce5c9 100644 --- a/pkg/release.go +++ b/pkg/release.go @@ -54,7 +54,7 @@ func (d *Release) DownloadRelease() error { // downloadFile downloads the file to the given writer func (d *Release) downloadFile(f *os.File) error { - s := spinner.New(spinner.CharSets[35], 100*time.Millisecond) + s := spinner.New(spinner.CharSets[14], 100*time.Millisecond) s.Suffix = " Downloading release..." s.Start() defer s.Stop() @@ -110,9 +110,11 @@ func (d *Release) ExtractRelease() error { // skip first folder if start { - rootFolder = h.Name + rootFolder = strings.Split(h.Name, string(os.PathSeparator))[0] start = false - continue + if h.Typeflag == tar.TypeDir { + continue + } } target := filepath.Join(d.releaseFolder, strings.Replace(h.Name, rootFolder, "", 1)) @@ -124,7 +126,19 @@ func (d *Release) ExtractRelease() error { case tar.TypeReg: file, err := os.OpenFile(target, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, h.FileInfo().Mode()) if err != nil { - return err + // for 1.21.xx, folder aren't detected as tar.TypeDir + if os.IsNotExist(err) { + if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil { + return err + } + + file, err = os.OpenFile(target, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, h.FileInfo().Mode()) + if err != nil { + return err + } + } else { + return err + } } if _, err = io.Copy(file, tarReader); err != nil { @@ -152,6 +166,19 @@ func (d *Release) CheckReleaseExists() error { return ErrReleaseNotFound } + entries, err := os.ReadDir(d.releaseFolder) + if err != nil { + return err + } + + if len(entries) == 0 { + if err := os.RemoveAll(d.releaseFolder); err != nil { + return err + } + + return ErrReleaseNotFound + } + return nil } diff --git a/pkg/tags.go b/pkg/tags.go index 5c44925..a7a01b3 100644 --- a/pkg/tags.go +++ b/pkg/tags.go @@ -23,7 +23,7 @@ type Tags struct { } func NewTags(release string, ctx context.Context) TagsAction { - return Tags{ + return &Tags{ release: release, client: *github.NewClient(nil), ctx: ctx, @@ -34,7 +34,7 @@ func NewTags(release string, ctx context.Context) TagsAction { // the given release exists in it // // Returns the found release or an error -func (t Tags) GetRelease(beta, rc bool) (string, error) { +func (t *Tags) GetRelease(beta, rc bool) (string, error) { if t.release == LTS { return t.getLatestTag(beta, rc) } @@ -91,7 +91,7 @@ func (t Tags) GetRelease(beta, rc bool) (string, error) { // // Returns a list of tags reference if there is as least one // or an error otherwise. -func (t Tags) GetTagsRef() ([]*github.Reference, error) { +func (t *Tags) GetTagsRef() ([]*github.Reference, error) { refs, response, err := t.client.Git.ListMatchingRefs(t.ctx, "golang", "go", &github.ReferenceListOptions{ Ref: "tags/go", }) @@ -113,7 +113,7 @@ func (t Tags) GetTagsRef() ([]*github.Reference, error) { // beta and rc version can be specified. // // Returns the latest release or an error -func (t Tags) getLatestTag(beta, rc bool) (string, error) { +func (t *Tags) getLatestTag(beta, rc bool) (string, error) { refs, err := t.GetTagsRef() if err != nil { if err == ErrEmptyTags {