in ideaSupport/src/main/scala/org/jetbrains/sbtidea/download/idea/IdeaDistInstaller.scala [23:90]
private def tmpDir(implicit ctx: IdeInstallationProcessContext): Path =
ctx.baseDirectory.getParent.resolve(s"${buildInfo.edition.name}-${buildInfo.buildNumber}-TMP")
private[idea] def installDist(artifact: Path)(implicit ctx: IdeInstallationProcessContext): Path = {
import org.jetbrains.sbtidea.Keys.IntelliJPlatform.MPS
import sys.process.*
log.info(s"Extracting ${buildInfo.edition.name} dist to $tmpDir")
ctx.baseDirectory.toFile.getParentFile.mkdirs() // ensure "sdk" directory exists
NioUtils.delete(tmpDir)
Files.createDirectories(tmpDir)
object Extensions {
val Zip = ".zip"
val TarGz = ".tar.gz"
val Dmg = ".dmg"
val all: Seq[String] = Seq(Zip, TarGz, Dmg)
}
val artifactFileName = artifact.getFileName.toString
if (artifactFileName.endsWith(Extensions.Zip)) {
val res = sbt.IO.unzip(artifact.toFile, tmpDir.toFile)
if (res.isEmpty)
throw new RuntimeException(s"Failed to unzip ${artifact.toFile} - bad archive")
} else if (artifactFileName.endsWith(Extensions.TarGz)) {
val rc = s"tar xfz $artifact -C $tmpDir --strip 1".!
if (rc != 0)
throw new RuntimeException(s"Failed to install ${buildInfo.edition.name} dist: tar command failed")
} else if (artifactFileName.endsWith(Extensions.Dmg)) {
// dmg will be installed in a single operation
} else {
throw new RuntimeException(s"Unexpected dist archive format: $artifactFileName. Supported formats: ${Extensions.all.mkString(",")}")
}
if (ctx.baseDirectory.exists) {
log.warn(s"IJ install directory already exists, removing... (${ctx.baseDirectory})")
NioUtils.delete(ctx.baseDirectory)
}
buildInfo.edition match {
case MPS if Files.list(tmpDir).count() == 1 => // MPS may add an additional folder level to the artifact
log.info("MPS detected: applying install dir quirks")
val actualDir = Files.list(tmpDir).iterator().next()
Files.move(actualDir, ctx.baseDirectory)
Files.deleteIfExists(tmpDir)
case _ =>
if (artifactFileName.endsWith(Extensions.Dmg)) {
installDmgApp(artifact, ctx.baseDirectory)
} else {
Files.move(tmpDir, ctx.baseDirectory)
}
}
fixAccessRights(ctx.baseDirectory)
addToolboxIgnoreFile(ctx.baseDirectory)
if (!keepDownloadedFiles) {
log.info(s"Deleting $artifact")
NioUtils.delete(artifact)
}
NioUtils.delete(tmpDir)
log.info(s"Installed ${buildInfo.edition.name}($buildInfo) to ${ctx.baseDirectory}")
ctx.baseDirectory
}