# HG changeset patch # User wenzelm # Date 1373919096 -7200 # Node ID d2b12523186db8b0b311f43d6861ded6e8d94015 # Parent 391913d17d1580f284faa661b3784edee9c635ae Scala version of init.bat; diff -r 391913d17d15 -r d2b12523186d src/Pure/System/cygwin.scala --- a/src/Pure/System/cygwin.scala Mon Jul 15 20:36:27 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -/* Title: Pure/System/cygwin.scala - Author: Makarius - -Support for Cygwin. -*/ - -package isabelle - - -import java.io.{File => JFile} -import java.nio.file.{Paths, Files} - - -object Cygwin -{ - /* symlinks */ - - def write_symlink(file: JFile, content: String) - { - require(Platform.is_windows) - - val path = file.toPath - - val writer = Files.newBufferedWriter(path, UTF8.charset) - try { writer.write("!" + content + "\0") } - finally { writer.close } - - Files.setAttribute(path, "dos:system", true) - } -} - diff -r 391913d17d15 -r d2b12523186d src/Pure/System/cygwin_init.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Pure/System/cygwin_init.scala Mon Jul 15 22:11:36 2013 +0200 @@ -0,0 +1,168 @@ +/* Title: Pure/System/cygwin_init.scala + Author: Makarius + +Initialize Isabelle distribution after download. +*/ + +package isabelle + + +import java.lang.System +import java.io.{File => JFile, BufferedReader, InputStreamReader} +import java.nio.file.{Paths, Files} +import java.awt.{GraphicsEnvironment, Point, Font} +import javax.swing.ImageIcon + +import scala.swing.{ScrollPane, Button, FlowPanel, + BorderPanel, MainFrame, TextArea, SwingApplication} +import scala.swing.event.ButtonClicked + + +object Cygwin_Init +{ + /* symlinks */ + + def write_symlink(file: JFile, content: String) + { + require(Platform.is_windows) + + val path = file.toPath + + val writer = Files.newBufferedWriter(path, UTF8.charset) + try { writer.write("!" + content + "\0") } + finally { writer.close } + + Files.setAttribute(path, "dos:system", true) + } + + + /* command-line entry point */ + + def main(args: Array[String]) = + { + GUI.init_laf() + try { + require(Platform.is_windows) + + val isabelle_home = System.getProperty("isabelle.home") + if (isabelle_home == null || isabelle_home == "") + error("Unknown Isabelle home directory") + if (!(new JFile(isabelle_home)).isDirectory) + error("Bad Isabelle home directory: " + quote(isabelle_home)) + + Swing_Thread.later { main_frame(isabelle_home) } + } + catch { + case exn: Throwable => + GUI.error_dialog(null, "Isabelle init failure", GUI.scrollable_text(Exn.message(exn))) + sys.exit(2) + } + } + + + /* main window */ + + private def main_frame(isabelle_home: String) = new MainFrame + { + title = "Isabelle system initialization" + iconImage = new ImageIcon(isabelle_home + "\\lib\\logo\\isabelle.gif").getImage + + val layout_panel = new BorderPanel + contents = layout_panel + + + /* text area */ + + def echo(msg: String) { text_area.append(msg + "\n") } + + val text_area = new TextArea { + font = new Font("SansSerif", Font.PLAIN, GUI.resolution_scale(10) max 14) + editable = false + columns = 80 + rows = 24 + } + + layout_panel.layout(new ScrollPane(text_area)) = BorderPanel.Position.Center + + + /* exit button */ + + var _return_code: Option[Int] = None + def maybe_exit(): Unit = _return_code.foreach(sys.exit(_)) + + def return_code(rc: Int): Unit = + Swing_Thread.later { + _return_code = Some(rc) + button.peer.getRootPane.setDefaultButton(button.peer) + layout_panel.repaint + } + + override def closeOperation { maybe_exit() } + + val button = new Button { + text = "Done" + reactions += { case ButtonClicked(_) => maybe_exit() } + } + val button_panel = new FlowPanel(FlowPanel.Alignment.Center)(button) + + layout_panel.layout(button_panel) = BorderPanel.Position.South + + + /* show window */ + + pack() + val point = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint() + location = new Point(point.x - size.width / 2, point.y - size.height / 2) + visible = true + + default_thread_pool.submit(() => + try { + init(isabelle_home, echo) + return_code(0) + } + catch { + case exn: Throwable => + text_area.append("Error:\n" + Exn.message(exn) + "\n") + return_code(2) + } + ) + } + + + /* init Cygwin file-system */ + + private def init(isabelle_home: String, echo: String => Unit) + { + val cygwin_root = isabelle_home + "\\contrib\\cygwin" + + if (!(new JFile(cygwin_root)).isDirectory) + error("Bad Isabelle Cygwin directory: " + quote(cygwin_root)) + + + val execute_cwd = new JFile(isabelle_home) + val execute_env = Map("CYGWIN" -> "nodosfilewarning") + + def execute(args: String*): Int = + { + val proc = Isabelle_System.raw_execute(execute_cwd, execute_env, true, args: _*) + proc.getOutputStream.close + + val stdout = new BufferedReader(new InputStreamReader(proc.getInputStream, UTF8.charset)) + try { + var line = stdout.readLine + while (line != null) { + echo(line) + line = stdout.readLine + } + } + finally { stdout.close } + + proc.waitFor + } + + echo("Initializing Cygwin ...") + execute("contrib\\cygwin\\bin\\dash", "/isabelle/rebaseall") + execute("contrib\\cygwin\\bin\\bash", "/isabelle/postinstall") + } +} + diff -r 391913d17d15 -r d2b12523186d src/Pure/System/isabelle_system.scala --- a/src/Pure/System/isabelle_system.scala Mon Jul 15 20:36:27 2013 +0200 +++ b/src/Pure/System/isabelle_system.scala Mon Jul 15 22:11:36 2013 +0200 @@ -230,8 +230,7 @@ /* raw execute for bootstrapping */ - private def raw_execute(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*) - : Process = + def raw_execute(cwd: JFile, env: Map[String, String], redirect: Boolean, args: String*): Process = { val cmdline = new java.util.LinkedList[String] for (s <- args) cmdline.add(s) diff -r 391913d17d15 -r d2b12523186d src/Pure/build-jars --- a/src/Pure/build-jars Mon Jul 15 20:36:27 2013 +0200 +++ b/src/Pure/build-jars Mon Jul 15 22:11:36 2013 +0200 @@ -42,7 +42,7 @@ PIDE/yxml.scala System/color_value.scala System/command_line.scala - System/cygwin.scala + System/cygwin_init.scala System/event_bus.scala System/gui.scala System/gui_setup.scala