s4:drsuapi/getncchanges: the default for isRecycled is FALSE
[mat/samba.git] / script / land.py
index e04cd3a87767ca5b5c09f98b9f92c180b4e60096..72bdd4b8408cdd6093673c088485ec1e03180d88 100755 (executable)
@@ -16,6 +16,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../lib/subunit/pytho
 import subunit
 import testtools
 import subunithelper
+import tempfile
 from email.mime.application import MIMEApplication
 from email.mime.text import MIMEText
 from email.mime.multipart import MIMEMultipart
@@ -25,7 +26,7 @@ samba_master_ssh = os.getenv('SAMBA_MASTER_SSH', 'git+ssh://git.samba.org/data/g
 
 cleanup_list = []
 
-os.putenv('CC', "ccache gcc")
+os.environ['CC'] = "ccache gcc"
 
 tasks = {
     "source3" : [ ("autogen", "./autogen.sh", "text/plain"),
@@ -40,7 +41,7 @@ tasks = {
                   ("install", "make install", "text/plain"),
                   ("test", "TDB_NO_FSYNC=1 make subunit-test", "text/x-subunit") ],
 
-    "source4/lib/ldb" : [ ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"),
+    "lib/ldb" : [ ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"),
                           ("make", "make -j", "text/plain"),
                           ("install", "make install", "text/plain"),
                           ("test", "make test", "text/plain") ],
@@ -147,7 +148,7 @@ class TreeStageBuilder(object):
 
     @property
     def failure_reason(self):
-        return "failed '%s' with exit code %d" % (self.command, self.exitcode)
+        raise NotImplementedError(self.failure_reason)
 
     @property
     def failed(self):
@@ -162,6 +163,10 @@ class PlainTreeStageBuilder(TreeStageBuilder):
                           stdout=self.tree.stdout, stderr=self.tree.stderr,
                           stdin=self.stdin)
 
+    @property
+    def failure_reason(self):
+        return "failed '%s' with exit code %d" % (self.command, self.exitcode)
+
 
 class AbortingTestResult(subunithelper.TestsuiteEnabledTestResult):
 
@@ -176,12 +181,27 @@ class AbortingTestResult(subunithelper.TestsuiteEnabledTestResult):
         self.stage.proc.terminate()
 
 
+class FailureTrackingTestResult(subunithelper.TestsuiteEnabledTestResult):
+
+    def __init__(self, stage):
+        super(FailureTrackingTestResult, self).__init__()
+        self.stage = stage
+
+    def addError(self, test, details=None):
+        if self.stage.failed_test is None:
+            self.stage.failed_test = ("error", test)
+
+    def addFailure(self, test, details=None):
+        if self.stage.failed_test is None:
+            self.stage.failed_test = ("failure", test)
+
+
 class SubunitTreeStageBuilder(TreeStageBuilder):
 
     def __init__(self, tree, name, command, fail_quickly=False):
         super(SubunitTreeStageBuilder, self).__init__(tree, name, command,
                 fail_quickly)
-        self.failed_tests = []
+        self.failed_test = None
         self.subunit_path = os.path.join(gitroot,
             "%s.%s.subunit" % (self.tree.tag, self.name))
         self.tree.logfiles.append(
@@ -190,7 +210,8 @@ class SubunitTreeStageBuilder(TreeStageBuilder):
         self.subunit = open(self.subunit_path, 'w')
 
         formatter = subunithelper.PlainFormatter(False, True, {})
-        clients = [formatter, subunit.TestProtocolClient(self.subunit)]
+        clients = [formatter, subunit.TestProtocolClient(self.subunit),
+                   FailureTrackingTestResult(self)]
         if fail_quickly:
             clients.append(AbortingTestResult(self))
         self.subunit_server = subunit.TestProtocolServer(
@@ -225,6 +246,13 @@ class SubunitTreeStageBuilder(TreeStageBuilder):
                 self.subunit.close()
             return self.exitcode
 
+    @property
+    def failure_reason(self):
+        if self.failed_test:
+            return "failed '%s' with %s in test %s" (self.command, self.failed_test[0], self.failed_test[1])
+        else:
+            return "failed '%s' with exit code %d in unknown test" % (self.command, self.exitcode)
+
 
 class TreeBuilder(object):
     '''handle build of one directory'''
@@ -484,7 +512,12 @@ def push_to(url):
     run_cmd(["git", "push", "pushto", "+HEAD:master"], show=True,
         dir=test_master)
 
-def_testbase = os.getenv("AUTOBUILD_TESTBASE", "/memdisk/%s" % os.getenv('USER'))
+def_testbase = os.getenv("AUTOBUILD_TESTBASE")
+if def_testbase is None:
+    if os.path.exists("/memdisk"):
+        def_testbase = "/memdisk/%s" % os.getenv('USER')
+    else:
+        def_testbase = os.path.join(tempfile.gettempdir(), "autobuild-%s" % os.getenv("USER"))
 
 parser = OptionParser()
 parser.add_option("--repository", help="repository to run tests for", default=None, type=str)
@@ -554,7 +587,7 @@ The top commit for the tree that was built was:
 
     msg = MIMEMultipart()
     msg['Subject'] = 'autobuild failure for task %s during %s' % (
-        failed_task, failed_stage)
+        failed_task, failed_stage.name)
     msg['From'] = 'autobuild@samba.org'
     msg['To'] = options.email