open Goaljobs
open Printf
open Config
+open Libguestfs
(* Enable debugging. *)
let () =
Unix.putenv "LIBGUESTFS_DEBUG" "1";
Unix.putenv "LIBGUESTFS_TRACE" "1"
-let package = "libguestfs"
+(* 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
+*)
-(* 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
+let package = "libguestfs"
(* Goal: the website has been updated to 'version'. *)
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);
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);
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 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.
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 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
echo %s > localconfigure
chmod +x localconfigure
- echo %s > localenv .
+ echo %s > localenv
./localconfigure
+
+ # Ensure the po-docs are updated. Grrr this is ugly ...
+ make ||:
+ rm po-docs/podfiles
+ make -C po-docs update-po
+
make
make dist
mv %s %s/tarballs/%s
" repodir
version.version
(quote (libguestfs_localconfigure `Git))
- (quote libguestfs_localenv)
+ (quote (libguestfs_localenv (supermin version)))
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
" 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 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 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>'"
+ )