X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fedora_ocaml_rebuild.ml;h=aa48e108c0d7d5c5dad4797c5fa188eb5d187c1c;hb=1ec5e10001ec428619a231757b58a03699582174;hp=2eccde1cf48bad899a742f16bd7f2e2d31c9e02e;hpb=ece68a0d845a02388127bb5a68698ce92690894f;p=goaljobs-goals.git diff --git a/fedora_ocaml_rebuild.ml b/fedora_ocaml_rebuild.ml index 2eccde1..aa48e10 100644 --- a/fedora_ocaml_rebuild.ml +++ b/fedora_ocaml_rebuild.ml @@ -5,6 +5,7 @@ open Printf open Goaljobs open Config +open Git open Fedora let branch = "master" @@ -13,27 +14,69 @@ let koji_target = "rawhide" (* The name of the rebuild, and also the magic substring that must * appear in the %changelog when the package has been rebuilt. *) -let rebuild_name = "OCaml 4.01.0" +let rebuild_name = "OCaml 4.02.0 beta" -(* Packages that have problems or we just don't want to build. *) +(* Local repository that contains build dependencies. *) +let yum_repo = "koji-rawhide" + +(* Packages that have problems. These block the packages and all + * dependent packages. + *) let blocked = [ - "ocaml-libvirt"; (* RHBZ#1009701 *) - "ocaml-lwt"; "ocaml-react"; (* loganjerry is handling *) + "ocaml-bitstring"; (* needs upstream fix for 4.02.0 *) + + "ocaml-camlp5"; (* not updated for 4.02.0 *) + "ocaml-mikmatch"; (* build failure on 4.02.0 *) + "ocaml-omake"; (* build failure on 4.02.0 with hevea *) + "ocaml-p3l"; (* build failure on 4.02.0 -warn-error A *) + "ocaml-pa-do"; (* build failure, complex *) + "ocaml-lwt"; (* build failure on 4.02.0 *) + "ocaml-ocamlgraph"; (* build failure on 4.02.0 *) + "cduce"; (* complex build failure *) +] +let blocked pkg = List.mem pkg blocked + +(* These packages are treated as if they have been rebuilt. *) +let ignored = [ + "ocaml-srpm-macros"; (* don't need to build this *) + "ocaml"; (* rebuilt by hand *) + "ocaml-findlib"; (* rebuilt by hand *) + "ocaml-camlidl"; (* rebuilt by orionp *) + "whenjobs"; (* obsolete *) + "libguestfs"; (* rebuilt by hand *) + "graphviz"; (* rebuilt by hand *) + "xen"; (* already done *) + "plplot"; (* already done *) ] +let ignored pkg = List.mem pkg ignored (* List of OCaml-related source package names. *) let source_packages = let dirs = shlines "cd %s && ls -1d ocaml*" fedora_dir in dirs @ [ "alt-ergo"; "apron"; "brltty"; "coccinelle"; "coq"; "cduce"; "frama-c"; "gappalib-coq"; "graphviz"; "hivex"; - "js-of-ocaml"; "llvm"; "plplot"; "whenjobs"; "why3"; "xen" ] - -let source_packages = - List.filter (fun pkg -> not (List.mem pkg blocked)) source_packages + "js-of-ocaml"; "llvm"; "plplot"; "why3"; "xen" ] (* Dependencies of each package. (pkg, [deps ...]) *) let pkg_deps = dependencies branch source_packages +(* Remove blocked packages and packages which have a blocked package + * as a dependency (recursively). + *) +let source_packages = + let rec is_blocked pkg = + if blocked pkg then true + else ( + let deps = List.assoc pkg pkg_deps in + List.exists is_blocked deps + ) + in + List.filter (fun pkg -> not (is_blocked pkg)) source_packages + +let () = + printf "final list of source packages = %s\n%!" + (String.concat " " source_packages) + (* Goal: rebuild all packages. *) let rec goal all () = List.iter (fun pkg -> require (rebuild_started pkg)) source_packages @@ -50,31 +93,38 @@ and rebuilt pkg = * could exist as a koji build without it having been part of the * rebuild. *) - target (file_contains_string specfile rebuild_name && - koji_build_state (fedora_verrel pkg branch) == `Complete); - - (* Start the rebuild. *) - require (rebuild_started pkg); - - (* Wait for the build state to reach a conclusion. *) - let rec loop () = - match koji_build_state (fedora_verrel pkg branch) with - | `Building -> - sleep 30; - loop () - | `Complete -> - () - | `Deleted -> - failwith (sprintf "rebuild of package %s: deleted" pkg) - | `Failed -> - failwith (sprintf "rebuild of package %s: failed" pkg) - | `Canceled -> - failwith (sprintf "rebuild of package %s: canceled" pkg) - in - loop (); - - (* Wait for the build to appear in Koji repo. *) - koji_wait_repo koji_target (fedora_verrel pkg branch) + target (ignored pkg || + (file_contains_string specfile rebuild_name && + koji_build_state (fedora_verrel pkg branch) == `Complete)); + + (* Ignored packages are treated as if they have been rebuilt. *) + if not (ignored pkg) then ( + + (* Start the rebuild. *) + require (rebuild_started pkg); + + (* Wait for the build state to reach a conclusion. *) + let rec loop () = + match koji_build_state (fedora_verrel pkg branch) with + | `No_such_build -> + failwith (sprintf "rebuild of package %s: no build found" pkg) + | `Building -> + sleep 60; + loop () + | `Complete -> + () + | `Deleted -> + failwith (sprintf "rebuild of package %s: deleted" pkg) + | `Failed -> + failwith (sprintf "rebuild of package %s: failed" pkg) + | `Canceled -> + failwith (sprintf "rebuild of package %s: canceled" pkg) + in + loop (); + + (* Wait for the build to appear in Koji repo. *) + koji_wait_repo koji_target (fedora_verrel pkg branch) + ) (* Goal: The rebuild of the package has started, but we haven't waited * for it to finish. @@ -87,21 +137,45 @@ and rebuild_started pkg = * could exist as a koji build without it having been part of the * rebuild. *) - target (file_contains_string specfile rebuild_name && - (match koji_build_state (fedora_verrel pkg branch) with - | `Building | `Complete -> true - | `Deleted | `Failed | `Canceled -> false)); + target (ignored pkg || + (file_contains_string specfile rebuild_name && + (match koji_build_state (fedora_verrel pkg branch) with + | `Building | `Complete -> true + | `Deleted | `Failed | `Canceled | `No_such_build -> false))); (* All dependent packages must have been fully rebuilt and in the * repo first. *) List.iter (fun dep -> require (rebuilt dep)) deps; - (* A local test build must succeed. *) - require (local_build_succeeded pkg); - - (* Rebuild the package in Koji, but don't wait. *) - koji_build ~wait:false pkg branch + (* Ignored packages are treated as if they have been rebuilt. *) + if not (ignored pkg) then ( + (* A local test build must succeed. *) + require (local_build_succeeded pkg); + + (* Rebuild the package in Koji. Don't wait ... *) + koji_build ~wait:false pkg branch; + + (* ... but the build doesn't appear in Koji (eg. in 'koji + * buildinfo') until the SRPM has been built. This can take quite + * some time. Loop here until the build appears. + *) + let rec loop () = + match koji_build_state (fedora_verrel pkg branch) with + | `No_such_build -> + sleep 60; + loop (); + | `Building | `Complete -> + () + | `Deleted -> + failwith (sprintf "rebuild of package %s: deleted" pkg) + | `Failed -> + failwith (sprintf "rebuild of package %s: failed" pkg) + | `Canceled -> + failwith (sprintf "rebuild of package %s: canceled" pkg) + in + loop () + ) and local_build_succeeded pkg = (* The specfile must have been updated. *) @@ -115,9 +189,10 @@ and local_build_succeeded pkg = (* Do a local test build to ensure the Koji build will work. *) sh " cd %s - sudo yum-builddep %s + sudo yum-builddep -y --disablerepo=\\* --enablerepo=%s %s fedpkg local " (fedora_repo pkg branch) + (quote yum_repo) (fedora_specfile pkg branch); memory_set key "1" @@ -126,13 +201,35 @@ and specfile_updated pkg = let repodir = fedora_repo pkg branch in let specfile = fedora_specfile pkg branch in - (* XXX Automate common changes. *) - let title = rebuild_name ^ " rebuild." in sh " cd %s - git pull --rebase - rm -rf x86_64 noarch *.src.rpm - rpmdev-bumpspec -c %s %s + rm -rf x86_64 noarch *.src.rpm .build* clog + git fetch + " repodir; + + if not (git_has_local_changes repodir) then + sh " + cd %s + git pull --rebase + " repodir; + + sh "sudo yum-builddep -y --disablerepo=\\* --enablerepo=%s %s" + (quote yum_repo) specfile; + + (* For rationale behind always bumping the spec file, see comment + * in 'fedora.ml'. + *) + let title = + if not (file_contains_string specfile rebuild_name) then + rebuild_name ^ " rebuild." + else + "Bump release and rebuild." in + sh "rpmdev-bumpspec -c %s %s" (quote title) specfile; + + (* XXX Automate common specfile fixes. *) + + sh " + cd %s echo 'Please make further changes as required to the spec file %s.spec' echo '(Press return key)' read @@ -144,6 +241,5 @@ and specfile_updated pkg = read fedpkg push " repodir - (quote title) specfile pkg specfile