diff -r 6301ed01e34d -r 8adcf1f0042d src/Pure/System/cygwin_init.scala --- a/src/Pure/System/cygwin_init.scala Fri Sep 06 20:59:36 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -/* Title: Pure/System/cygwin_init.scala - Author: Makarius - -Initialize Isabelle distribution after extracting via 7zip. -*/ - -package isabelle - - -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.annotation.tailrec -import scala.swing.{ScrollPane, Button, FlowPanel, - BorderPanel, MainFrame, TextArea, SwingApplication} -import scala.swing.event.ButtonClicked - - -object Cygwin_Init -{ - /* main GUI entry point */ - - def main_frame(isabelle_home: String, start: => Unit) = 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 = 50 - rows = 15 - } - - layout_panel.layout(new ScrollPane(text_area)) = BorderPanel.Position.Center - - - /* exit button */ - - var _return_code: Option[Int] = None - def maybe_exit() - { - _return_code match { - case None => - case Some(0) => - visible = false - default_thread_pool.submit(() => start) - case Some(rc) => - sys.exit(rc) - } - } - - 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_filesystem(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_filesystem(isabelle_home: String, echo: String => Unit) - { - val cygwin_root = isabelle_home + "\\contrib\\cygwin" - - def execute(args: String*): Int = - { - val cwd = new JFile(isabelle_home) - val env = Map("CYGWIN" -> "nodosfilewarning") - val proc = Isabelle_System.raw_execute(cwd, 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:") - - echo("symlinks ...") - val symlinks = - { - val path = (new JFile(cygwin_root + "\\isabelle\\symlinks")).toPath - Files.readAllLines(path, UTF8.charset).toArray.toList.asInstanceOf[List[String]] - } - @tailrec def recover_symlinks(list: List[String]): Unit = - { - list match { - case Nil | List("") => - case link :: content :: rest => - val path = (new JFile(isabelle_home, link)).toPath - - val writer = Files.newBufferedWriter(path, UTF8.charset) - try { writer.write("!" + content + "\0") } - finally { writer.close } - - Files.setAttribute(path, "dos:system", true) - - recover_symlinks(rest) - case _ => error("Unbalanced symlinks list") - } - } - recover_symlinks(symlinks) - - echo("rebaseall ...") - execute(cygwin_root + "\\bin\\dash.exe", "/isabelle/rebaseall") - - echo("postinstall ...") - execute(cygwin_root + "\\bin\\bash.exe", "/isabelle/postinstall") - - echo("init ...") - Isabelle_System.init() - echo("OK") - } -} -