buildtest: ignore empty folders

`compile_test.py` fails if there are empty folders in `/examples` or
`tests`. This is not a problem for Travis, because it always has a clean
repo.

For the average users there is a problem if they work on multiple
branches and one branch has new examples or tests. If they don't delete
the residual `bin` folders, then `compile_test.py` will print out these
applications as having failed.

This change checks for the existence of a `Makefile` in the application
folder. Also I added a progress indicator, because I like it. :)
This commit is contained in:
René Kijewski 2014-05-16 13:05:14 +02:00
parent f3a587f43a
commit bd1630adca

View File

@ -21,35 +21,30 @@ from __future__ import print_function
from itertools import groupby from itertools import groupby
from os import devnull, environ, listdir from os import devnull, environ, listdir
from os.path import abspath, dirname, isdir, join from os.path import abspath, dirname, isfile, join
from subprocess import PIPE, Popen from subprocess import CalledProcessError, check_call, PIPE, Popen
from sys import exit, stdout from sys import exit, stdout
riotbase = environ.get('RIOTBASE') or abspath(join(dirname(abspath(__file__)), '../' * 3)) riotbase = environ.get('RIOTBASE') or abspath(join(dirname(abspath(__file__)), '../' * 3))
null = open(devnull, 'w') null = open(devnull, 'w', 0)
success = [] success = []
failed = [] failed = []
exceptions = [] exceptions = []
for folder in ('examples', 'tests'): def is_tracked(application_folder):
print('Building all applications in: \033[1;34m{}\033[0m'.format(folder)) if not isfile(join(application_folder, 'Makefile')):
for application in sorted(listdir(join(riotbase, folder))): return False
if not isdir(join(riotbase, folder, application)):
continue
stdout.write('\tBuilding application: \033[1;34m{}\033[0m '.format(application))
stdout.flush()
try: try:
subprocess = Popen(('make', 'buildtest'), check_call(('git', 'ls-files', '--error-unmatch', 'Makefile'),
bufsize=1, stdin=null, stdout=null, stderr=null, cwd=application_folder)
stdin=null, except CalledProcessError:
stdout=PIPE, return False
stderr=null, else:
cwd=join(riotbase, folder, application)) return True
def lines(readline, prefix): def get_lines(readline, prefix):
while 1: while 1:
result = readline() result = readline()
if not result: if not result:
@ -63,7 +58,22 @@ for folder in ('examples', 'tests'):
stdout.flush() stdout.flush()
yield result yield result
lines = lines(subprocess.stdout.readline, 'Building for ') for folder in ('examples', 'tests'):
print('Building all applications in: \033[1;34m{}\033[0m'.format(folder))
applications = listdir(join(riotbase, folder))
applications = filter(lambda app: is_tracked(join(riotbase, folder, app)), applications)
applications = sorted(applications)
for nth, application in enumerate(applications, 1):
stdout.write('\tBuilding application: \033[1;34m{}\033[0m ({}/{}) '.format(application, nth, len(applications)))
stdout.flush()
try:
subprocess = Popen(('make', 'buildtest'),
bufsize=1, stdin=null, stdout=PIPE, stderr=null,
cwd=join(riotbase, folder, application))
lines = get_lines(subprocess.stdout.readline, 'Building for ')
lines = groupby(sorted(lines), lambda (outcome, board): outcome) lines = groupby(sorted(lines), lambda (outcome, board): outcome)
for group, results in lines: for group, results in lines:
print('\n\t\t{}: {}'.format(group, ', '.join(sorted(board for outcome, board in results)))) print('\n\t\t{}: {}'.format(group, ', '.join(sorted(board for outcome, board in results))))
@ -80,7 +90,8 @@ for folder in ('examples', 'tests'):
pass pass
print('Outcome:') print('Outcome:')
for color, group, applications in (('2', 'success', success), ('1', 'failed', failed), ('4', 'exceptions', exceptions)): for color, group in (('2', 'success'), ('1', 'failed'), ('4', 'exceptions')):
applications = locals()[group]
if applications: if applications:
print('\t\033[1;3{}m{}\033[0m: {}'.format(color, group, ', '.join(applications))) print('\t\033[1;3{}m{}\033[0m: {}'.format(color, group, ', '.join(applications)))