in internal/core/startup/installers.go [42:125]
func downloadAndInstallIDE(
analyser product.Analyzer,
baseDir string,
spinner *pterm.SpinnerPrinter,
) string {
var ideUrl string
checkSumUrl := ""
releaseDownloadInfo := getIde(analyser)
if releaseDownloadInfo == nil {
log.Fatalf("Error while obtaining the URL for the supplied IDE, exiting")
} else {
ideUrl = releaseDownloadInfo.Link
checkSumUrl = releaseDownloadInfo.ChecksumLink
}
fileName := filepath.Base(ideUrl)
fileExt := filepath.Ext(fileName)
installDir := filepath.Join(baseDir, strings.TrimSuffix(fileName, fileExt))
if _, err := os.Stat(installDir); err == nil {
switch runtime.GOOS {
case "windows":
if dirs, err := filepath.Glob(filepath.Join(installDir, "*")); err == nil && len(dirs) == 1 {
installDir = dirs[0]
}
case "darwin":
if dirs, err := filepath.Glob(filepath.Join(installDir, "*.app")); err == nil && len(dirs) == 1 {
installDir = filepath.Join(dirs[0], "Contents")
}
}
log.Debugf("IDE already installed to %s, skipping download", installDir)
return installDir
}
downloadedIdePath := filepath.Join(baseDir, fileName)
err := utils.DownloadFile(downloadedIdePath, ideUrl, getInternalAuth(), spinner)
if err != nil {
log.Fatalf("Error while downloading linter: %v", err)
}
defer func(filePath string) {
err = os.Remove(filePath)
if err != nil {
log.Warning("Error while removing temporary file: " + err.Error())
}
}(downloadedIdePath)
if checkSumUrl != "" {
checksumFilePath := filepath.Join(baseDir, strings.TrimSuffix(fileName, fileExt)+".sha256")
verifySha256(checksumFilePath, checkSumUrl, downloadedIdePath)
}
switch fileExt {
case ".sit":
err = installIdeFromZip(downloadedIdePath, installDir)
case ".zip":
err = installIdeFromZip(downloadedIdePath, installDir)
case ".exe":
err = installIdeWindowsExe(downloadedIdePath, installDir)
case ".gz":
err = installIdeFromTar(downloadedIdePath, installDir)
case ".dmg":
err = installIdeMacOS(downloadedIdePath, installDir)
default:
log.Fatalf("Unsupported file extension: %s", fileExt)
}
if err != nil {
log.Fatalf("Error while unpacking: %v", err)
}
switch runtime.GOOS {
case "windows":
if dirs, err := filepath.Glob(filepath.Join(installDir, "*")); err == nil && len(dirs) == 1 {
installDir = dirs[0]
}
case "darwin":
if dirs, err := filepath.Glob(filepath.Join(installDir, "*.app")); err == nil && len(dirs) == 1 {
installDir = filepath.Join(dirs[0], "Contents")
}
}
return installDir
}