Implement url_exists, file_contains_string, url_contains_string.
[goaljobs.git] / goaljobs.ml
index 53db37c..4f99de4 100644 (file)
@@ -62,7 +62,44 @@ let more_recent objs srcs =
     ) objs
   )
 
-let url_exists url = goal_failed "url_exists not implemented!"
+let url_exists url =
+  (* http://stackoverflow.com/questions/12199059/how-to-check-if-an-url-exists-with-the-shell-and-probably-curl *)
+  let cmd =
+    sprintf "curl --output /dev/null --silent --head --fail %s" (quote url) in
+  match Sys.command cmd with
+  | 0 -> true
+  | 1 -> false
+  | r ->
+    let msg = sprintf "curl error testing '%s' (exit code %d)" url r in
+    goal_failed msg
+
+let file_contains_string filename str =
+  let cmd = sprintf "grep -q %s %s" (quote str) (quote filename) in
+  match Sys.command cmd with
+  | 0 -> true
+  | 1 -> false
+  | r ->
+    let msg = sprintf "grep error testing for '%s' in '%s' (exit code %d)"
+      str filename r in
+    goal_failed msg
+
+let url_contains_string url str =
+  let tmp = Filename.temp_file "goaljobsurl" "" in
+  let cmd =
+    sprintf "curl --output %s --silent --fail %s" (quote tmp) (quote url) in
+  (match Sys.command cmd with
+  | 0 -> ()
+  | 1 ->
+    let msg = sprintf "curl failed to download URL '%s'" url in
+    goal_failed msg
+  | r ->
+    let msg = sprintf "curl error testing '%s' (exit code %d)" url r in
+    goal_failed msg
+  );
+  let r = file_contains_string tmp str in
+  unlink tmp;
+  r
+
 
 let sh fs =
   let do_sh cmd =
@@ -156,6 +193,16 @@ let goal_url_exists url =
     let msg = sprintf "url_exists: URL '%s' required but does not exist" url in
     goal_failed msg
   )
+let goal_file_contains_string filename str =
+  if not (file_contains_string filename str) then (
+    let msg = sprintf "file_contains_string: file '%s' is required to contain string '%s'" filename str in
+    goal_failed msg
+  )
+let goal_url_contains_string url str =
+  if not (url_contains_string url str) then (
+    let msg = sprintf "url_contains_string: URL '%s' is required to contain string '%s'" url str in
+    goal_failed msg
+  )
 let goal_memory_exists k =
   if not (memory_exists k) then (
     let msg = sprintf "memory_exists: key '%s' required but does not exist" k in