Skip to content

Commit

Permalink
Merge pull request #1122 from wleczny/uninstall-command
Browse files Browse the repository at this point in the history
Uninstall command
  • Loading branch information
wleczny authored Jun 30, 2022
2 parents 28bedb3 + e97c105 commit a3718c9
Show file tree
Hide file tree
Showing 9 changed files with 344 additions and 2 deletions.
6 changes: 6 additions & 0 deletions modules/build/src/main/scala/scala/build/Directories.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ trait Directories {
def bloopDaemonDir: os.Path
def bloopWorkingDir: os.Path
def secretsDir: os.Path
def cacheDir: os.Path
}

object Directories {
Expand Down Expand Up @@ -41,6 +42,9 @@ object Directories {
}
lazy val secretsDir: os.Path =
os.Path(projDirs.dataLocalDir, Os.pwd) / "secrets"

lazy val cacheDir: os.Path =
os.Path(projDirs.cacheDir, os.pwd)
}

final case class SubDir(dir: os.Path) extends Directories {
Expand All @@ -60,6 +64,8 @@ object Directories {
dir / "data-local" / "bloop"
lazy val secretsDir: os.Path =
dir / "data-local" / "secrets"
lazy val cacheDir: os.Path =
dir / "cache"
}

def default(): Directories = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ final case class BloopExitOptions(
object BloopExitOptions {
implicit lazy val parser: Parser[BloopExitOptions] = Parser.derive
implicit lazy val help: Help[BloopExitOptions] = Help.derive
// Parser.Aux for using BloopExitOptions with @Recurse in other options
implicit lazy val parserAux: Parser.Aux[BloopExitOptions, parser.D] = parser
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package scala.cli.commands

import caseapp._

import java.nio.file.Path

// format: off
@HelpMessage("Unistall scala-cli - only works when installed by the installation script")
final case class UninstallOptions(
@Recurse
bloopExit: BloopExitOptions = BloopExitOptions(),
@Group("Uninstall")
@Name("f")
@HelpMessage("Force scala-cli uninstall")
force: Boolean = false,
@Hidden
@HelpMessage("Don't clear scala-cli cache")
skipCache: Boolean = false,
@Hidden
@HelpMessage("Binary name")
binaryName: String = "scala-cli",
@Hidden
@HelpMessage("Binary directory")
binDir: Option[String] = None
) {
// format: on
lazy val binDirPath = binDir.map(os.Path(_, os.pwd))
}

object UninstallOptions {
implicit lazy val parser: Parser[UninstallOptions] = Parser.derive
implicit lazy val help: Help[UninstallOptions] = Help.derive
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class ScalaCliCommands(
SetupIde,
Shebang,
Test,
Uninstall,
Update,
Version
) ++ (if (pgpUseBinaryCommands) Nil else pgpCommands.allScalaCommands.toSeq) ++
Expand Down
54 changes: 54 additions & 0 deletions modules/cli/src/main/scala/scala/cli/commands/Uninstall.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package scala.cli.commands

import caseapp._

import scala.cli.CurrentParams
import scala.cli.commands.util.CommonOps._
import scala.cli.commands.util.VerbosityOptionsUtil._

object Uninstall extends ScalaCommand[UninstallOptions] {
def run(options: UninstallOptions, args: RemainingArgs): Unit = {
CurrentParams.verbosity = options.bloopExit.logging.verbosityOptions.verbosity
val interactive =
options.bloopExit.logging.verbosityOptions.interactiveInstance(forceEnable = true)
val logger = options.bloopExit.logging.logger

val binDirPath =
options.binDirPath.getOrElse(scala.build.Directories.default().binRepoDir / "scala-cli")
val destBinPath = binDirPath / options.binaryName
val cacheDir = scala.build.Directories.default().cacheDir

if (
!Update.isScalaCLIInstalledByInstallationScript() && (options.binDir.isEmpty || !options.force)
) {
logger.error(
"Scala CLI was not installed by the installation script, please use your package manager to uninstall scala-cli."
)
sys.exit(1)
}
if (!options.force) {
val fallbackAction = () => {
logger.error(s"To uninstall scala-cli pass -f or --force")
sys.exit(1)
}
val msg = s"Do you want to uninstall scala-cli?"
interactive.confirmOperation(msg).getOrElse(fallbackAction())
}
if (os.exists(destBinPath)) {
// exit bloop server
logger.debug("Stopping Bloop server...")
BloopExit.run(options.bloopExit, args)
// remove scala-cli launcher
logger.debug("Removing scala-cli binary...")
os.remove.all(binDirPath)
// remove scala-cli caches
logger.debug("Removing scala-cli cache directory...")
if (!options.skipCache) os.remove.all(cacheDir)
logger.message("Uninstalled sucessfully.")
}
else {
logger.error(s"Could't find scala-cli binary at $destBinPath.")
sys.exit(1)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,24 @@ class InstallHomeTests extends munit.FunSuite {
)
}

private def uninstallScalaCli(
root: os.Path,
binDirPath: os.Path,
force: Boolean,
skipCache: Boolean
) = {
// format: off
val cmdUninstall = Seq[os.Shellable](
TestUtil.cli, "uninstall",
"--binary-name", dummyScalaCliBinName,
"--bin-dir", binDirPath
)
// format: on
val forceOpts = if (force) Seq("--force") else Seq.empty
val skipCacheOpts = if (skipCache) Seq("--skip-cache") else Seq.empty
os.proc(cmdUninstall, forceOpts, skipCacheOpts).call(cwd = root)
}

def runInstallHome(): Unit = {

testInputs.fromRoot { root =>
Expand Down Expand Up @@ -98,11 +116,16 @@ class InstallHomeTests extends munit.FunSuite {
stdin = os.Inherit
).out.text().trim
expect(v1Downgrade == firstVersion)

uninstallScalaCli(root, binDirPath, true, true)
expect(!os.exists(binDirPath))
}
}

if (!Properties.isWin && TestUtil.isCI)
test("updating and downgrading dummy scala-cli using install-home command") {
if (!Properties.isWin)
test(
"updating and downgrading dummy scala-cli using install-home command, uninstalling scala-cli using uninstall command"
) {
runInstallHome()
}

Expand Down
179 changes: 179 additions & 0 deletions website/docs/_advanced_install.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -419,3 +419,182 @@ To run Scala.js applications [Node.js](https://nodejs.org/) needs to be installe
Scala Native page contains detailed [installation guide](https://scala-native.readthedocs.io/en/latest/user/setup.html#installing-clang-and-runtime-dependencies).

</div></div>


<SectionAbout title="Uninstall scala CLI">
<div className="margin--lg"/>
<Tabs
groupId="uninstall-specific"
defaultValue={currentOs()}
values={[
{label: 'Windows', value: 'windows'},
{label: 'MacOs', value: 'mac'},
{label: 'Linux', value: 'linux'},
]}>
<TabItem value="windows"></TabItem>
<TabItem value="mac"></TabItem>
<TabItem value="linux"></TabItem>
</Tabs>
</SectionAbout>

<div className="row"><div className="col col--9 col--offset-1 padding--lg advanced_install_methods">

Pick the uninstallation method:

<Tabs
groupId="uninstall-specific"
defaultValue={currentOs()}
values={[
{label: 'Windows', value: 'windows'},
{label: 'MacOs', value: 'mac'},
{label: 'Linux', value: 'linux'},
]}
>
<TabItem value="linux">

<Tabs
groupId="linux"
defaultValue="installation-script-u"
values={[
{label: 'Installation script', value: 'installation-script-u' },
{label: 'Manual', value: 'manual-u'},
{label: 'Apt', value: 'apt-u'},
{label: 'Deb', value: 'deb-u'},
{label: 'Yum', value: 'yum-u'},
{label: 'Rpm', value: 'rpm-u'},
{label: 'Alpine', value: 'alpine-u'},
]}
>
<TabItem value="installation-script-u">

If Scala CLI was installed via the installation script, you can uninstall it with:

```bash
scala-cli uninstall
```
</TabItem>

<TabItem value="manual-u">

If Scala CLI was installed manually you can uninstall it with:

```bash
rm /usr/local/bin/scala-cli
```
</TabItem>

<TabItem value="apt-u">

If Scala CLI was installed via [apt](https://wiki.debian.org/Apt) you can uninstall it with:

```bash
sudo apt purge scala-cli
```
</TabItem>
<TabItem value="deb-u">

If Scala CLI was installed via [dpkg](https://en.wikipedia.org/wiki/Dpkg) you can uninstall it with:

```bash
sudo dpkg --remove scala-cli
```
</TabItem>
<TabItem value="yum-u">

If Scala CLI was installed via [yum](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/c1-yum) you can uninstall it with:

```bash
yum remove scala-cli
```
</TabItem>
<TabItem value="rpm-u">

If Scala CLI was installed via [rpm](https://rpm.org/) you can uninstall it with:

``` bash
rpm -e scala-cli
```
</TabItem>
<TabItem value="alpine-u">

For Alpine Linux you can uninstall scala-cli with:

```bash
rm /usr/bin/scala-cli
```

</TabItem>

</Tabs>

</TabItem>
<TabItem value="windows">

<Tabs
groupId="windows"
defaultValue="manual-u"
values={[
{label: 'Manual', value: 'manual-u'},
{label: 'Installer', value: 'installer-u'},
]}
>

<TabItem value="manual-u">

If Scala CLI was installed manually you can uninstall it with:

```bash
rmdir "%USERPROFILE%/scala-cli"
```
</TabItem>
<TabItem value="installer-u">

If Scala CLI was installed via the installer, you can uninstall it in the Control Panel.

</TabItem>
</Tabs>

</TabItem>
<TabItem value="mac">

<Tabs
groupId="mac"
defaultValue="installation-script-u"
values={[
{label: 'Installation script', value: 'installation-script-u' },
{label: 'Manual', value: 'manual-u'},
{label: 'Brew', value: 'brew-u'},
]}
>
<TabItem value="installation-script-u">

If Scala CLI was installed via the installation script, you can uninstall it with:

```bash
scala-cli uninstall
```
</TabItem>

<TabItem value="manual-u">

If Scala CLI was installed manually you can uninstall it with:

```bash
rm /usr/local/bin/scala-cli
```

</TabItem>
<TabItem value="brew-u">

If Scala CLI was installed via [homebrew](https://brew.sh) you can uninstall it with:

```bash
brew uninstall scala-cli
```
</TabItem>
</Tabs>

</TabItem>
</Tabs>

</div></div>
Loading

0 comments on commit a3718c9

Please sign in to comment.