def getBuildStatus(self, which, short=False): response = f'`{which}`: ' builder = yield self.getBuilder(buildername=which) builderid = builder['builderid'] runningBuilds = yield self.getRunningBuilds(builderid) # pylint: disable=too-many-nested-blocks if not runningBuilds: onlineBuilders = yield self.getOnlineBuilders() if builderid in onlineBuilders: response += self.idle_string lastBuild = yield self.getLastCompletedBuild(builderid) if lastBuild: complete_at = lastBuild['complete_at'] if complete_at: complete_at = util.datetime2epoch(complete_at) ago = util.fuzzyInterval( int(reactor.seconds() - complete_at)) else: ago = "??" status = self.format_build_status(lastBuild, short=short) if not short: status = ", " + status if lastBuild['results'] != SUCCESS: status_string = lastBuild.get('status_string') if status_string: status += ": " + status_string response += f' last build {ago} ago{status}' else: response += self.offline_string else: response += self.running_string buildInfo = [] for build in runningBuilds: step = yield self.getCurrentBuildstep(build) if step: s = f"({step[-1]['state_string']})" else: s = "(no current step)" bnum = build['number'] url = utils.getURLForBuild(self.master, builderid, bnum) buildInfo.append(f"build [#{bnum}]({url}) {s}") response += ' ' + ', '.join(buildInfo) return response
def command_LAST(self, args, **kwargs): """list last build status for a builder""" # FIXME: NEED TO THINK ABOUT! args = self.splitArgs(args) if not args: builders = yield self.bot.getAllBuilders() online_builderids = yield self.bot.getOnlineBuilders() builders = [ b for b in builders if b['builderid'] in online_builderids ] elif len(args) == 1: arg = args[0] if arg == 'all': builders = yield self.bot.getAllBuilders() else: builder = yield self.bot.getBuilder(buildername=arg) if not builder: raise UsageError("no such builder") builders = [builder] else: raise UsageError("Try '" + self.bot.commandPrefix + "last _builder_'.") messages = [] for builder in builders: lastBuild = yield self.bot.getLastCompletedBuild( builder['builderid']) if not lastBuild: status = "no builds run since last restart" else: complete_at = lastBuild['complete_at'] if complete_at: complete_at = util.datetime2epoch(complete_at) ago = util.fuzzyInterval( int(reactor.seconds() - complete_at)) else: ago = "??" status = self.bot.format_build_status(lastBuild) status = f'last build {status} ({ago} ago)' if lastBuild['results'] != SUCCESS: status += f": {lastBuild['state_string']}" messages.append(f"`{builder['name']}`: {status}") if messages: self.send('\n'.join(messages))
def test_years(self): self.assertEqual(util.fuzzyInterval((2 * 365 + 96) * 24 * 3600), "2 years")
def test_months(self): self.assertEqual(util.fuzzyInterval(86 * 24 * 3600 + 124), "3 months")
def test_year(self): self.assertEqual(util.fuzzyInterval(370 * 24 * 3600), "a year")
def test_days(self): self.assertEqual(util.fuzzyInterval((19 + 24) * 3600 + 124), "2 days")
def test_month(self): self.assertEqual(util.fuzzyInterval(36 * 24 * 3600 + 124), "a month")
def test_hours(self): self.assertEqual(util.fuzzyInterval(9 * 3600 - 720), "9 hours")
def test_day(self): self.assertEqual(util.fuzzyInterval(32 * 3600 + 124), "a day")
def test_minutes_rounded(self): self.assertEqual(util.fuzzyInterval(32 * 60 + 24), "30 minutes")
def test_hour(self): self.assertEqual(util.fuzzyInterval(3600 + 1200), "an hour")
def test_minutes(self): self.assertEqual(util.fuzzyInterval(3 * 60 + 24), "3 minutes")
def test_minute(self): self.assertEqual(util.fuzzyInterval(58), "a minute")
def test_seconds_rounded(self): self.assertEqual(util.fuzzyInterval(48), "50 seconds")
def test_seconds(self): self.assertEqual(util.fuzzyInterval(17), "17 seconds")
def test_moment(self): self.assertEqual(util.fuzzyInterval(1), "a moment")