summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/io/Jar.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-03-21 22:25:40 +0000
committerPaul Phillips <paulp@improving.org>2011-03-21 22:25:40 +0000
commit455ee619fbfde17c8a9208d3e2ebf7d867cbd560 (patch)
tree686ccedbf5004eeb1507bbedc3b8c0d4b8d273fd /src/compiler/scala/tools/nsc/io/Jar.scala
parent7946facede9482d8a363b6474b163c11ab3a662c (diff)
downloadscala-455ee619fbfde17c8a9208d3e2ebf7d867cbd560.tar.gz
scala-455ee619fbfde17c8a9208d3e2ebf7d867cbd560.tar.bz2
scala-455ee619fbfde17c8a9208d3e2ebf7d867cbd560.zip
[I'm laptop only so there's some chance this wi...
[I'm laptop only so there's some chance this will incur temporary breakage, but it needs committing.] Heading off gratuitous complications which haven't yet shipped, I eliminated the -jar startup option in favor of doing what we already do, figuring it out. So now all these things work. scala foo/bar.scala // if file is a script or has one main method scala foo.Bar // if it has a legal main method scala foo.jar // if it has a legal MainClass attribute Also changed "-savecompiled" to "-save" and given scala source called foo.scala, generate foo.jar rather than foo.scala.jar. Cleaned up a bunch of related code and further polished the scala startup message. And unbroke choice settings and improved that error too, which closes #3849. While trying to write a test for the choice setting, was reminded that partest just discards invalid flags files. Made it fail instead, which closes #3712. Fixed the new failures that revealed. No review.
Diffstat (limited to 'src/compiler/scala/tools/nsc/io/Jar.scala')
-rw-r--r--src/compiler/scala/tools/nsc/io/Jar.scala25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala
index 0796742fb6..a9f0acaa00 100644
--- a/src/compiler/scala/tools/nsc/io/Jar.scala
+++ b/src/compiler/scala/tools/nsc/io/Jar.scala
@@ -65,8 +65,29 @@ class JarWriter(file: File, val manifest: Manifest = new Manifest()) {
}
object Jar {
- // CLASS_PATH
- // CONTENT_TYPE
+ // See http://download.java.net/jdk7/docs/api/java/nio/file/Path.html
+ // for some ideas.
+ private val ZipMagicNumber = List[Byte](80, 75, 3, 4)
+ private def magicNumberIsZip(f: Path) = f.isFile && (f.toFile.bytes().take(4).toList == ZipMagicNumber)
+
+ def isJarOrZip(f: Path): Boolean = isJarOrZip(f, true)
+ def isJarOrZip(f: Path, examineFile: Boolean): Boolean =
+ f.hasExtension("zip", "jar") || (examineFile && magicNumberIsZip(f))
+
+ def locateByClass(clazz: Class[_]): Option[File] = {
+ try Some(File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()))
+ catch { case _: Exception => None }
+ }
+ /** Walks upward from wherever the scala library jar is searching for
+ * the given jar name. This approach finds the scala library jar in the
+ * release layout and in trunk builds going up from pack.
+ */
+ def locateByName(name: String): Option[File] = {
+ def toSrc(d: Directory) = d.dirs.toList map (_ / name)
+ def walk(d: Directory) = d.parents flatMap toSrc find (_.isFile) map (_.toFile)
+
+ locateByClass(classOf[ScalaObject]) flatMap (x => walk(x.parent))
+ }
def create(file: File, sourceDir: Directory, mainClass: String): File = {
val writer = new Jar(file).jarWriter()