X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/d612d62cd04b713bb1057fd2e666365704aaf3d6..6ae327f88a6be8efd02cfe4b713444f9f3ac2672:/src/slave.sml diff --git a/src/slave.sml b/src/slave.sml index b08d41d..144a167 100644 --- a/src/slave.sml +++ b/src/slave.sml @@ -27,6 +27,7 @@ datatype file_action = type file_status = {action : file_action, domain : string, + dir : string, file : string} val fileHandler = ref (fn _ : file_status => ()) @@ -58,4 +59,90 @@ fun handleChanges fs = (!preHandler (); app (!fileHandler) fs; !postHandler ()) +fun shell ss = OS.Process.isSuccess (OS.Process.system (String.concat ss)) + +fun shellF (ss, msg) = + let + val s = String.concat ss + in + if OS.Process.isSuccess (OS.Process.system s) then + () + else + ErrorMsg.error NONE (msg s) + end + +fun concatTo p fname = + let + fun visitDir dname = + let + val dir = Posix.FileSys.opendir dname + + fun loop () = + case Posix.FileSys.readdir dir of + NONE => Posix.FileSys.closedir dir + | SOME fname' => + let + val path = OS.Path.joinDirFile {dir = dname, file = fname'} + in + if Posix.FileSys.ST.isDir (Posix.FileSys.stat path) then + visitDir path + else if p fname' then + shellF ([Config.cat, " ", path, " >>", fname], + fn cl => "Error concatenating: " ^ cl) + else + (); + loop () + end + in + loop () + end + in + TextIO.closeOut (TextIO.openOut fname); + visitDir Config.resultRoot + end + +fun enumerateTo p sep fname = + let + val outf = TextIO.openOut fname + + val first = ref true + val baseLen = length (String.fields (fn ch => ch = #"/") Config.resultRoot) + + fun visitDir dname = + let + val dir = Posix.FileSys.opendir dname + + fun loop () = + case Posix.FileSys.readdir dir of + NONE => Posix.FileSys.closedir dir + | SOME fname' => + let + val path = OS.Path.joinDirFile {dir = dname, file = fname'} + in + if Posix.FileSys.ST.isDir (Posix.FileSys.stat path) then + visitDir path + else if p fname' then + let + val toks = String.fields (fn ch => ch = #"/") dname + val toks = List.drop (toks, baseLen) + val dom = String.concatWith "." (rev toks) + in + if !first then + first := false + else + TextIO.output (outf, sep); + TextIO.output (outf, dom) + end + else + (); + loop () + end + in + loop () + end + in + visitDir Config.resultRoot; + TextIO.closeOut outf + end + end