Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas De Schampheleire <patrickdepinguin@gmail.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v5 07/11] autobuild-run: improve the logic to generate build-end.log
Date: Fri, 12 Dec 2014 21:04:52 +0100	[thread overview]
Message-ID: <1418414696-32584-8-git-send-email-patrickdepinguin@gmail.com> (raw)
In-Reply-To: <1418414696-32584-1-git-send-email-patrickdepinguin@gmail.com>

From: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>

This patch makes the generation of build-end.log more intelligent, by
not simply adding the 500 last lines, but instead capture the entire
output of the failed package.

If no failure reason can be found (possibly a good run) or the start for
that package cannot be found, use the 500 last lines as fallback.

The logic to find the failed package is taken from the result import
script web/import.inc.php. If needed, the search range of the last 3
lines could be extended.

Note that the package-version string extracted from the build log is
split on the last hyphen into a tuple (package, version). This is
needed to find back the beginning of that package's build (where the
package name is separated from the version with a space, not a hyphen).
However, this logic will fail to work when the version also contains a
hyphen, for example lmbench-3.0-a9. In this case, the resulting tuple
will be (lmbench-3.0,a9) and the text searched in the build log
'>>> lmbench-3.0 a9' (which will not be found). In this case, the
fallback of the last 500 lines will be used.

Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
---
 scripts/autobuild-run | 53 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 46 insertions(+), 7 deletions(-)

diff --git a/scripts/autobuild-run b/scripts/autobuild-run
index d085029..32466e8 100755
--- a/scripts/autobuild-run
+++ b/scripts/autobuild-run
@@ -44,10 +44,6 @@
 #
 # TODO:
 #
-# - Improve the logic that generates the 'build-end.log' file. Instead
-#   of just using the last 500 lines of the build log, search the
-#   start of the build of the failing package.
-#
 # - Include the config.log file (when it exists) in the tarball for
 #   failed builds when the failure occurs on an autotools package.
 #
@@ -491,9 +487,52 @@ def send_results(result, **kwargs):
     subprocess.call(["git log master -n 1 --pretty=format:%%H > %s" % \
                      os.path.join(resultdir, "gitid")],
                     shell=True, cwd=srcdir)
-    subprocess.call(["tail -500 %s > %s" % \
-                     (os.path.join(outputdir, "logfile"), os.path.join(resultdir, "build-end.log"))],
-                    shell=True)
+
+    def get_failure_reason():
+        # Output is a tuple (package, version), or None.
+
+        lastlines = subprocess.check_output(["tail", "-n", "3",
+                        os.path.join(outputdir, "logfile")]).splitlines()
+
+        import re
+        regexp = re.compile(r'make: \*\*\* .*/(?:build|toolchain)/([^/]*)/')
+        for line in lastlines:
+            m = regexp.search(line)
+            if m:
+                return m.group(1).rsplit('-', 1)
+
+        # not found
+        return None
+
+    def extract_end_log(resultfile):
+        """Save the last part of the build log, starting from the failed package"""
+
+        def extract_last_500_lines():
+            subprocess.call(["tail -500 %s > %s" % \
+                             (os.path.join(outputdir, "logfile"), resultfile)],
+                            shell=True)
+
+        reason = get_failure_reason()
+        if not reason:
+            extract_last_500_lines()
+        else:
+            import mmap
+            f = open(os.path.join(outputdir, "logfile"), 'r')
+            mf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
+            mf.seek(0)
+            # Search for first action on the failed package
+            offset = mf.find('>>> %s' % ' '.join(reason))
+            if offset != -1:
+                with open(resultfile, "w") as endlog:
+                    endlog.write(mf[offset:])
+            else:
+                # not found, use last 500 lines as fallback
+                extract_last_500_lines()
+
+            mf.close()
+            f.close()
+
+    extract_end_log(os.path.join(resultdir, "build-end.log"))
 
     resultf = open(os.path.join(resultdir, "status"), "w+")
     if result == 0:
-- 
1.8.5.1

  parent reply	other threads:[~2014-12-12 20:04 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-12 20:04 [Buildroot] [PATCH v5 00/11] autobuild-run improvements Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 01/11] scripts: add python module docopt Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 02/11] autobuild-run: use docopt for argument parsing Thomas De Schampheleire
2015-02-05 22:52   ` Thomas Petazzoni
2015-02-06 11:13     ` Thomas De Schampheleire
2015-02-28 19:31   ` Thomas Petazzoni
2014-12-12 20:04 ` [Buildroot] [PATCH v5 03/11] autobuild-run: add option --make-opts for custom Buildroot options Thomas De Schampheleire
2015-02-28 19:29   ` Thomas Petazzoni
2015-03-01 20:42     ` Thomas De Schampheleire
2015-03-02  8:33       ` Thomas Petazzoni
2014-12-12 20:04 ` [Buildroot] [PATCH v5 04/11] autobuild-run: use **kwargs to avoid explicit parameter passthroughs Thomas De Schampheleire
2015-02-06  7:58   ` Thomas Petazzoni
2015-02-06 11:15     ` Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 05/11] autobuild-run: check-requirements does not need to know the login details Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 06/11] autobuild-run: set LC_ALL=C to not use locale settings of host machine Thomas De Schampheleire
2014-12-12 20:04 ` Thomas De Schampheleire [this message]
2014-12-12 20:04 ` [Buildroot] [PATCH v5 08/11] autobuild-run: save config.log files for failed package Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 09/11] autobuild-run: extend TODO list Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 10/11] autobuild-run: kill all children on SIGTERM Thomas De Schampheleire
2014-12-12 20:16   ` Thomas De Schampheleire
2014-12-12 20:18   ` Thomas De Schampheleire
2015-02-28 19:28   ` Thomas Petazzoni
2015-03-01 20:02     ` Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 11/11] autobuild-run: catch KeyboardInterrupt in the same way as SIGTERM Thomas De Schampheleire
2014-12-22 12:45 ` [Buildroot] [PATCH v5 00/11] autobuild-run improvements Thomas De Schampheleire
2015-02-28 19:34 ` Thomas Petazzoni
2015-03-01 21:13   ` Thomas De Schampheleire
2015-03-15 13:34 ` Thomas Petazzoni
2015-03-15 13:51   ` Thomas De Schampheleire
2015-03-15 14:10     ` Thomas Petazzoni
2015-03-18 16:03       ` André Erdmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1418414696-32584-8-git-send-email-patrickdepinguin@gmail.com \
    --to=patrickdepinguin@gmail.com \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox