fedora-ocaml-rebuild: Allow builds into a side tag.
[goaljobs-goals.git] / fedora.ml
index edc9cfd..79a9678 100644 (file)
--- a/fedora.ml
+++ b/fedora.ml
@@ -5,11 +5,7 @@ open Printf
 
 open Goaljobs
 
-(* Repo dir, etc. *)
-let fedora_dir = Sys.getenv "HOME" // "d/fedora"
-let fedora_repo pkg branch = fedora_dir // pkg // branch
-let fedora_specfile pkg branch =
-  sprintf "%s/%s.spec" (fedora_repo pkg branch) pkg
+open Config
 
 (* Get the current version of a package. *)
 let fedora_verrel pkg branch =
@@ -73,6 +69,14 @@ let contains_substring substr str =
  * resists automation: RHBZ#760924.
  *)
 
+(* XXX koji_build_state verrel: If you do a build and it fails, then
+ * do another build without bumping the release field, 'koji buildinfo'
+ * seems to always return the failed build, at least until the second
+ * build completes.  This means the code below fails.  Unclear how it
+ * can be fixed, but best to always bump the release to avoid the
+ * problem.
+ *)
+
 (* Get build state. *)
 let rec koji_build_state verrel =
   fst (koji_build_state_task verrel)
@@ -90,34 +94,36 @@ and koji_build_state_task =
     else (
       let out = shout "timeout 120 koji buildinfo %s 2>&1 ||:" verrel in
       if no_such_build out then
-        failwith (sprintf "koji_build_state_task: %s: no such build" verrel);
-      let state =
-        try
-          let subs = Pcre.exec ~rex:state out in
-          match Pcre.get_substring subs 1 with
-          | "BUILDING" -> `Building
-          | "COMPLETE" -> `Complete
-          | "DELETED" -> `Deleted
-          | "FAILED" -> `Failed
-          | "CANCELED" -> `Canceled
-          | sub ->
-            failwith (sprintf "koji_build_state_task: %s: unknown build state '%s'"
-                        verrel sub)
-        with
-          Not_found ->
-            failwith (sprintf "koji_build_state_task: %s: no build state found"
-                        verrel) in
-      let task =
-        try
-          let subs = Pcre.exec ~rex:task_id out in
-          Some (int_of_string (Pcre.get_substring subs 1))
-        with
-          Not_found -> None in
-
-      if state == `Complete then
-        memory_set key "1";
-
-      state, task
+        `No_such_build, None
+      else (
+        let state =
+          try
+            let subs = Pcre.exec ~rex:state out in
+            match Pcre.get_substring subs 1 with
+            | "BUILDING" -> `Building
+            | "COMPLETE" -> `Complete
+            | "DELETED" -> `Deleted
+            | "FAILED" -> `Failed
+            | "CANCELED" -> `Canceled
+            | sub ->
+              failwith (sprintf "koji_build_state_task: %s: unknown build state '%s'"
+                          verrel sub)
+          with
+            Not_found ->
+              failwith (sprintf "koji_build_state_task: %s: no build state found"
+                          verrel) in
+        let task =
+          try
+            let subs = Pcre.exec ~rex:task_id out in
+            Some (int_of_string (Pcre.get_substring subs 1))
+          with
+            Not_found -> None in
+
+        if state == `Complete then
+          memory_set key "1";
+
+        state, task
+      )
     )
 
 (* Perform a Koji build and wait until it finishes.  If it fails,
@@ -129,15 +135,22 @@ let koji_build =
     contains_substring "Name or service not known" in
   let completed_successfully = contains_substring "completed successfully" in
   let failed = contains_substring "FAILED" in
-  fun ?(wait = true) pkg branch ->
+  fun ?(wait = true) ?side_tag pkg branch ->
     let repodir = fedora_repo pkg branch in
     let out =
       shout "
         cd %s
-        fedpkg build%s 2>&1 ||:
-    " repodir (if not wait then " --nowait" else "")
+        fedpkg build%s%s 2>&1
+      " repodir
+        (if not wait then " --nowait" else "")
+        (match side_tag with None -> "" | Some t -> " --target " ^ t)
     in
-    if wait then (
+    if not wait then (
+      (* Just check the task was created. *)
+      if not (Pcre.pmatch ~rex:created_task out) then (
+        failwith "fedpkg build: build failed to start"
+      )
+    ) else (
       let task_id =
         try
           let subs = Pcre.exec ~rex:created_task out in
@@ -153,7 +166,6 @@ let koji_build =
         else if completed_successfully out then
           ()
         else if failed out then (
-          eprintf "%s\n%!" out;
           failwith "koji build failed"
         )
         else