apache: fix missing newline in fastScriptAlias
[hcoop/domtool2.git] / src / plugins / apt.sml
index 1c31fbd..da561af 100644 (file)
@@ -22,9 +22,55 @@ structure Apt :> APT = struct
 
 fun validName s = CharVector.all (fn ch => Char.isAlphaNum ch orelse ch = #"_" orelse ch = #"-" orelse ch = #".") s
                  andalso (size s > 0 andalso String.sub (s, 0) <> #"-")
+
+(* Copyed from the portal, doesn't exactly go out this in the most
+   direct way, or does it? *)
+
+fun info name =
+    if not (validName name) then
+       NONE
+    else
+       let
+           val proc = Unix.execute ("/usr/bin/apt-cache", ["show", name])
+           val inf = Unix.textInstreamOf proc
+                     
+           val _ = TextIO.inputLine inf (* in every let* lies an imperative program in disguise *)
+                   
+           fun loop (section, descr) =
+               case TextIO.inputLine inf of
+                   NONE => (section, descr)
+                 | SOME line =>
+                   if size line >= 9 andalso String.substring (line, 0, 9) = "Section: " then
+                       loop (SOME (String.substring (line, 9, size line - 10)), descr)
+                   else if size line >= 13 andalso String.substring (line, 0, 13) = "Description: " then
+                       loop (section, SOME (String.substring (line, 13, size line - 14)))
+                   else if size line >= 16 andalso String.substring (line, 0, 16) = "Description-en: " then
+                       loop (section, SOME (String.substring (line, 16, size line - 17)))
+                   else
+                       loop (section, descr)
+       in
+           (case loop (NONE, NONE) of
+                (SOME section, SOME descr) => SOME {section = section, description = descr}
+              | _ => NONE)
+           before ignore (Unix.reap proc)
+       end
                           
 fun installed name =
     validName name
-    andalso OS.Process.isSuccess (OS.Process.system ("/usr/bin/dpkg -p " ^ name ^ " >/dev/null 2>/dev/null"))
+    andalso let
+       val proc = Unix.execute ("/usr/bin/apt-cache", ["policy", name])
+        val inf = Unix.textInstreamOf proc
+
+       val _ = TextIO.inputLine inf
+    in
+       (case TextIO.inputLine inf of
+            NONE => false
+          | SOME line =>
+            case String.tokens Char.isSpace line of
+                [_, "(none)"] => false
+              | [_, _] => true
+              | _ => false)
+       before ignore (Unix.reap proc)
+    end
 
 end