mirror of https://github.com/sbt/sbt.git
Work around File constructor not accepting URIs for UNC paths. Fixes #564.
This commit is contained in:
parent
4946115521
commit
b6ff789d44
|
|
@ -28,6 +28,8 @@ object IO
|
||||||
val temporaryDirectory = new File(System.getProperty("java.io.tmpdir"))
|
val temporaryDirectory = new File(System.getProperty("java.io.tmpdir"))
|
||||||
/** The size of the byte or char buffer used in various methods.*/
|
/** The size of the byte or char buffer used in various methods.*/
|
||||||
private val BufferSize = 8192
|
private val BufferSize = 8192
|
||||||
|
/** File scheme name */
|
||||||
|
private[this] val FileScheme = "file"
|
||||||
|
|
||||||
/** The newline string for this system, as obtained by the line.separator system property. */
|
/** The newline string for this system, as obtained by the line.separator system property. */
|
||||||
val Newline = System.getProperty("line.separator")
|
val Newline = System.getProperty("line.separator")
|
||||||
|
|
@ -70,14 +72,31 @@ object IO
|
||||||
def urlAsFile(url: URL): Option[File] =
|
def urlAsFile(url: URL): Option[File] =
|
||||||
url.getProtocol match
|
url.getProtocol match
|
||||||
{
|
{
|
||||||
case "file" => Some(toFile(url))
|
case FileScheme => Some(toFile(url))
|
||||||
case "jar" =>
|
case "jar" =>
|
||||||
val path = url.getPath
|
val path = url.getPath
|
||||||
val end = path.indexOf('!')
|
val end = path.indexOf('!')
|
||||||
Some(new File(new URI(if(end == -1) path else path.substring(0, end))))
|
Some(uriToFile(if(end == -1) path else path.substring(0, end)))
|
||||||
case _ => None
|
case _ => None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private[this] def uriToFile(uriString: String): File =
|
||||||
|
{
|
||||||
|
val uri = new URI(uriString)
|
||||||
|
assert(uri.getProtocol == FileProtocol, "Expected protocol to be '" + FileScheme + "' in URI " + uri)
|
||||||
|
if(uri.getAuthority eq null)
|
||||||
|
new File(uri)
|
||||||
|
else {
|
||||||
|
/* https://github.com/harrah/xsbt/issues/564
|
||||||
|
* http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
|
||||||
|
* http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086147
|
||||||
|
* The specific problem here is that `uri` will have a defined authority component for UNC names like //foo/bar/some/path.jar
|
||||||
|
* but the File constructor requires URIs with an undefined authority component.
|
||||||
|
*/
|
||||||
|
new File(uri.getSchemeSpecificPart)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def assertDirectory(file: File) { assert(file.isDirectory, (if(file.exists) "Not a directory: " else "Directory not found: ") + file) }
|
def assertDirectory(file: File) { assert(file.isDirectory, (if(file.exists) "Not a directory: " else "Directory not found: ") + file) }
|
||||||
def assertDirectories(file: File*) { file.foreach(assertDirectory) }
|
def assertDirectories(file: File*) { file.foreach(assertDirectory) }
|
||||||
|
|
||||||
|
|
@ -698,7 +717,7 @@ object IO
|
||||||
{
|
{
|
||||||
if(!uri.isAbsolute) return uri;//assertAbsolute(uri)
|
if(!uri.isAbsolute) return uri;//assertAbsolute(uri)
|
||||||
val str = uri.toASCIIString
|
val str = uri.toASCIIString
|
||||||
val dirStr = if(str.endsWith("/") || uri.getScheme != "file") str else str + "/"
|
val dirStr = if(str.endsWith("/") || uri.getScheme != FileScheme) str else str + "/"
|
||||||
(new URI(dirStr)).normalize
|
(new URI(dirStr)).normalize
|
||||||
}
|
}
|
||||||
/** Converts the given File to a URI. If the File is relative, the URI is relative, unlike File.toURI*/
|
/** Converts the given File to a URI. If the File is relative, the URI is relative, unlike File.toURI*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue