From 3f1ce8b9a0917df12828051c24debc00fcc0b22e Mon Sep 17 00:00:00 2001 From: kai-chi Date: Wed, 19 Sep 2018 15:39:42 +0200 Subject: [PATCH] expand tilde prefix --- main/src/main/scala/sbt/BuildPaths.scala | 24 +++++++++- main/src/test/scala/BuildPathsTest.scala | 61 ++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 main/src/test/scala/BuildPathsTest.scala diff --git a/main/src/main/scala/sbt/BuildPaths.scala b/main/src/main/scala/sbt/BuildPaths.scala index 647890860..b66d0e851 100644 --- a/main/src/main/scala/sbt/BuildPaths.scala +++ b/main/src/main/scala/sbt/BuildPaths.scala @@ -78,7 +78,29 @@ object BuildPaths { def getFileProperty(name: String): Option[File] = Option(System.getProperty(name)) flatMap { path => - if (path.isEmpty) None else Some(new File(path)) + if (path.isEmpty) None + else { + if (path.head == '~') { + val tildePath = expandTildePrefix(path) + Some(new File(tildePath)) + } else { + Some(new File(path)) + } + } + } + + def expandTildePrefix(path: String): String = { + val tildePath = path.split("\\/").headOption match { + case Some("~") => sys.env.getOrElse("HOME", "") + case Some("~+") => sys.env.getOrElse("PWD", "") + case Some("~-") => sys.env.getOrElse("OLDPWD", "") + case _ => "" + } + + path.indexOf("/") match { + case -1 => tildePath + case _ => tildePath + path.substring(path.indexOf("/")) + } } def defaultVersionedGlobalBase(sbtVersion: String): File = defaultGlobalBase / sbtVersion diff --git a/main/src/test/scala/BuildPathsTest.scala b/main/src/test/scala/BuildPathsTest.scala new file mode 100644 index 000000000..b81b8416a --- /dev/null +++ b/main/src/test/scala/BuildPathsTest.scala @@ -0,0 +1,61 @@ +/* + * sbt + * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt + +import org.specs2.mutable.Specification +import sbt.BuildPaths + +object BuildPathsTest extends Specification { + + private def assertExpandedPath(given: String, expected: String) = { + val actual = BuildPaths.expandTildePrefix(given) + + actual must be equalTo (expected) + } + + "expandTildePrefix" should { + + "expand empty path to itself" in { + assertExpandedPath("", "") + } + + "expand /home/user/path to itself" in { + assertExpandedPath("/home/user/path", "/home/user/path") + } + + "expand /~/foo/ to itself" in { + assertExpandedPath("/~/foo/", "/~/foo/") + } + + "expand ~ to $HOME" in { + assertExpandedPath("~", sys.env.getOrElse("HOME", "")) + } + + "expand ~/foo/bar to $HOME/foo/bar" in { + assertExpandedPath("~/foo/bar", sys.env.getOrElse("HOME", "") + "/foo/bar") + } + + "expand ~+ to $PWD" in { + assertExpandedPath("~+", sys.env.getOrElse("PWD", "")) + } + + "expand ~+/foo/bar to $PWD/foo/bar" in { + assertExpandedPath("~+/foo/bar", sys.env.getOrElse("PWD", "") + "/foo/bar") + } + + "expand ~- to $OLDPWD" in { + assertExpandedPath("~-", sys.env.getOrElse("OLDPWD", "")) + } + + "expand ~-/foo/bar to $OLDPWD/foo/bar" in { + assertExpandedPath("~-/foo/bar", sys.env.getOrElse("OLDPWD", "") + "/foo/bar") + } + + } + +}