Blame tools/daca2-addons.py

Packit 2035a7
#!/usr/bin/env python
Packit 2035a7
#
Packit 2035a7
# 1. Create a folder daca2-addons in your HOME folder
Packit 2035a7
# 2. Put cppcheck-O2 in daca2-addons. It should be built with all optimisations.
Packit 2035a7
# 3. Optional: Put a file called "suppressions.txt" in the daca2-addons folder.
Packit 2035a7
# 4. Optional: tweak FTPSERVER and FTPPATH in this script below.
Packit 2035a7
# 5. Run the daca2-addons script:  python daca2-addons.py FOLDER
Packit 2035a7
Packit 2035a7
import subprocess
Packit 2035a7
import sys
Packit 2035a7
import shutil
Packit 2035a7
import glob
Packit 2035a7
import os
Packit 2035a7
import datetime
Packit 2035a7
import time
Packit 2035a7
Packit 2035a7
DEBIAN = ('ftp://ftp.se.debian.org/debian/',
Packit 2035a7
          'ftp://ftp.debian.org/debian/')
Packit 2035a7
Packit 2035a7
Packit 2035a7
def wget(filepath):
Packit 2035a7
    filename = filepath
Packit 2035a7
    if '/' in filepath:
Packit 2035a7
        filename = filename[filename.rfind('/') + 1:]
Packit 2035a7
    for d in DEBIAN:
Packit 2035a7
        subprocess.call(
Packit 2035a7
            ['nice', 'wget', '--tries=10', '--timeout=300', '-O', filename, d + filepath])
Packit 2035a7
        if os.path.isfile(filename):
Packit 2035a7
            return True
Packit 2035a7
        print('Sleep for 10 seconds..')
Packit 2035a7
        time.sleep(10)
Packit 2035a7
    return False
Packit 2035a7
Packit 2035a7
Packit 2035a7
def getpackages(folder):
Packit 2035a7
    if not wget('ls-lR.gz'):
Packit 2035a7
        return []
Packit 2035a7
    subprocess.call(['nice', 'gunzip', 'ls-lR.gz'])
Packit 2035a7
    f = open('ls-lR', 'rt')
Packit 2035a7
    lines = f.readlines()
Packit 2035a7
    f.close()
Packit 2035a7
    subprocess.call(['rm', 'ls-lR'])
Packit 2035a7
Packit 2035a7
    path = None
Packit 2035a7
    archives = []
Packit 2035a7
    filename = None
Packit 2035a7
    for line in lines:
Packit 2035a7
        line = line.strip()
Packit 2035a7
        if len(line) < 4:
Packit 2035a7
            if filename:
Packit 2035a7
                archives.append(path + '/' + filename)
Packit 2035a7
            path = None
Packit 2035a7
            filename = None
Packit 2035a7
        elif line[:13 + len(folder)] == './pool/main/' + folder + '/':
Packit 2035a7
            path = line[2:-1]
Packit 2035a7
        elif path and '.orig.tar.' in line:
Packit 2035a7
            filename = line[1 + line.rfind(' '):]
Packit 2035a7
Packit 2035a7
    for a in archives:
Packit 2035a7
        print(a)
Packit 2035a7
Packit 2035a7
    return archives
Packit 2035a7
Packit 2035a7
Packit 2035a7
def handleRemoveReadonly(func, path, exc):
Packit 2035a7
    import stat
Packit 2035a7
    if not os.access(path, os.W_OK):
Packit 2035a7
        # Is the error an access error ?
Packit 2035a7
        os.chmod(path, stat.S_IWUSR)
Packit 2035a7
        func(path)
Packit 2035a7
Packit 2035a7
Packit 2035a7
def removeAllExceptResults():
Packit 2035a7
    count = 5
Packit 2035a7
    while count > 0:
Packit 2035a7
        count -= 1
Packit 2035a7
Packit 2035a7
        filenames = []
Packit 2035a7
        filenames.extend(glob.glob('[A-Za-z0-9]*'))
Packit 2035a7
        filenames.extend(glob.glob('.[a-z]*'))
Packit 2035a7
Packit 2035a7
        try:
Packit 2035a7
            for filename in filenames:
Packit 2035a7
                if os.path.isdir(filename):
Packit 2035a7
                    shutil.rmtree(filename, onerror=handleRemoveReadonly)
Packit 2035a7
                elif filename != 'results.txt':
Packit 2035a7
                    os.remove(filename)
Packit 2035a7
        except WindowsError as err:
Packit 2035a7
            time.sleep(30)
Packit 2035a7
            if count == 0:
Packit 2035a7
                print('Failed to cleanup files/folders')
Packit 2035a7
                print(err)
Packit 2035a7
                sys.exit(1)
Packit 2035a7
            continue
Packit 2035a7
        except OSError as err:
Packit 2035a7
            time.sleep(30)
Packit 2035a7
            if count == 0:
Packit 2035a7
                print('Failed to cleanup files/folders')
Packit 2035a7
                print(err)
Packit 2035a7
                sys.exit(1)
Packit 2035a7
            continue
Packit 2035a7
        count = 0
Packit 2035a7
Packit 2035a7
Packit 2035a7
def removeLargeFiles(path):
Packit 2035a7
    for g in glob.glob(path + '*'):
Packit 2035a7
        if g == '.' or g == '..':
Packit 2035a7
            continue
Packit 2035a7
        if os.path.islink(g):
Packit 2035a7
            continue
Packit 2035a7
        if os.path.isdir(g):
Packit 2035a7
            removeLargeFiles(g + '/')
Packit 2035a7
        elif os.path.isfile(g) and g[-4:] != '.txt':
Packit 2035a7
            statinfo = os.stat(g)
Packit 2035a7
            if '/clang/INPUTS/' in path or statinfo.st_size > 100000:
Packit 2035a7
                os.remove(g)
Packit 2035a7
Packit 2035a7
Packit 2035a7
def dumpfiles(path):
Packit 2035a7
    ret = []
Packit 2035a7
    for g in glob.glob(path + '*'):
Packit 2035a7
        if os.path.islink(g):
Packit 2035a7
            continue
Packit 2035a7
        if os.path.isdir(g):
Packit 2035a7
            ret.extend(dumpfiles(path + g + '/'))
Packit 2035a7
        elif os.path.isfile(g) and g[-5:] == '.dump':
Packit 2035a7
            ret.append(g)
Packit 2035a7
    return ret
Packit 2035a7
Packit 2035a7
Packit 2035a7
def scanarchive(filepath, jobs):
Packit 2035a7
    # remove all files/folders except results.txt
Packit 2035a7
    removeAllExceptResults()
Packit 2035a7
Packit 2035a7
    results = open('results.txt', 'at')
Packit 2035a7
    results.write(DEBIAN[0] + filepath + '\n')
Packit 2035a7
    results.close()
Packit 2035a7
Packit 2035a7
    if not wget(filepath):
Packit 2035a7
        if not wget(filepath):
Packit 2035a7
            results = open('results.txt', 'at')
Packit 2035a7
            results.write('wget failed\n')
Packit 2035a7
            results.close()
Packit 2035a7
            return
Packit 2035a7
Packit 2035a7
    filename = filepath[filepath.rfind('/') + 1:]
Packit 2035a7
    if filename[-3:] == '.gz':
Packit 2035a7
        subprocess.call(['tar', 'xzvf', filename])
Packit 2035a7
    elif filename[-3:] == '.xz':
Packit 2035a7
        subprocess.call(['tar', 'xJvf', filename])
Packit 2035a7
    elif filename[-4:] == '.bz2':
Packit 2035a7
        subprocess.call(['tar', 'xjvf', filename])
Packit 2035a7
Packit 2035a7
#
Packit 2035a7
# List of skipped packages - which trigger known yet unresolved problems with cppcheck.
Packit 2035a7
# The issues on trac (http://trac.cppcheck.net) are given for reference
Packit 2035a7
# boost #3654 (?)
Packit 2035a7
# flite #5975
Packit 2035a7
# insight#5184
Packit 2035a7
# valgrind #6151
Packit 2035a7
# gcc-arm - no ticket. Reproducible timeout in daca2 though as of 1.73/early 2016.
Packit 2035a7
#
Packit 2035a7
Packit 2035a7
    if filename[:5] == 'flite' or filename[:5] == 'boost' or filename[:7] == 'insight' or\
Packit 2035a7
            filename[:8] == 'valgrind' or filename[:7] == 'gcc-arm':
Packit 2035a7
        results = open('results.txt', 'at')
Packit 2035a7
        results.write('fixme: skipped package to avoid hang\n')
Packit 2035a7
        results.close()
Packit 2035a7
        return
Packit 2035a7
Packit 2035a7
    removeLargeFiles('')
Packit 2035a7
Packit 2035a7
    print('cppcheck ' + filename)
Packit 2035a7
Packit 2035a7
    p = subprocess.Popen(
Packit 2035a7
        ['nice',
Packit 2035a7
         '../cppcheck-O2',
Packit 2035a7
         '--dump',
Packit 2035a7
         '-D__GCC__',
Packit 2035a7
         '--enable=style',
Packit 2035a7
         '--error-exitcode=0',
Packit 2035a7
         jobs,
Packit 2035a7
         '.'],
Packit 2035a7
        stdout=subprocess.PIPE,
Packit 2035a7
        stderr=subprocess.PIPE)
Packit 2035a7
    p.communicate()
Packit 2035a7
Packit 2035a7
    results = open('results.txt', 'at')
Packit 2035a7
Packit 2035a7
    addons = sorted(glob.glob(os.path.expanduser('~/cppcheck/addons/*.py')))
Packit 2035a7
    for dumpfile in sorted(dumpfiles('')):
Packit 2035a7
        for addon in addons:
Packit 2035a7
            if 'cppcheckdata.py' in addon:
Packit 2035a7
                continue
Packit 2035a7
Packit 2035a7
            p2 = subprocess.Popen(['nice',
Packit 2035a7
                                   'python',
Packit 2035a7
                                   addon,
Packit 2035a7
                                   dumpfile],
Packit 2035a7
                                  stdout=subprocess.PIPE,
Packit 2035a7
                                  stderr=subprocess.PIPE)
Packit 2035a7
            comm = p2.communicate()
Packit 2035a7
            results.write(comm[1])
Packit 2035a7
    results.close()
Packit 2035a7
Packit 2035a7
FOLDER = None
Packit 2035a7
JOBS = '-j1'
Packit 2035a7
REV = None
Packit 2035a7
for arg in sys.argv[1:]:
Packit 2035a7
    if arg[:6] == '--rev=':
Packit 2035a7
        REV = arg[6:]
Packit 2035a7
    elif arg[:2] == '-j':
Packit 2035a7
        JOBS = arg
Packit 2035a7
    else:
Packit 2035a7
        FOLDER = arg
Packit 2035a7
Packit 2035a7
if not FOLDER:
Packit 2035a7
    print('no folder given')
Packit 2035a7
    sys.exit(1)
Packit 2035a7
Packit 2035a7
archives = getpackages(FOLDER)
Packit 2035a7
if len(archives) == 0:
Packit 2035a7
    print('failed to load packages')
Packit 2035a7
    sys.exit(1)
Packit 2035a7
Packit 2035a7
print('Sleep for 10 seconds..')
Packit 2035a7
time.sleep(10)
Packit 2035a7
Packit 2035a7
workdir = os.path.expanduser('~/daca2/')
Packit 2035a7
Packit 2035a7
print('~/daca2/' + FOLDER)
Packit 2035a7
if not os.path.isdir(workdir + FOLDER):
Packit 2035a7
    os.makedirs(workdir + FOLDER)
Packit 2035a7
os.chdir(workdir + FOLDER)
Packit 2035a7
Packit 2035a7
try:
Packit 2035a7
    results = open('results.txt', 'wt')
Packit 2035a7
    results.write('STARTDATE ' + str(datetime.date.today()) + '\n')
Packit 2035a7
    if REV:
Packit 2035a7
        results.write('GIT-REVISION ' + REV + '\n')
Packit 2035a7
    results.write('\n')
Packit 2035a7
    results.close()
Packit 2035a7
Packit 2035a7
    for archive in archives:
Packit 2035a7
        scanarchive(archive, JOBS)
Packit 2035a7
Packit 2035a7
    results = open('results.txt', 'at')
Packit 2035a7
    results.write('DATE ' + str(datetime.date.today()) + '\n')
Packit 2035a7
    results.close()
Packit 2035a7
Packit 2035a7
except EOFError:
Packit 2035a7
    pass
Packit 2035a7
Packit 2035a7
# remove all files/folders except results.txt
Packit 2035a7
removeAllExceptResults()