1# -*- coding: utf-8 -*- 2# 3# Copyright 2015 Michael Lotz 4# Copyright 2016 Jerome Duval 5# Distributed under the terms of the MIT License. 6 7import json 8import logging 9import os 10import stat 11import time 12 13from .Builder import BuilderState 14 15 16class LocalBuilder(object): 17 def __init__(self, name, packagesPath, outputBaseDir, options): 18 self.options = options 19 self.name = name 20 self.buildCount = 0 21 self.failedBuilds = 0 22 self.packagesPath = packagesPath 23 self.state = BuilderState.AVAILABLE 24 self.currentBuild = None 25 26 self.buildOutputDir = os.path.join(outputBaseDir, 'builds') 27 if not os.path.isdir(self.buildOutputDir): 28 os.makedirs(self.buildOutputDir) 29 30 self.buildLogger = logging.getLogger('builders.' + self.name + '.build') 31 self.buildLogger.setLevel(logging.DEBUG) 32 33 def setBuild(self, scheduledBuild, buildNumber): 34 logHandler = logging.FileHandler(os.path.join(self.buildOutputDir, 35 str(buildNumber) + '.log')) 36 logHandler.setFormatter(logging.Formatter('%(message)s')) 37 self.buildLogger.addHandler(logHandler) 38 filter = ThreadFilter() 39 logHandler.addFilter(filter) 40 logging.getLogger("buildLogger").setLevel(logging.DEBUG) 41 logging.getLogger("buildLogger").addHandler(logHandler) 42 43 self.currentBuild = { 44 'build': scheduledBuild, 45 'status': scheduledBuild.status, 46 'number': buildNumber, 47 'logHandler': logHandler, 48 'logFilter': filter, 49 'startTime': None, 50 'phase': 'setup', 51 'lines': 0 52 } 53 filter.setBuild(self.currentBuild) 54 55 56 def unsetBuild(self): 57 self.buildLogger.removeHandler(self.currentBuild['logHandler']) 58 logging.getLogger("buildLogger").removeHandler( 59 self.currentBuild['logHandler']) 60 self.currentBuild = None 61 62 def runBuild(self): 63 scheduledBuild = self.currentBuild['build'] 64