# HG changeset patch # User wenzelm # Date 1373925184 -7200 # Node ID fb59e6e9442a9616c17bbf60fa1d18e29f5809e8 # Parent a467a6b4376cd9f32861a2518de8ca3debc22da3 recover Cygwin symlinks via Windows file-system operations; diff -r a467a6b4376c -r fb59e6e9442a src/Pure/System/cygwin_init.scala --- a/src/Pure/System/cygwin_init.scala Mon Jul 15 23:07:23 2013 +0200 +++ b/src/Pure/System/cygwin_init.scala Mon Jul 15 23:53:04 2013 +0200 @@ -1,7 +1,7 @@ /* Title: Pure/System/cygwin_init.scala Author: Makarius -Initialize Isabelle distribution after download. +Initialize Isabelle distribution after extracting via 7zip. */ package isabelle @@ -13,6 +13,7 @@ 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 @@ -20,22 +21,6 @@ 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]) = @@ -138,6 +123,33 @@ if (!(new JFile(cygwin_root)).isDirectory) error("Bad Isabelle Cygwin directory: " + quote(cygwin_root)) + 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) + val execute_cwd = new JFile(isabelle_home) val execute_env = Map("CYGWIN" -> "nodosfilewarning") @@ -160,8 +172,10 @@ proc.waitFor } - echo("Initializing Cygwin ...") + echo("rebaseall ...") execute("contrib\\cygwin\\bin\\dash", "/isabelle/rebaseall") + + echo("postinstall ...") execute("contrib\\cygwin\\bin\\bash", "/isabelle/postinstall") } }