mirror of
https://bitbucket.org/smil3y/kdelibs.git
synced 2025-02-24 19:02:48 +00:00
152 lines
5.9 KiB
Python
152 lines
5.9 KiB
Python
import re
|
|
import os
|
|
import sys
|
|
import time
|
|
import platform
|
|
from buildinator_build_status import BuildStatus
|
|
|
|
def CheckoutSubversionRevision (Status, SrcDir, LogDir):
|
|
"""Checks a certain revision of threadweaver out of KDESVN into SrcDir"""
|
|
Cmd="svn co -r" + str(Status.revision) + ' ' + Status.svnUrl + ' ' \
|
|
+ SrcDir + ' ' \
|
|
+ "> " + LogDir + "/SubversionCheckout.log 2>&1"
|
|
# print Cmd
|
|
# print "Checking out revision " + str(Status.revision)
|
|
ReturnCode = 0
|
|
try:
|
|
ReturnCode = os.system (Cmd)
|
|
Status.checkoutStatus = 1 # success
|
|
except:
|
|
Status.checkoutStatus = 2 # failed
|
|
return Status
|
|
|
|
def CleanUp (Status, SrcDir, BuildDir):
|
|
"""Delete temporary src and build directories"""
|
|
# build status is ignored here, but we may want to skip cleanup if some step of the build failed
|
|
os.system ("rm -Rf " + SrcDir)
|
|
os.system ("rm -Rf " + BuildDir)
|
|
return Status
|
|
|
|
def Build (Status, SrcDir, BuildDir, LogDir):
|
|
"""Build the sources in SrcDir in BuildDir/Prefix using Options for qmake"""
|
|
BuildPath = BuildDir + "/" + Status.prefix
|
|
# if exceptions occur, stop the script (no catching):
|
|
os.system("mkdir -p " + BuildPath)
|
|
rc = os.system("(cd " + BuildPath + " && qmake " \
|
|
+ Status.options + " " + SrcDir + '/' + Status.projectFile + ')' \
|
|
+ " > " + LogDir + "/qmake-" + Status.prefix + ".log 2>&1")
|
|
if rc == 0:
|
|
Status.configureStatus = 1 # success
|
|
else:
|
|
Status.configureStatus = 2 # failure
|
|
rc = os.system("(cd " + BuildPath + " && make all " \
|
|
+ " > " + LogDir + "/make-all-" + Status.prefix + ".log 2>&1 )")
|
|
# FIXME: find out about "success with warnings"
|
|
if rc == 0:
|
|
Status.compileStatus = 1 # success
|
|
else:
|
|
Status.compileStatus = 3 # failure
|
|
return Status
|
|
|
|
def Test (Status, BuildDir, Prefix, LogDir):
|
|
"""Run the unit tests in BuildDir/Prefix"""
|
|
BuildPath = BuildDir + "/" + Prefix
|
|
Cmd = "(cd " + BuildPath + " && make test " \
|
|
+ " > " + LogDir + "/make-test-" + Prefix + ".log 2>&1 )"
|
|
Status.overallTestStatus = 1 # success
|
|
for Step in range( Status.numberOfTestRuns ):
|
|
rc =os.system(Cmd)
|
|
if rc == 0:
|
|
Status.testResults = Status.testResults + [ 1 ]
|
|
else:
|
|
Status.testResults = Status.testResults + [ 2 ]
|
|
Status.overallTestStatus = 2 # failed
|
|
return Status
|
|
|
|
# the entry point for the whole build test process:
|
|
def ExecuteBuildAndTest ( Status, WorkDir ):
|
|
"""This function runs the sequence of checking out, building and testing a revision"""
|
|
SrcDir = WorkDir+ "/Src"
|
|
BuildDir = WorkDir + "/Build"
|
|
LogDir = WorkDir + "/Logs"
|
|
MinimumTestRevision = -1
|
|
Errors = False
|
|
# common object, will be copied for the different runs
|
|
Status.platform = platform.platform()
|
|
BuildResults = [] # will hold a list of BuildStatus objects,one for every configuration
|
|
# print "SrcDir: " + SrcDir
|
|
# print "BuildDir: " + BuildDir
|
|
# print "LogDir: " + LogDir
|
|
# print
|
|
|
|
try:
|
|
for Directory in [ SrcDir, BuildDir, LogDir]:
|
|
os.system ("mkdir -p " + Directory)
|
|
# print "Clearing existing logs in " + LogDir
|
|
os.system("rm -f " + LogDir + "/*")
|
|
except:
|
|
print "--> error: cannot make src or build directory, check permissions!"
|
|
sys.exit (-2)
|
|
|
|
Status = CheckoutSubversionRevision ( Status, SrcDir, LogDir)
|
|
if Status.checkoutStatus != 1: # success
|
|
return Status # return just this one object, since we cannot run the build without sources
|
|
|
|
# a dictionary with the configuration name and qmake options:
|
|
Options = { 'Debug' : 'CONFIG+=debug',
|
|
'Release' : 'CONFIG+=release' }
|
|
|
|
for Prefix, Option in Options.items():
|
|
# copy status over from status of common steps:
|
|
CurrentStatus = BuildStatus( Status )
|
|
CurrentStatus.options = Option
|
|
CurrentStatus.prefix = Prefix
|
|
# print 'Building with options "' + Option + '" in ' + Prefix
|
|
CurrentStatus = Build (CurrentStatus, SrcDir, BuildDir, LogDir)
|
|
if CurrentStatus.compileStatus == 1 or CurrentStatus.compileStatus == 2:
|
|
# print "Build successful"
|
|
if Status.revision < MinimumTestRevision:
|
|
print "--> warning: not testing, no unit test in revisions below " + MinimumTestRevision
|
|
else:
|
|
# print "Executing initial unit test run"
|
|
CurrentStatus = Test (CurrentStatus, BuildDir, Prefix, LogDir)
|
|
if CurrentStatus.overallTestStatus == 1:
|
|
# print "Tests successful"
|
|
pass
|
|
else:
|
|
print "--> notice: tests failed!"
|
|
else:
|
|
print "--> error: build failed, no testing"
|
|
if CurrentStatus.hasErrors(): Errors = True
|
|
BuildResults = BuildResults + [ CurrentStatus ]
|
|
# print "Cleaning up (deleting all in SrcDir and BuildDir, leave Logs) ..."
|
|
if Errors:
|
|
print '--> notice: not cleaning up because of previous errors'
|
|
else:
|
|
CleanUp (Status, SrcDir, BuildDir)
|
|
return BuildResults
|
|
|
|
# FIXME: return something useful
|
|
|
|
def GetSvnLog ( SvnUrl ):
|
|
"""Retrieve the subversion log for a subversion URL and return it in a list."""
|
|
Cmd = "svn log " + SvnUrl
|
|
File = os.popen (Cmd, 'r')
|
|
return File.readlines()
|
|
|
|
def GetRevisionList( SvnUrl ):
|
|
"""Make an BuildStatus list of revisions, sorted latest-to-older"""
|
|
Lines = GetSvnLog ( SvnUrl )
|
|
RevisionLine = re.compile( '^r\d+\s')
|
|
Revisions = []
|
|
for Line in Lines:
|
|
Match = RevisionLine.match( Line )
|
|
if Match:
|
|
Status = BuildStatus()
|
|
Pieces = Line.split('|')
|
|
Status.committer = Pieces[1].strip()
|
|
Status.revision = int (Pieces[0].rstrip()[1:])
|
|
Status.svnUrl = SvnUrl
|
|
Revisions = Revisions + [ Status ]
|
|
return Revisions
|
|
|