[Qt] Add logic for triggering clean builds on changes to build system files
authorhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Oct 2012 12:48:32 +0000 (12:48 +0000)
committerhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Oct 2012 12:48:32 +0000 (12:48 +0000)
Patch by Simon Hausmann  <simon.hausmann@digia.com>, Tor Arne Vestbø <tor.arne.vestbo@digia.com> on 2012-10-16
Reviewed by Csaba Osztrogonác.

.:

Add a line here that can be re-used for recording dummy commits to count how the clean-build-needed
logic failed.

* WebKit.pro:

Tools:

Re-use the existing logic that gives us a range between old and new SVN revision and
parse the summarized output of diff to see if any of the changed files include files
that are part of the Qt build system. If they change we likely need a clean build and
trigger it just to be on the safe side and reduce the amount of manual intervention
needed on the Qt build bots.

* Scripts/VCSUtils.pm:
* Scripts/webkitdirs.pm:
(buildQMakeProjects):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@131445 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
Tools/ChangeLog
Tools/Scripts/VCSUtils.pm
Tools/Scripts/webkitdirs.pm
WebKit.pro

index ef0dbd8..bc833c5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2012-10-16  Simon Hausmann  <simon.hausmann@digia.com>, Tor Arne Vestbø <tor.arne.vestbo@digia.com>
+
+        [Qt] Add logic for triggering clean builds on changes to build system files
+
+        Reviewed by Csaba Osztrogonác.
+
+        Add a line here that can be re-used for recording dummy commits to count how the clean-build-needed
+        logic failed.
+
+        * WebKit.pro:
+
 2012-10-16  Simon Hausmann  <simon.hausmann@digia.com>
 
         Unreviewed, rolling out r131436.
index 846013b..242b72a 100644 (file)
@@ -1,3 +1,19 @@
+2012-10-16  Simon Hausmann  <simon.hausmann@digia.com>, Tor Arne Vestbø <tor.arne.vestbo@digia.com>
+
+        [Qt] Add logic for triggering clean builds on changes to build system files
+
+        Reviewed by Csaba Osztrogonác.
+
+        Re-use the existing logic that gives us a range between old and new SVN revision and
+        parse the summarized output of diff to see if any of the changed files include files
+        that are part of the Qt build system. If they change we likely need a clean build and
+        trigger it just to be on the safe side and reduce the amount of manual intervention
+        needed on the Qt build bots.
+
+        * Scripts/VCSUtils.pm:
+        * Scripts/webkitdirs.pm:
+        (buildQMakeProjects):
+
 2012-10-16  Allan Sandfeld Jensen  <allan.jensen@digia.com>
 
         Fix the paths for QtGraphics related WebKit2 files.
index b27e047..8d2063b 100644 (file)
@@ -87,6 +87,8 @@ BEGIN {
         &svnRevisionForDirectory
         &svnStatus
         &toWindowsLineEndings
+        &gitCommitForSVNRevision
+        &listOfChangedFilesBetweenRevisions
     );
     %EXPORT_TAGS = ( );
     @EXPORT_OK   = ();
@@ -2088,4 +2090,41 @@ sub runCommand(@)
     exec { $args[0] } @args or die "Failed to exec(): $!";
 }
 
+sub gitCommitForSVNRevision
+{
+    my ($svnRevision) = @_;
+    my $command = "git svn find-rev r" . $svnRevision;
+    $command = "LC_ALL=C $command" if !isWindows();
+    my $gitHash = `$command`;
+    if (!defined($gitHash)) {
+        $gitHash = "unknown";
+        warn "Unable to determine GIT commit from SVN revision";
+    } else {
+        chop($gitHash);
+    }
+    return $gitHash;
+}
+
+sub listOfChangedFilesBetweenRevisions
+{
+    my ($firstRevision, $lastRevision) = @_;
+    my $command;
+
+    if ($firstRevision eq "unknown" or $lastRevision eq "unknown") {
+        return ();
+    }
+
+    if (isGit()) {
+        my $firstCommit = gitCommitForSVNRevision($firstRevision);
+        my $lastCommit = gitCommitForSVNRevision($lastRevision);
+        $command = "git diff --name-status $firstCommit..$lastCommit";
+    } elsif (isSVN()) {
+        $command = "svn diff --summarize -r $firstRevision:$lastRevision";
+    }
+    my $diffOutput = `$command`;
+    $diffOutput =~ s/^[A-Z]\s+//gm;
+    return split(/[\r\n]+/, $diffOutput)
+}
+
+
 1;
index 0aea868..4f60e29 100755 (executable)
@@ -2318,14 +2318,34 @@ sub buildQMakeProjects
        die "\nFailed to set up build environment using $qmakebin!\n";
     }
 
-    if ($configChanged) {
-        print "Calling '$command wipeclean' in " . $dir . "\n\n";
-        $result = system "$command wipeclean";
-    }
+    my $needsCleanBuild = 0;
+    my $needsIncrementalBuild = 0;
 
     if ($svnRevision ne $previousSvnRevision) {
         print "Last built revision was " . $previousSvnRevision .
             ", now at revision $svnRevision. Full incremental build needed.\n";
+        $needsIncrementalBuild = 1;
+
+        my @fileList = listOfChangedFilesBetweenRevisions($previousSvnRevision, $svnRevision);
+
+        foreach (@fileList) {
+            if (m/\.pr[oif]$/ or
+                m/\.qmake.conf$/ or
+                m/^Tools\/qmake\//
+               ) {
+                print "Change to $_ detected, clean build needed.\n";
+                $needsCleanBuild = 1;
+                last;
+            }
+        }
+    }
+
+    if ($configChanged or $needsCleanBuild) {
+        print "Calling '$command wipeclean' in " . $dir . "\n\n";
+        $result = system "$command wipeclean";
+    }
+
+    if ($needsIncrementalBuild) {
         $command .= " incremental";
     }
 
index 8925c60..876d554 100644 (file)
@@ -47,3 +47,5 @@ SUBDIRS += QtWebKit
 Tools.file = Tools/Tools.pro
 Tools.makefile = Makefile.Tools
 SUBDIRS += Tools
+
+# Number of times incremental builds have failed: 0