+(* Handle Fedora builds of libguestfs. *)
+
+open Goaljobs
+
+open Printf
+
+open Config
+open Fedora
+open Git
+open Libguestfs
+
+(* Enable debugging. *)
+let () =
+ Unix.putenv "LIBGUESTFS_DEBUG" "1";
+ Unix.putenv "LIBGUESTFS_TRACE" "1"
+
+(* Log program output. *)
+let from = "rjones@redhat.com"
+let to_ = "rjones@redhat.com"
+
+let package = "libguestfs"
+
+(* How branches in libguestfs upstream map to branches in Fedora. *)
+let branches = [
+ "1.23-development", "master"; (* Rawhide follows development. *)
+ "1.23-development", "f20"; (* F20 also follows development. *)
+ "1.22-stable", "f19"; (* F19 follows 1.22. *)
+ "1.20-stable", "f18"; (* F18 follows 1.20. *)
+]
+
+(* Goal: Latest website version has been built in every branch. *)
+let rec goal all () =
+ List.iter (
+ fun (wbranch, fbranch) ->
+ match website_latest_version wbranch with
+ | None -> ()
+ | Some version ->
+ require (fedora_built version fbranch)
+ ) branches
+
+(* Goal: Fedora has a successful build of 'version' on 'branch'. *)
+and fedora_built version branch =
+ let specfile = fedora_specfile package branch in
+
+ target (file_contains_string specfile version.version &&
+ koji_build_state (fedora_verrel package branch) == `Complete);
+
+ require (sources_uploaded version branch);
+ require (specfile_pushed version branch);
+
+ koji_build ~wait:true package branch
+
+and sources_uploaded version branch =
+ let repodir = fedora_repo package branch in
+ let sources = repodir // "sources" in
+ let key = sprintf "libguestfs_fedora_sources_uploaded_%s" version.version in
+
+ target (file_contains_string sources version.version &&
+ memory_exists key);
+ onrun (fun () -> memory_set key "1");
+
+ require (repodir_up_to_date repodir);
+
+ sh "
+ cd %s
+ fedpkg new-sources %s/%s
+ " repodir libguestfs_website_cvs version.urlpath
+
+and specfile_updated version branch =
+ let repodir = fedora_repo package branch in
+ let specfile = fedora_specfile package branch in
+
+ target (file_contains_string specfile version.version);
+
+ require (repodir_up_to_date repodir);
+
+ (* Hairy specfile editing. *)
+ sh "
+ cd %s
+ email=\"Richard W.M. Jones <rjones@redhat.com>\"
+ date=`date +\"%%a %%b %%d %%Y\"`
+ cp libguestfs.spec libguestfs.spec.old
+ sed < libguestfs.spec.old \\
+ -e \"s/^Version:.*/Version: %s/\" \\
+ -e \"s/^Release:.*/Release: 1%%{?dist}/\" \\
+ -e \"/^%%changelog/a \\
+* $date $email - 1:%s-1\\\\n\\
+- New upstream version %s.\\\\n\\
+\" > libguestfs.spec
+ rm libguestfs.spec.old
+ " repodir version.version version.version version.version
+
+and specfile_committed version branch =
+ let repodir = fedora_repo package branch in
+ let key = sprintf "libguestfs_fedora_specfile_committed_%s" version.version in
+
+ target (memory_exists key);
+ onrun (fun () -> memory_set key "1");
+
+ require (specfile_updated version branch);
+
+ sh "
+ cd %s
+ fedpkg commit -c
+ " repodir
+
+and specfile_pushed version branch =
+ let repodir = fedora_repo package branch in
+ let key = sprintf "libguestfs_fedora_specfile_pushed_%s" version.version in
+
+ target (memory_exists key);
+ onrun (fun () -> memory_set key "1");
+
+ require (repodir_up_to_date repodir);
+ require (specfile_committed version branch);
+
+ sh "
+ cd %s
+ fedpkg push
+ " repodir
+
+and repodir_up_to_date repodir =
+ sh "
+ cd %s
+ git fetch
+ " repodir;
+ if not (git_has_local_changes repodir) then
+ sh "
+ cd %s
+ git pull --rebase
+ " repodir