func getGoVersionFromGitHubRelease()

in tools/version-tracker/pkg/github/github.go [358:430]


func getGoVersionFromGitHubRelease(release *github.RepositoryRelease, projectFullName, latestRevision string) (string, error) {
	var tarballName, tarballUrl string
	projectReleaseAsset := constants.ProjectReleaseAssets[projectFullName]
	searchAssetName := projectReleaseAsset.AssetName
	assetVersionReplacement := latestRevision
	if constants.ProjectReleaseAssets[projectFullName].TrimLeadingVersionPrefix {
		assetVersionReplacement = latestRevision[1:]
	}
	if strings.Count(searchAssetName, "%s") > 0 {
		searchAssetName = fmt.Sprintf(searchAssetName, assetVersionReplacement)
	}
	if projectReleaseAsset.OverrideAssetURL != "" {
		tarballName = searchAssetName
		tarballUrl = projectReleaseAsset.OverrideAssetURL
		if strings.Count(tarballUrl, "%s") > 0 {
			tarballUrl = fmt.Sprintf(tarballUrl, assetVersionReplacement)
		}
	} else {
		for _, asset := range release.Assets {
			if *asset.Name == searchAssetName {
				tarballName = *asset.Name
				tarballUrl = *asset.BrowserDownloadURL
				break
			}
		}
	}

	cwd, err := os.Getwd()
	if err != nil {
		return "", fmt.Errorf("retrieving current working directory: %v", err)
	}

	tarballDownloadPath := filepath.Join(cwd, "github-release-downloads")
	err = os.MkdirAll(tarballDownloadPath, 0o755)
	if err != nil {
		return "", fmt.Errorf("failed to create GitHub release downloads folder: %v", err)
	}
	tarballFilePath := filepath.Join(tarballDownloadPath, tarballName)

	err = file.Download(tarballUrl, tarballFilePath)
	if err != nil {
		return "", fmt.Errorf("downloading release tarball from URL [%s]: %v", tarballUrl, err)
	}

	binaryName := projectReleaseAsset.BinaryName
	if strings.Count(binaryName, "%s") > 0 {
		binaryName = fmt.Sprintf(binaryName, assetVersionReplacement)
	}
	if projectReleaseAsset.Extract {
		tarballFile, err := os.Open(tarballFilePath)
		if err != nil {
			return "", fmt.Errorf("opening tarball filepath: %v", err)
		}

		err = tar.ExtractFileFromTarball(tarballDownloadPath, tarballFile, binaryName)
		if err != nil {
			return "", fmt.Errorf("extracting tarball file: %v", err)
		}
	}

	binaryFilePath := filepath.Join(tarballDownloadPath, binaryName)
	goVersion, err := version.GetGoVersion(binaryFilePath)
	if err != nil {
		return "", fmt.Errorf("getting Go version embedded in binary [%s]: %v", binaryFilePath, err)
	}

	err = os.RemoveAll(tarballDownloadPath)
	if err != nil {
		return "", fmt.Errorf("removing tarball download path: %v", err)
	}

	return goVersion, nil
}