diff options
author | Paul Phillips <paulp@improving.org> | 2011-03-21 22:25:40 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-03-21 22:25:40 +0000 |
commit | 455ee619fbfde17c8a9208d3e2ebf7d867cbd560 (patch) | |
tree | 686ccedbf5004eeb1507bbedc3b8c0d4b8d273fd /src/compiler/scala/tools/nsc/io/Jar.scala | |
parent | 7946facede9482d8a363b6474b163c11ab3a662c (diff) | |
download | scala-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.scala | 25 |
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() |