Skip to content

Commit 389909e

Browse files
authored
fix(download): Download newest build (#17)
* when multiple builds are available for a given version, the oldest was selected * mostly (only?) relevant for internal builds (e.g. master) Card: [869adut7a](https://app.clickup.com/t/869adut7a)
1 parent e858015 commit 389909e

File tree

7 files changed

+44
-33
lines changed

7 files changed

+44
-33
lines changed

cli/cmd/testdata/testcli.tar.gz

-1 Bytes
Binary file not shown.

cli/cmd/update.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ func AddUpdateCmd(rootCmd *cobra.Command) {
4545
func (c *UpdateCmd) SelfUpdate(p portal.Portal) error {
4646
currentVersion := semver.MustParse(c.Version.Version())
4747

48-
latest, err := p.GetLatestBuild(portal.OmsProduct)
48+
latest, err := p.GetLatestBuild(portal.OmsProduct, "")
4949
if err != nil {
50-
return fmt.Errorf("failed to OMS Portal for latest version: %w", err)
50+
return fmt.Errorf("failed to query OMS Portal for latest version: %w", err)
5151
}
5252
latestVersion := semver.MustParse(strings.TrimPrefix(latest.Version, "oms-v"))
5353

cli/cmd/update_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ var _ = Describe("Update", func() {
6363
mockVersion.EXPECT().Arch().Return("fakearch")
6464
mockVersion.EXPECT().Version().Return("0.0.0")
6565
mockVersion.EXPECT().Os().Return("fakeos")
66-
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct).Return(latestBuild, nil)
66+
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct, "").Return(latestBuild, nil)
6767
mockPortal.EXPECT().DownloadBuildArtifact(portal.OmsProduct, buildToDownload, mock.Anything).RunAndReturn(
6868
func(product portal.Product, build portal.Build, file io.Writer) error {
6969
embeddedFile, err := testdata.Open("testdata/testcli.tar.gz")
@@ -90,7 +90,7 @@ var _ = Describe("Update", func() {
9090

9191
It("Detects when current verison is latest version", func() {
9292
mockVersion.EXPECT().Version().Return(latestBuild.Version)
93-
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct).Return(latestBuild, nil)
93+
mockPortal.EXPECT().GetLatestBuild(portal.OmsProduct, "").Return(latestBuild, nil)
9494
err := c.SelfUpdate(mockPortal)
9595
Expect(err).NotTo(HaveOccurred())
9696
})

internal/portal/http.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717

1818
type Portal interface {
1919
DownloadBuildArtifact(product Product, build Build, file io.Writer) error
20-
GetLatestBuild(product Product) (Build, error)
20+
GetLatestBuild(product Product, version string) (Build, error)
2121
}
2222

2323
type PortalClient struct {
@@ -122,18 +122,12 @@ func (c *PortalClient) ListBuilds(product Product) (availablePackages Builds, er
122122
}
123123

124124
func (c *PortalClient) GetCodesphereBuildByVersion(version string) (Build, error) {
125-
packages, err := c.ListBuilds(CodesphereProduct)
125+
latestBuild, err := c.GetLatestBuild(CodesphereProduct, version)
126126
if err != nil {
127-
return Build{}, fmt.Errorf("failed to list Codesphere packages: %w", err)
127+
return Build{}, fmt.Errorf("failed to get latest build for version %s: %w", version, err)
128128
}
129129

130-
for _, build := range packages.Builds {
131-
if build.Version == version {
132-
return build, nil
133-
}
134-
}
135-
136-
return Build{}, fmt.Errorf("version %s not found", version)
130+
return latestBuild, nil
137131
}
138132

139133
func compareBuilds(l, r Build) int {
@@ -170,7 +164,7 @@ func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file
170164
return nil
171165
}
172166

173-
func (c *PortalClient) GetLatestBuild(product Product) (Build, error) {
167+
func (c *PortalClient) GetLatestBuild(product Product, version string) (Build, error) {
174168
packages, err := c.ListBuilds(product)
175169
if err != nil {
176170
return Build{}, fmt.Errorf("failed to list %s packages: %w", product, err)
@@ -180,8 +174,24 @@ func (c *PortalClient) GetLatestBuild(product Product) (Build, error) {
180174
return Build{}, errors.New("no builds returned")
181175
}
182176

183-
// Builds are always ordered by date, newest build is latest version
184-
return packages.Builds[len(packages.Builds)-1], nil
177+
if version == "" {
178+
return packages.Builds[len(packages.Builds)-1], nil
179+
}
180+
181+
matchingPackages := []Build{}
182+
for _, build := range packages.Builds {
183+
if build.Version == version {
184+
// Builds are always ordered by date, newest build is latest version
185+
matchingPackages = append(matchingPackages, build)
186+
}
187+
}
188+
189+
if len(matchingPackages) == 0 {
190+
return Build{}, fmt.Errorf("version %s not found", version)
191+
}
192+
193+
// Builds are always ordered by date, return newest build
194+
return matchingPackages[len(matchingPackages)-1], nil
185195
}
186196

187197
// WriteCounter is a custom io.Writer that counts bytes written and logs progress.

internal/portal/http_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ var _ = Describe("PortalClient", func() {
195195
It("returns an error and an empty build", func() {
196196
expectedResult := portal.Build{}
197197
packages, err := client.GetCodesphereBuildByVersion("1.42.3")
198-
Expect(err).To(MatchError("version 1.42.3 not found"))
198+
Expect(err.Error()).To(MatchRegexp(".*version 1.42.3 not found"))
199199
Expect(packages).To(Equal(expectedResult))
200200
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/codesphere"))
201201
})
@@ -278,7 +278,7 @@ var _ = Describe("PortalClient", func() {
278278
Date: lastBuild,
279279
Version: "1.42.1",
280280
}
281-
packages, err := client.GetLatestBuild(portal.OmsProduct)
281+
packages, err := client.GetLatestBuild(portal.OmsProduct, "")
282282
Expect(err).NotTo(HaveOccurred())
283283
Expect(packages).To(Equal(expectedResult))
284284
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/oms"))
@@ -296,7 +296,7 @@ var _ = Describe("PortalClient", func() {
296296
})
297297
It("returns an error and an empty build", func() {
298298
expectedResult := portal.Build{}
299-
packages, err := client.GetLatestBuild(portal.OmsProduct)
299+
packages, err := client.GetLatestBuild(portal.OmsProduct, "")
300300
Expect(err).To(MatchError("no builds returned"))
301301
Expect(packages).To(Equal(expectedResult))
302302
Expect(getUrl.String()).To(Equal("fake-portal.com/packages/oms"))

internal/portal/mocks.go

Lines changed: 14 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
1 Byte
Binary file not shown.

0 commit comments

Comments
 (0)