Try to improve robustness, make kerneldb additions atomic.
[virt-mem.git] / extract / fedora-koji / fedora_koji_download_kernels.ml
index 57abfd3..df12f66 100644 (file)
@@ -223,32 +223,37 @@ let main outputdir =
          contains_debuginfo name && not (contains_common name)
       ) rpms in
 
-      List.iter (
-       fun rpm ->
+      let nr_rpms = List.length rpms in
+
+      List.iteri (
+       fun j rpm ->
          let uri, filename = koji_rpm_download_url rpm in
-         let infofile = outputdir // filename ^ ".info" in
+         let infoname = filename ^ ".info" in
+         let infopath = outputdir // infoname in
 
          let infoexists =
-           try ignore (Unix.access infofile [Unix.F_OK]); true
+           try ignore (Unix.access infopath [Unix.F_OK]); true
            with Unix.Unix_error _ -> false in
 
          if infoexists then
            printf "Skipping %s\n%!" (string_of_rpm rpm)
          else (
-           printf "%s\n%!" (string_of_rpm rpm);
+           printf "%d/%d %d/%d %s\n%!"
+             (i+1) nr_builds (j+1) nr_rpms (string_of_rpm rpm);
 
            let run cmd =
              let r = Sys.command cmd in
              if r <> 0 then
                failwith (sprintf "%s: command exited with code %d" cmd r)
            in
+           let run cmd = ksprintf run cmd in
 
            (* Function to clean up the RPM & the temporary subdirectory
             * (usr/, used for unpacking the RPM).
             *)
            let cleanup () =
              (try Unix.unlink filename with _ -> ());
-             ignore (Sys.command "rm -rf usr/")
+             ignore (Sys.command "rm -rf *.info *.data usr")
            in
 
            cleanup ();
@@ -263,19 +268,19 @@ let main outputdir =
                   * than it's worth.  So shell out to 'wget' instead.
                   *)
                  printf "Downloading RPM ...\n%!";
-                 run (sprintf "wget --quiet %s" (Filename.quote uri));
+                 run "wget --quiet %s" (Filename.quote uri);
 
                  printf "Finished downloading RPM.\n%!";
 
                  (* Unpack vmlinux binary from the RPM. *)
-                 run (sprintf "rpm2cpio %s | cpio -id --quiet '*/vmlinux'"
-                        (Filename.quote filename));
+                 run "rpm2cpio %s | cpio -id --quiet '*/vmlinux'"
+                   (Filename.quote filename);
 
-                 run (sprintf "find usr/ -name vmlinux -print0 |
-                                xargs -0 pahole -E > %s.data"
-                        (Filename.quote outputdir // Filename.quote filename));
+                 run "find usr/ -name vmlinux -print0 |
+                       xargs -0 pahole -E > %s.data"
+                   (Filename.quote filename);
 
-                 let chan = open_out infofile in
+                 let chan = open_out infoname in
                  fprintf chan "Source: fedora-koji\n";
                  fprintf chan "Distribution: Fedora\n";
                  fprintf chan "RPM_id: %d\n" rpm.rpm_id;
@@ -288,8 +293,17 @@ let main outputdir =
                  fprintf chan "\n";
                  close_out chan;
 
-                 run (sprintf "rpm -qip %s >> %s"
-                        (Filename.quote filename) (Filename.quote infofile));
+                 run "rpm -qip %s >> %s"
+                   (Filename.quote filename) (Filename.quote infoname);
+
+                 (* Atomically move the info & data files to their final
+                  * destination.
+                  *)
+                 run "mv %s.data %s.data"
+                   (Filename.quote filename)
+                   (Filename.quote (outputdir // filename));
+                 run "mv %s %s"
+                   (Filename.quote infoname) (Filename.quote infopath);
              ) ()
            with
              Failure msg ->