[28634] in Source-Commits

home help back first fref pref prev next nref lref last post

build-system commit: dabuild: Add -k (--keep-going) option

daemon@ATHENA.MIT.EDU (Anders Kaseorg)
Tue Jun 21 04:07:01 2016

Date: Tue, 21 Jun 2016 04:06:58 -0400
From: Anders Kaseorg <andersk@mit.edu>
Message-Id: <201606210806.u5L86wU6031220@drugstore.mit.edu>
To: source-commits@mit.edu

https://github.com/mit-athena/build-system/commit/5b6327c9f889b1953ef71a1aed223b016b24c020
commit 5b6327c9f889b1953ef71a1aed223b016b24c020
Author: Debathena Build System <debathena@mit.edu>
Date:   Tue Jun 21 03:49:28 2016 -0400

    dabuild: Add -k (--keep-going) option

 dabuild |   34 +++++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/dabuild b/dabuild
index 00eb478..bb65f9e 100755
--- a/dabuild
+++ b/dabuild
@@ -126,7 +126,7 @@ def resolve_build_order_core(sources, binary_map, build_deps, bin_deps):
         }
 
     # Order has (package, packages to build before it) format
-    order = []
+    order = OrderedDict()
     working_set = [
             (source, build_deps_src[source])
             for source in sources
@@ -145,7 +145,7 @@ def resolve_build_order_core(sources, binary_map, build_deps, bin_deps):
 
         for pkg, deps in working_set[:]:
             if all(dep in order for dep in deps):
-                order.append(pkg)
+                order[pkg] = deps
                 working_set.remove( (pkg, deps) )
             else:
                 pass
@@ -231,10 +231,10 @@ def create_build_schedule(distro, build_targets, arches, bindep_distro=None):
 
     order = resolve_build_order(distro, build_targets, arches, bindep_distro)
     schedule = OrderedDict()
-    for package in order:
+    for package, deps in order.iteritems():
         for arch in arches:
             if package in build_targets[arch]:
-                key = (distro.name, distro.release, package)
+                key = (distro.name, distro.release, package, deps)
                 if key not in schedule:
                     schedule[key] = list()
                 schedule[key].append(arch)
@@ -253,6 +253,7 @@ def main():
     argparser.add_argument("architecture", nargs='*', help="List of architectures to build for")
     argparser.add_argument("--on-production-repository", action="store_true", help="Build even if non-development repository is specified")
     argparser.add_argument("--bindep-base", "-B", help="Release on which binary dependency resolution is based")
+    argparser.add_argument("--keep-going", "-k", action="store_true", help="Continue building on errors")
     args = argparser.parse_args()
 
     repos = [args.repository]
@@ -293,7 +294,7 @@ def main():
     print
     for repo, order in groupby(build_list, lambda x: x[0]):
         print "Order in %s:" % repo
-        for _, _, package, arches in order:
+        for _, _, package, _, arches in order:
             print "* %s %s [%s]" % (package, distros[repo].sources[package].version, ' '.join(arches))
         print
 
@@ -303,9 +304,28 @@ def main():
     if answer not in {'y', 'yes'}:
         return
 
-    for repo, release, source_name, pkg_arches in build_list:
+    failures = OrderedDict()
+
+    for repo, release, source_name, deps, pkg_arches in build_list:
+        previous_failures = [dep for dep in deps if (repo, release, dep) in failures]
+        if previous_failures:
+            print "Skipping %s in %s due to previous failure of %s" % \
+                (source_name, repo, ' '.join(previous_failures))
+            failures[repo, release, source_name] = pkg_arches[:]
+            continue
+
         for arch in pkg_arches:
-            build_package(distros[repo], release, distros[repo].sources[source_name], arch)
+            try:
+                build_package(distros[repo], release, distros[repo].sources[source_name], arch)
+            except subprocess.CalledProcessError if args.keep_going else () as err:
+                print "FAILED"
+                print err.output
+                failures.setdefault((repo, release, source_name), []).append(arch)
+
+    if failures:
+        for repo, release, source_name in failures:
+            print "Build failed: %s in %s" % (source_name, repo)
+        raise RuntimeError("some builds failed")
 
 if __name__ == '__main__':
     if not dabuildsys.claim_lock():

home help back first fref pref prev next nref lref last post