Skip to content

Commit

Permalink
releasesjson: refactor to allow paths for removal to be returned
Browse files Browse the repository at this point in the history
Note this will also aid us to return other metadata such as version as per #201
  • Loading branch information
radeksimko committed May 7, 2024
1 parent 02984a8 commit 94e8e0b
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 30 deletions.
6 changes: 3 additions & 3 deletions checkpoint/latest_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ func (lv *LatestVersion) Install(ctx context.Context) (string, error) {
if lv.ArmoredPublicKey != "" {
d.ArmoredPublicKey = lv.ArmoredPublicKey
}
zipFilePath, err := d.DownloadAndUnpack(ctx, pv, dstDir, "")
if zipFilePath != "" {
lv.pathsToRemove = append(lv.pathsToRemove, zipFilePath)
up, err := d.DownloadAndUnpack(ctx, pv, dstDir, "")
if up != nil {
lv.pathsToRemove = append(lv.pathsToRemove, up.PathsToRemove...)
}
if err != nil {
return "", err
Expand Down
49 changes: 28 additions & 21 deletions internal/releasesjson/downloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,18 @@ type Downloader struct {
BaseURL string
}

func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, binDir string, licenseDir string) (zipFilePath string, err error) {
type UnpackedProduct struct {
PathsToRemove []string
}

func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion, binDir string, licenseDir string) (up *UnpackedProduct, err error) {
if len(pv.Builds) == 0 {
return "", fmt.Errorf("no builds found for %s %s", pv.Name, pv.Version)
return nil, fmt.Errorf("no builds found for %s %s", pv.Name, pv.Version)
}

pb, ok := pv.Builds.FilterBuild(runtime.GOOS, runtime.GOARCH, "zip")
if !ok {
return "", fmt.Errorf("no ZIP archive found for %s %s %s/%s",
return nil, fmt.Errorf("no ZIP archive found for %s %s %s/%s",
pv.Name, pv.Version, runtime.GOOS, runtime.GOARCH)
}

Expand All @@ -49,12 +53,12 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,
}
verifiedChecksums, err := v.DownloadAndVerifyChecksums(ctx)
if err != nil {
return "", err
return nil, err
}
var ok bool
verifiedChecksum, ok = verifiedChecksums[pb.Filename]
if !ok {
return "", fmt.Errorf("no checksum found for %q", pb.Filename)
return nil, fmt.Errorf("no checksum found for %q", pb.Filename)
}
}

Expand All @@ -66,12 +70,12 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,
// are still pointing to the mock server if one is set
baseURL, err := url.Parse(d.BaseURL)
if err != nil {
return "", err
return nil, err
}

u, err := url.Parse(archiveURL)
if err != nil {
return "", err
return nil, err
}
u.Scheme = baseURL.Scheme
u.Host = baseURL.Host
Expand All @@ -82,15 +86,15 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,

req, err := http.NewRequestWithContext(ctx, http.MethodGet, archiveURL, nil)
if err != nil {
return "", fmt.Errorf("failed to create request for %q: %w", archiveURL, err)
return nil, fmt.Errorf("failed to create request for %q: %w", archiveURL, err)
}
resp, err := client.Do(req)
if err != nil {
return "", err
return nil, err
}

if resp.StatusCode != 200 {
return "", fmt.Errorf("failed to download ZIP archive from %q: %s", archiveURL, resp.Status)
return nil, fmt.Errorf("failed to download ZIP archive from %q: %s", archiveURL, resp.Status)
}

defer resp.Body.Close()
Expand All @@ -99,19 +103,22 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,

contentType := resp.Header.Get("content-type")
if !contentTypeIsZip(contentType) {
return "", fmt.Errorf("unexpected content-type: %s (expected any of %q)",
return nil, fmt.Errorf("unexpected content-type: %s (expected any of %q)",
contentType, zipMimeTypes)
}

expectedSize := resp.ContentLength

pkgFile, err := os.CreateTemp("", pb.Filename)
if err != nil {
return "", err
return nil, err
}
defer pkgFile.Close()
pkgFilePath, err := filepath.Abs(pkgFile.Name())

up = &UnpackedProduct{}
up.PathsToRemove = append(up.PathsToRemove, pkgFilePath)

d.Logger.Printf("copying %q (%d bytes) to %s", pb.Filename, expectedSize, pkgFile.Name())

var bytesCopied int64
Expand All @@ -122,35 +129,35 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,

bytesCopied, err = io.Copy(h, r)
if err != nil {
return "", err
return nil, err
}

calculatedSum := h.Sum(nil)
if !bytes.Equal(calculatedSum, verifiedChecksum) {
return pkgFilePath, fmt.Errorf(
return up, fmt.Errorf(
"checksum mismatch (expected: %x, got: %x)",
verifiedChecksum, calculatedSum,
)
}
} else {
bytesCopied, err = io.Copy(pkgFile, pkgReader)
if err != nil {
return pkgFilePath, err
return up, err
}
}

d.Logger.Printf("copied %d bytes to %s", bytesCopied, pkgFile.Name())

if expectedSize != 0 && bytesCopied != int64(expectedSize) {
return pkgFilePath, fmt.Errorf(
return up, fmt.Errorf(
"unexpected size (downloaded: %d, expected: %d)",
bytesCopied, expectedSize,
)
}

r, err := zip.OpenReader(pkgFile.Name())
if err != nil {
return pkgFilePath, err
return up, err
}
defer r.Close()

Expand All @@ -162,7 +169,7 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,
}
srcFile, err := f.Open()
if err != nil {
return pkgFilePath, err
return up, err
}

// Determine the appropriate destination file path
Expand All @@ -175,18 +182,18 @@ func (d *Downloader) DownloadAndUnpack(ctx context.Context, pv *ProductVersion,
dstPath := filepath.Join(dstDir, f.Name)
dstFile, err := os.Create(dstPath)
if err != nil {
return pkgFilePath, err
return up, err
}

_, err = io.Copy(dstFile, srcFile)
if err != nil {
return pkgFilePath, err
return up, err
}
srcFile.Close()
dstFile.Close()
}

return pkgFilePath, nil
return up, nil
}

// The production release site uses consistent single mime type
Expand Down
6 changes: 3 additions & 3 deletions releases/exact_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,9 @@ func (ev *ExactVersion) Install(ctx context.Context) (string, error) {
if ev.Enterprise != nil {
licenseDir = ev.Enterprise.LicenseDir
}
zipFilePath, err := d.DownloadAndUnpack(ctx, pv, dstDir, licenseDir)
if zipFilePath != "" {
ev.pathsToRemove = append(ev.pathsToRemove, zipFilePath)
up, err := d.DownloadAndUnpack(ctx, pv, dstDir, licenseDir)
if up != nil {
ev.pathsToRemove = append(ev.pathsToRemove, up.PathsToRemove...)
}
if err != nil {
return "", err
Expand Down
6 changes: 3 additions & 3 deletions releases/latest_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,9 @@ func (lv *LatestVersion) Install(ctx context.Context) (string, error) {
if lv.Enterprise != nil {
licenseDir = lv.Enterprise.LicenseDir
}
zipFilePath, err := d.DownloadAndUnpack(ctx, versionToInstall, dstDir, licenseDir)
if zipFilePath != "" {
lv.pathsToRemove = append(lv.pathsToRemove, zipFilePath)
up, err := d.DownloadAndUnpack(ctx, versionToInstall, dstDir, licenseDir)
if up != nil {
lv.pathsToRemove = append(lv.pathsToRemove, up.PathsToRemove...)
}
if err != nil {
return "", err
Expand Down

0 comments on commit 94e8e0b

Please sign in to comment.