in internal/core/startup/installers.go [227:272]
func extractArchive(archivePath string, targetDir string, stripComponents int) error {
targetBasename := filepath.Base(targetDir)
if targetBasename == "." || targetBasename == "/" {
// filepath.Base returns either "." or "/" when the path has no basename.
return fmt.Errorf("invalid target directory")
}
tempDir, err := os.MkdirTemp("", fmt.Sprintf("%s-*.partial", targetBasename))
if err != nil {
return fmt.Errorf("failed to create temporary directory for extraction: %w", err)
}
defer func() {
if err := os.RemoveAll(tempDir); err != nil {
log.Warningf("failed to remove temporary directory: %s", err.Error())
}
}()
tarExe, err := exec.LookPath("tar")
if err != nil {
return fmt.Errorf("could not find 'tar': %w", err)
}
tarArgv := []string{tarExe, "-xf", strutil.GetQuotedPath(archivePath), "-C", strutil.GetQuotedPath(tempDir)}
if stripComponents > 0 {
tarArgv = append(tarArgv, "--strip-components", strconv.Itoa(stripComponents))
}
stdout, stderr, _, err := utils.RunCmdRedirectOutput("", tarArgv...)
if err != nil {
return fmt.Errorf("failed to extract: %w. Stdout: %s. Stderr: %s", err, stdout, stderr)
}
if err := os.RemoveAll(targetDir); err != nil {
return fmt.Errorf("failed to remove existing target directory: %w", err)
}
err = os.Rename(tempDir, targetDir)
if err != nil { // Trying to fallback if rename failed https://youtrack.jetbrains.com/issue/QD-12252
log.Warningf("Error moving linter files from temp to target: %s. Trying to copy instead.", err)
err = cp.Copy(tempDir, targetDir)
if err != nil {
return fmt.Errorf("error copying linter files from temp to target: %w", err)
}
}
return nil
}