[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/github/codeql/codeql-cli/v2.26.3/python/extractor/make_zips.py [Back]  [Original]

#!/usr/bin/env python

import os
import shutil
import sys
import zipfile
import optparse
import compileall

from python_tracer import getzipfilename

# TO DO -- Add options to set destination directory and source directory


def find_tools():
    try:
        return os.environ['PYTHON_INSTALLER_OUTPUT']
    except KeyError:
        pass
    try:
        return os.environ['ODASA_TOOLS']
    except KeyError:
        pass
    try:
        return os.path.join(os.environ['SEMMLE_DIST'], 'tools')
    except KeyError:
        pass
    try:
        return os.path.join(os.environ['ODASA_HOME'], 'tools')
    except KeyError:
        pass
    raise Exception('ODASA_TOOLS environment variable is not set')

def find_src():
    if __name__ == '__main__':
        return os.path.dirname(os.path.abspath(sys.argv[0]))
    raise Exception('Cannot find source code')


def build_byte_compiled_zip(src_dir, zippath):
    # TODO(low): Why are we compiling ourselves, when writepy can also do that?
    compileall.compile_dir(os.path.join(src_dir, 'semmle'), force=True, quiet=True)

    zipped = zipfile.PyZipFile(zippath, 'w')

    zipped.writepy(os.path.join(src_dir, '__main__.py'))
    zipped.writepy(os.path.join(src_dir, 'semmle'))
    zipped.writepy(os.path.join(src_dir, 'blib2to3'))
    zipped.writepy(os.path.join(src_dir, 'lark'))
    zipped.writepy(os.path.join(src_dir, 'buildtools'))
    zipped.write(os.path.join(src_dir, 'blib2to3', 'Grammar.txt'), 'blib2to3/Grammar.txt')
    zipped.write(os.path.join(src_dir, 'lark', 'grammars', 'common.lark'), 'lark/grammars/common.lark')

    data_dir = os.path.join(src_dir, 'semmle', 'data')
    for f in os.listdir(data_dir):
        if f.endswith('.trap'):
            zipped.write(os.path.join(data_dir, f), os.path.join('semmle', 'data', f))
    zipped.close()


def build_source_zip(src_dir, zippath):
    zipped = zipfile.PyZipFile(zippath, 'w')

    zipped.write(os.path.join(src_dir, '__main__.py'), '__main__.py')
    zipped.write(os.path.join(src_dir, 'imp.py'), 'imp.py')
    write_source(zipped, src_dir, 'semmle')
    write_source(zipped, src_dir, 'blib2to3', ('.py', '.txt', ''))
    write_source(zipped, src_dir, 'lark', (".py", ".lark", ""))
    write_source(zipped, src_dir, 'buildtools')

    data_dir = os.path.join(src_dir, 'semmle', 'data')
    for f in os.listdir(data_dir):
        if f.endswith('.trap'):
            zipped.write(os.path.join(data_dir, f), os.path.join('semmle', 'data', f))

    zipped.close()

def write_source(zipped, root, name, extensions=[".py"]):
    src = os.path.join(root, name)
    for dirpath, _, filenames in os.walk(src):
        for name in filenames:
            _, ext = os.path.splitext(name)
            if ext not in extensions:
                continue
            path = os.path.join(dirpath, name)
            zipped.write(path, os.path.relpath(path, root))

def main():
    parser = optparse.OptionParser(usage = "usage: %prog [install-dir]")
    _, args = parser.parse_args(sys.argv[1:])
    if len(args) > 1:
        parser.print_usage()
    elif args:
        tools_dir = args[0]
        if not os.path.exists(tools_dir):
            os.makedirs(tools_dir)
    else:
        tools_dir = find_tools()
    src_dir = find_src()

    zippath = os.path.join(src_dir, getzipfilename())

    if sys.version_info > (3,):
        build_source_zip(src_dir, zippath)
    else:
        build_byte_compiled_zip(src_dir, zippath)

    shutil.copy(zippath, tools_dir)

if __name__ == '__main__':
    main()

Web Proxy Viewer  |  New URL  |  Original Page