libguestfs: Ignore error: mkfs_btrfs: /dev/sda1: not enough free space.
[goaljobs-goals.git] / libguestfs_upstream.ml
index 1ea64a1..a3450eb 100644 (file)
 open Goaljobs
 open Printf
 open Config
+open Libguestfs
 
-let package = "libguestfs"
+(* Enable debugging. *)
+let () =
+  Unix.putenv "LIBGUESTFS_DEBUG" "1";
+  Unix.putenv "LIBGUESTFS_TRACE" "1"
 
-(* Helper object which stores everything about a version. *)
-type info = {
-  version : string;              (* The version as a normal string. *)
-  major : int;                   (* Broken-out version fields. *)
-  minor : int;
-  release: int;
-  is_stable : bool;              (* is a stable version of libguestfs? *)
-  branch : string;               (* 'master' or 'stable-1.xx' *)
-  package_version : string;      (* package-version *)
-  tarball : string;              (* package-version.tar.gz *)
-  urlpath : string;              (* download/1.X-(stable|development)/tarball *)
-  url : string;                  (* full download URL of tarball *)
-}
-
-(* Helper: Fetch latest gnulib into $buildtmp/repos/gnulib
- * XXX Move to Gnulib module.
- *)
-let get_gnulib () =
-  sh "
-    cd %s/repos
-    if [ ! -d gnulib ]; then git clone git://git.sv.gnu.org/gnulib.git; fi
-    cd gnulib
-    git checkout --force master
-    git pull
-  " buildtmp
+(* Log program output. *)
+let from = "rjones@redhat.com"
+let to_ = "rjones@redhat.com"
+(*
+let logfile = log_program_output ()
+let () = eprintf "logging to %s\n%!" logfile
+*)
+
+let package = "libguestfs"
 
 (* Goal: the website has been updated to 'version'. *)
 let rec goal website_updated version =
@@ -51,24 +39,24 @@ let rec goal website_updated version =
   if not version.is_stable then
     require (website_built version);
 
-  require (website_cvs_checked_in version);
+  require (website_checked_in version);
   require (website_rsync_done version)
 
 (* Goal: website has been rsync'd. *)
 and website_rsync_done version =
-  let key = sprintf "libguestfs_website_rsync_done_%s" version.version in
-  target (memory_exists key);
+  target (url_contains_string "http://libguestfs.org" version.version &&
+          url_exists version.url);
 
   sh "
     cd %s
-    echo NOT RUNNING: . .rsync
-  " libguestfs_website_cvs;
-  memory_set key "1"
+    ./.rsync
+  " libguestfs_website_repo
 
-(* Goal: Tarball added to CVS and CVS checked in. *)
-and website_cvs_checked_in version =
-  let key = sprintf "libguestfs_website_cvs_checked_in_%s" version.version in
+(* Goal: Tarball added to repository and checked in. *)
+and website_checked_in version =
+  let key = sprintf "libguestfs_website_checked_in_%s" version.version in
   target (memory_exists key);
+  onrun (fun () -> memory_set key "1");
 
   require (tarball_created version);
   require (tarball_tested version);
@@ -76,16 +64,17 @@ and website_cvs_checked_in version =
   sh "
     cd %s
     cp %s/tarballs/%s %s
-    echo NOT RUNNING: cvs add -kb %s
-    echo NOT RUNNING: cvs ci -m \"Version %s\"
-  " libguestfs_website_cvs
+    git add %s
+    git add *.txt *.html
+    git commit -m \"Version %s\"
+  " libguestfs_website_repo
     buildtmp version.tarball version.urlpath
     version.urlpath
     version.version
 
 (* Goal: website (local copy) has been built. *)
 and website_built version =
-  let index_file = sprintf "%s/index.html" libguestfs_website_cvs in
+  let index_file = sprintf "%s/index.html" libguestfs_website_repo in
   target (file_contains_string index_file version.version);
 
   require (tarball_created version);
@@ -97,16 +86,19 @@ and website_built version =
   sh "
     tar zxf %s/tarballs/%s
     cd %s
+
     echo %s > localconfigure
     chmod +x localconfigure
-    echo %s > localenv .
+    echo %s > localenv
+
     ./localconfigure
-    make
-    make website
+    make V=1
+    make maintainer-upload-website WEBSITEDIR=%s
   " buildtmp version.tarball
     version.package_version
     (quote (libguestfs_localconfigure `Tarball))
-    (quote libguestfs_localenv)
+    (quote (libguestfs_localenv (supermin version)))
+    (quote libguestfs_website_repo)
 
 (* Goal: the tarball has passed the required set of tests before
  * a release is allowed.
@@ -114,30 +106,34 @@ and website_built version =
 and tarball_tested version =
   let key = sprintf "libguestfs_tarball_tested_%s" version.version in
   target (memory_exists key);
+  onrun (fun () -> memory_set key "1");
 
   require (tarball_created version);
 
   sh "
     tar zxf %s/tarballs/%s
     cd %s
+
     echo %s > localconfigure
     chmod +x localconfigure
-    echo %s > localenv .
+    echo %s > localenv
+
     ./localconfigure
-    make
+    make V=1
     make check-release
   " buildtmp version.tarball
     version.package_version
     (quote (libguestfs_localconfigure `Tarball))
-    (quote libguestfs_localenv)
+    (quote (libguestfs_localenv (supermin version)))
 
 (* Goal: the tarball has been created from git. *)
 and tarball_created version =
   let filename = sprintf "%s/tarballs/%s" buildtmp version.tarball in
   target (file_exists filename);
 
+  require (repo_up_to_date version.branch);
+
   let repodir = sprintf "%s/repos/%s-%s" buildtmp package version.branch in
-  require (directory_exists repodir);
 
   sh "
     cp -a %s libguestfs
@@ -146,25 +142,45 @@ and tarball_created version =
 
     echo %s > localconfigure
     chmod +x localconfigure
-    echo %s > localenv .
+    echo %s > localenv
 
     ./localconfigure
-    make
+
+    # Ensure the po-docs are updated.  Grrr this is ugly ...
+    make ||:
+    rm po-docs/podfiles
+    make -C po-docs update-po
+
+    make V=1
     make dist
+
+    # Ensure redhat hardening flags didn't leak into the tarball.
+    # https://bugzilla.redhat.com/show_bug.cgi?id=1214506
+    if zcat %s | grep -q redhat-hardened; then exit 1; fi
+
     mv %s %s/tarballs/%s
   " repodir
     version.version
     (quote (libguestfs_localconfigure `Git))
-    (quote libguestfs_localenv)
+    (quote (libguestfs_localenv (supermin version)))
+    version.tarball
     version.tarball buildtmp version.tarball
 
 (* Goal: test a commit. *)
 and commit_tested branch commit =
+  onfail (
+    fun _ ->
+      let subject = sprintf "goal: %s: FAILED" goalname in
+      mailto ~from ~subject (*~attach:[logfile]*) to_
+  );
+
   let key = sprintf "libguestfs_commit_tested_%s" commit in
   target (memory_exists key);
+  onrun (fun () -> memory_set key "1");
+
+  require (repo_up_to_date branch);
 
   let repodir = sprintf "%s/repos/%s-%s" buildtmp package branch in
-  require (directory_exists repodir);
 
   sh "
     cp -a %s libguestfs
@@ -176,95 +192,45 @@ and commit_tested branch commit =
     echo %s > localenv
 
     ./localconfigure
-    make
+    make V=1
     make check-release
   " repodir
     commit
     (quote (libguestfs_localconfigure `Git))
-    (quote libguestfs_localenv);
+    (quote (libguestfs_localenv None))
 
-  memory_set key "1"
-
-(* Helper function to make a full 'info' object from a version
- * number.
- *)
-let vernames version =
-  Scanf.sscanf version "%d.%d.%d" (
-    fun major minor release ->
-      let is_stable = minor mod 2 = 0 in
-      let branch =
-        if is_stable then
-          sprintf "stable-%d.%d" major minor
-        else
-          sprintf "master" in
-      let package_version = sprintf "%s-%d.%d.%d" package major minor release in
-      let tarball = sprintf "%s.tar.gz" package_version in
-      let urlpath =
-        if is_stable then
-          sprintf "download/%d.%d-stable/%s" major minor tarball
-        else
-          sprintf "download/%d.%d-development/%s" major minor tarball in
-      let url = "http://libguestfs.org/" ^ urlpath in
-      { version = version;
-        major = major; minor = minor; release = release;
-        is_stable = is_stable;
-        branch = branch;
-        package_version = package_version;
-        tarball = tarball;
-        urlpath = urlpath;
-        url = url }
-  )
-
-(* Helper function to read the latest version in a repo and return
- * the version.
- *)
-let git_latest_version branch =
-  let v = shout "
-    cd %s/repos/%s-%s
-    git describe --tags --abbrev=0
-  " buildtmp package (quote branch) in
-  vernames v
-
-(* Get the latest commit. *)
-let git_latest_commit branch =
-  shout "
-    cd %s/repos/%s-%s
-    git rev-parse HEAD
-  " buildtmp package (quote branch)
-
-(* Clone or update a repo to the latest version on a branch, by force.
- * It is cached in name = $buildtmp/repos/<package>-<branch>
- *)
-let git_force url branch =
-  sh "
-    cd %s/repos
-    if [ ! -d %s-%s ]; then git clone %s %s-%s; fi
-    cd %s-%s
-    git checkout --force %s
-    git pull
-    # Copy or update gnulib
-    git submodule init
-    git submodule update
-  " buildtmp
-    package (quote branch) (quote url) package (quote branch)
-    package (quote branch)
-    (quote branch)
+and repo_up_to_date branch =
+  git_force branch
 
 let () =
   (* Add a periodic job to check for new git commits and test them. *)
-  every 5 minutes ~name:"new libguestfs commit" (
+  every libguestfs_query_mins minutes ~name:"new libguestfs commit" (
     fun () ->
-      git_force "https://github.com/libguestfs/libguestfs.git" "master";
-
+      require (repo_up_to_date "master");
       let commit = git_latest_commit "master" in
       require (commit_tested "master" commit);
   );
 
   (* Periodic job to build new tarballs. *)
-  every 5 minutes ~name:"new libguestfs version" (
+  every libguestfs_query_mins minutes ~name:"new libguestfs version" (
     fun () ->
-      git_force "https://github.com/libguestfs/libguestfs.git" "master";
-
+      require (repo_up_to_date "master");
       let version = git_latest_version "master" in
       require (website_updated version)
   )
+
+(* Allow these jobs to run from the command line. *)
+let () =
+  publish "commit" (
+    function
+    | [commit] -> require (commit_tested "master" commit)
+    | [branch; commit] -> require (commit_tested branch commit)
+    | _ ->
+      failwith "use './libguestfs_upstream commit [<branch>] <commit>'"
+  );
+  publish "release" (
+    function
+    | [version] -> require (website_updated (vernames version))
+    | _ ->
+      failwith "use './libguestfs_upstream release <version>'"
+  )