From 15742e8f3fe119077c43707bef1292ce341ef710 Mon Sep 17 00:00:00 2001 From: mitch Date: Wed, 11 Sep 2024 20:27:10 -0400 Subject: [PATCH] Add error handling and improve comments Added fmt.Errorf for better error messages during HTTP and file handling in InstallTerraformVersion. Also fixed indentation in comments to follow Go conventions. Made other small improvements for better readability and maintainability. --- versionedTerraform.go | 62 +++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/versionedTerraform.go b/versionedTerraform.go index 4e62e16..647b7f7 100644 --- a/versionedTerraform.go +++ b/versionedTerraform.go @@ -5,6 +5,7 @@ import ( "bufio" "bytes" "errors" + "fmt" "io" "io/ioutil" "net/http" @@ -25,7 +26,7 @@ const ( versionedTerraformFolder = "/.versionedTerraform" ) -//getLatestMajorRelease() returns the latest major release from Version +// getLatestMajorRelease() returns the latest major release from Version func (v *Version) getLatestMajorRelease() { for _, release := range v.availableVersions { if release.majorVersion == v.Version.majorVersion && @@ -37,7 +38,7 @@ func (v *Version) getLatestMajorRelease() { } } -//getGreatestRelease() returns less than release +// getGreatestRelease() returns less than release func (v *Version) getOneLessRelease() { var vSlice []Version @@ -60,7 +61,7 @@ func (v *Version) getOneLessRelease() { } } -//getLatestRelease returns the latest release from Version +// getLatestRelease returns the latest release from Version func (v *Version) getLatestRelease() { for _, release := range v.availableVersions { if release.majorVersion > v.Version.majorVersion && @@ -81,8 +82,8 @@ func (v *Version) getLatestRelease() { } } -//InstallTerraformVersion installs the defined terraform Version in the application -//configuration directory +// InstallTerraformVersion installs the defined terraform Version in the application +// configuration directory func (v *Version) InstallTerraformVersion() error { homeDir, _ := os.UserHomeDir() suffix := fileSuffix @@ -90,56 +91,59 @@ func (v *Version) InstallTerraformVersion() error { if v.Version.IsLessThan(*minV) { suffix = alternateSuffix } - resp, err := http.Get(hashicorpUrl + + url := hashicorpUrl + v.Version.ToString() + "/" + terraformPrefix + v.Version.ToString() + - suffix) + suffix + + resp, err := http.Get(url) if err != nil { - return err + return fmt.Errorf("failed to download Terraform: %v", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - return err + return fmt.Errorf("failed to read response body: %v", err) } zipReader, err := zip.NewReader(bytes.NewReader(body), int64(len(body))) if err != nil { - return err + return fmt.Errorf("failed to create zip reader: %v", err) } + versionedFileName := homeDir + versionedTerraformFolder + "/" + terraformPrefix + v.Version.ToString() - versionedFile, err := os.OpenFile(versionedFileName, os.O_WRONLY, 0755) - if os.IsNotExist(err) { - versionedFile, err = os.OpenFile(versionedFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return err - } - } + versionedFile, err := os.OpenFile(versionedFileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { - return err + return fmt.Errorf("failed to create output file: %v", err) } defer versionedFile.Close() for _, zipFile := range zipReader.File { + if zipFile.Name != "terraform" { + continue + } + zr, err := zipFile.Open() if err != nil { - return err + return fmt.Errorf("failed to open zip file: %v", err) } - unzippedFileBytes, _ := ioutil.ReadAll(zr) + defer zr.Close() - _, err = versionedFile.Write(unzippedFileBytes) + _, err = io.Copy(versionedFile, zr) if err != nil { - return err + return fmt.Errorf("failed to write terraform binary: %v", err) } - zr.Close() + + break } + return nil } -//NewVersion creates a new Version using sem versioning for determining the -//latest release +// NewVersion creates a new Version using sem versioning for determining the +// latest release func NewVersion(_version string, _vList []string) *Version { v := new(Version) v.Version = *NewSemVersion(_version) @@ -202,7 +206,7 @@ func NewVersion(_version string, _vList []string) *Version { return v } -//GetVersionList returns a list of available versions from hashicorp's release page +// GetVersionList returns a list of available versions from hashicorp's release page func GetVersionList() ([]string, error) { var versionList []string resp, err := http.Get(hashicorpUrl) @@ -234,7 +238,7 @@ func GetVersionList() ([]string, error) { return versionList, nil } -//removeSpacesVersion removes spaces from Version string for parsing +// removeSpacesVersion removes spaces from Version string for parsing func removeSpacesVersion(v string) string { splitV := strings.Split(v, " ") var returnString string @@ -245,12 +249,12 @@ func removeSpacesVersion(v string) string { return strings.TrimSpace(returnString) } -//VersionToString returns string of a Version +// VersionToString returns string of a Version func (v *Version) VersionToString() string { return v.Version.ToString() } -//isVersionGreater returns true if v1 is greater than v2 +// isVersionGreater returns true if v1 is greater than v2 func isVersionGreater(v1 Version, v2 Version) bool { if v1.Version.majorVersion != v2.Version.majorVersion { if v1.Version.majorVersion > v2.Version.majorVersion {