let nr_builds = List.length builds in
printf "%d kernel builds found on Koji.\n%!" nr_builds;
+ (* Sort the builds by build ID in reverse, so that we tend to download
+ * the most recent kernels first.
+ *)
+ let builds =
+ let cmp { build_id = id1 } { build_id = id2 } = compare id2 id1 in
+ List.sort ~cmp builds in
+
List.iteri (
fun i build ->
printf "Build %d/%d: %s\n" (i+1) nr_builds (string_of_build build);
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 ();
* 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;
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 ->