2017-08-15 18:50:34 +02:00
|
|
|
#!/usr/bin/python3
|
2017-08-11 21:49:54 +02:00
|
|
|
#########################################################################################
|
|
|
|
#
|
|
|
|
# Description: This script helps to build drivers in a Windows environment for PHP 7+ (32-bit/64-bit)
|
|
|
|
#
|
|
|
|
# Requirement:
|
2017-08-15 18:50:34 +02:00
|
|
|
# python 3.x
|
2017-08-11 21:49:54 +02:00
|
|
|
# PHP SDK and PHP Source
|
|
|
|
# Driver source code folder / GitHub repository
|
|
|
|
# Visual Studio 2015 (PHP 7.0* and 7.1*) and Visual Studio 2017 (PHP 7.2*)
|
|
|
|
#
|
|
|
|
# Execution: Run with command line with required options.
|
|
|
|
# Examples:
|
|
|
|
# py builddrivers.py (for interactive mode)
|
2017-08-18 19:25:19 +02:00
|
|
|
# py builddrivers.py --PHPVER=7.0.22 --ARCH=x64 --THREAD=nts --DRIVER=all --DEBUG
|
2017-08-11 21:49:54 +02:00
|
|
|
#
|
2017-08-18 19:25:19 +02:00
|
|
|
# Output: Build the drivers using PHP SDK. When running for local development, if build is unsuccessful,
|
2017-08-11 21:49:54 +02:00
|
|
|
# the log file will be launched for examination. Otherwise, the drivers will be renamed
|
2017-08-18 19:25:19 +02:00
|
|
|
# and copied to the designated location (if defined).
|
2017-08-11 21:49:54 +02:00
|
|
|
#
|
|
|
|
#############################################################################################
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import shutil
|
|
|
|
import os.path
|
|
|
|
import argparse
|
2019-02-07 00:57:52 +01:00
|
|
|
import subprocess
|
2017-08-11 21:49:54 +02:00
|
|
|
from buildtools import BuildUtil
|
2019-02-07 00:57:52 +01:00
|
|
|
from indexsymbols import *
|
2017-08-11 21:49:54 +02:00
|
|
|
|
|
|
|
class BuildDriver(object):
|
|
|
|
"""Build sqlsrv and/or pdo_sqlsrv drivers with PHP source with the following properties:
|
|
|
|
|
|
|
|
Attributes:
|
2017-08-14 17:54:21 +02:00
|
|
|
util # BuildUtil object whose constructor takes phpver, driver, arch, thread, debug
|
2017-08-11 21:49:54 +02:00
|
|
|
repo # GitHub repository
|
|
|
|
branch # GitHub repository branch
|
2017-08-18 19:25:19 +02:00
|
|
|
dest_path # alternative destination for the drivers (None for development builds)
|
2017-08-15 18:50:34 +02:00
|
|
|
rebuild # a boolean flag - whether the user is rebuilding
|
|
|
|
make_clean # a boolean flag - whether make clean is necessary
|
2017-08-11 21:49:54 +02:00
|
|
|
source_path # path to a local source folder
|
2017-08-18 19:25:19 +02:00
|
|
|
testing # whether the user has turned on testing mode
|
2019-02-07 00:57:52 +01:00
|
|
|
srctool_path # path to source indexing tools (empty string by default)
|
|
|
|
tag_version # tag version for source indexing (empty string by default)
|
2017-08-11 21:49:54 +02:00
|
|
|
"""
|
|
|
|
|
2018-04-23 18:05:21 +02:00
|
|
|
def __init__(self, phpver, driver, arch, thread, debug, repo, branch, source, path, testing, no_rename):
|
|
|
|
self.util = BuildUtil(phpver, driver, arch, thread, no_rename, debug)
|
2017-08-11 21:49:54 +02:00
|
|
|
self.repo = repo
|
|
|
|
self.branch = branch
|
2018-01-24 21:47:27 +01:00
|
|
|
self.source_path = source
|
2017-08-18 19:25:19 +02:00
|
|
|
self.dest_path = path
|
|
|
|
self.testing = testing
|
2017-08-11 21:49:54 +02:00
|
|
|
self.rebuild = False
|
|
|
|
self.make_clean = False
|
2019-02-07 00:57:52 +01:00
|
|
|
self.srctool_path = ''
|
|
|
|
self.tag_version = ''
|
2017-08-11 21:49:54 +02:00
|
|
|
|
|
|
|
def show_config(self):
|
2017-08-14 23:58:37 +02:00
|
|
|
print()
|
2017-08-11 21:49:54 +02:00
|
|
|
print('PHP Version: ', self.util.phpver)
|
|
|
|
print('Arch: ', self.util.arch)
|
|
|
|
print('Thread: ', self.util.thread)
|
|
|
|
print('Driver: ', self.util.driver)
|
2018-01-24 21:47:27 +01:00
|
|
|
print('Source: ', self.source_path)
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Debug enabled: ', self.util.debug_enabled)
|
2017-08-14 23:58:37 +02:00
|
|
|
print()
|
2017-08-11 21:49:54 +02:00
|
|
|
|
|
|
|
def clean_or_remove(self, root_dir, work_dir):
|
2017-08-18 19:25:19 +02:00
|
|
|
"""Only check this for local development and not rebuilding. If the php source directory
|
2017-08-14 23:58:37 +02:00
|
|
|
already exists, this will prompt user whether to rebuild, clean, or superclean, the last option
|
|
|
|
will remove the entire php source directory.
|
|
|
|
|
|
|
|
:param root_dir: the C:\ drive
|
|
|
|
:param work_dir: the directory of this script
|
|
|
|
:outcome: the old binaries, if exist, will be removed
|
2017-08-14 17:54:21 +02:00
|
|
|
"""
|
2017-08-11 21:49:54 +02:00
|
|
|
phpsrc = self.util.phpsrc_root(root_dir)
|
|
|
|
if os.path.exists( phpsrc ):
|
2017-08-14 17:54:21 +02:00
|
|
|
print(phpsrc + " exists.")
|
2017-08-17 18:16:57 +02:00
|
|
|
build_choice = validate_input("(r)ebuild for the same configuration, (c)lean otherwise, (s)uperclean if unsure ", "r/c/s")
|
2017-08-11 21:49:54 +02:00
|
|
|
self.make_clean = False
|
2017-08-14 23:58:37 +02:00
|
|
|
if build_choice == 'r':
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Will rebuild the binaries')
|
2017-08-14 23:58:37 +02:00
|
|
|
# only the old binaries based on the current configuration will be removed
|
2017-08-11 21:49:54 +02:00
|
|
|
self.util.remove_prev_build(root_dir)
|
2017-08-14 23:58:37 +02:00
|
|
|
elif build_choice == 'c':
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Will make clean')
|
|
|
|
self.make_clean = True
|
2017-08-14 23:58:37 +02:00
|
|
|
# all old builds are removed, and this step is necessary because
|
|
|
|
# the user might have changed the configuration
|
2017-08-11 21:49:54 +02:00
|
|
|
self.util.remove_old_builds(root_dir)
|
|
|
|
else:
|
|
|
|
print('Will remove ' + phpsrc)
|
|
|
|
os.system('RMDIR /s /q ' + phpsrc)
|
|
|
|
|
2017-08-14 23:58:37 +02:00
|
|
|
os.chdir(work_dir) # change back to the working directory
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2018-01-24 21:47:27 +01:00
|
|
|
def get_local_source(self, source_path):
|
|
|
|
"""This assumes interactive mode (not testing) and takes care of getting
|
|
|
|
the user's input to the path of the local source files for the drivers
|
|
|
|
"""
|
|
|
|
while True:
|
|
|
|
if source_path is None:
|
|
|
|
source = input('Enter the full path to the source folder: ')
|
|
|
|
else:
|
|
|
|
source = input("Hit ENTER to use '" + source_path + "' or provide another path to the source folder: ")
|
|
|
|
if len(source) == 0:
|
|
|
|
source = source_path
|
|
|
|
|
|
|
|
valid = True
|
|
|
|
if os.path.exists(source) and os.path.exists(os.path.join(source, 'shared')):
|
|
|
|
# Checking the existence of 'shared' folder only, assuming
|
|
|
|
# sqlsrv and/or pdo_sqlsrv are also present if it exists
|
|
|
|
self.source_path = source
|
|
|
|
break
|
|
|
|
|
|
|
|
print("The path provided is invalid. Please re-enter.")
|
|
|
|
return source
|
|
|
|
|
2019-02-07 00:57:52 +01:00
|
|
|
def index_all_symbols(self, ext_dir, srctool_path, tag_version):
|
|
|
|
"""This takes care of indexing all the symbols
|
|
|
|
|
|
|
|
:param ext_dir: the directory where we can find the built extension(s)
|
|
|
|
:param srctool_path: the path to the tools for source indexing
|
|
|
|
:param tag_version: tag version for source indexing
|
|
|
|
:outcome: all symbols will be source indexed
|
|
|
|
"""
|
|
|
|
work_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
os.chdir(srctool_path)
|
|
|
|
|
|
|
|
if self.util.driver == 'all':
|
|
|
|
driver = 'sqlsrv'
|
|
|
|
pdbfile = os.path.join(ext_dir, self.util.driver_name(driver, '.pdb'))
|
|
|
|
print('Indexing this symbol: ', pdbfile)
|
|
|
|
run_indexing_tools(pdbfile, driver, tag_version)
|
|
|
|
driver = 'pdo_sqlsrv'
|
|
|
|
pdbfile = os.path.join(ext_dir, self.util.driver_name(driver, '.pdb'))
|
|
|
|
print('Indexing this symbol: ', pdbfile)
|
|
|
|
run_indexing_tools(pdbfile, driver, tag_version)
|
|
|
|
else:
|
|
|
|
driver = self.util.driver
|
|
|
|
pdbfile = os.path.join(ext_dir, self.util.driver_name(driver, '.pdb'))
|
|
|
|
print('Indexing this symbol: ', pdbfile)
|
|
|
|
run_indexing_tools(pdbfile, driver, tag_version)
|
|
|
|
|
|
|
|
os.chdir(work_dir)
|
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
def build_extensions(self, root_dir, logfile):
|
2017-08-14 17:54:21 +02:00
|
|
|
"""This takes care of getting the drivers' source files, building the drivers.
|
2017-08-18 19:25:19 +02:00
|
|
|
If dest_path is defined, the binaries will be copied to the designated destinations.
|
2017-08-14 23:58:37 +02:00
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
:param root_dir: the root directory
|
2017-08-14 23:58:37 +02:00
|
|
|
:param logfile: the name of the logfile
|
|
|
|
:outcome: the drivers and symbols will renamed and placed in the appropriate location(s)
|
|
|
|
|
2017-08-14 17:54:21 +02:00
|
|
|
"""
|
2017-08-11 21:49:54 +02:00
|
|
|
work_dir = os.path.dirname(os.path.realpath(__file__))
|
2017-08-18 19:25:19 +02:00
|
|
|
|
2018-04-20 23:57:24 +02:00
|
|
|
get_source = False if self.source_path is None else True
|
|
|
|
if self.repo is None or self.branch is None:
|
|
|
|
# If GitHub repo or branch is None, get the source locally
|
|
|
|
get_source = True
|
|
|
|
|
|
|
|
if not get_source:
|
|
|
|
# This will download from the specified branch on GitHub repo and copy the source
|
2017-08-11 21:49:54 +02:00
|
|
|
self.util.download_msphpsql_source(repo, branch)
|
|
|
|
else:
|
2018-01-24 21:47:27 +01:00
|
|
|
source = self.source_path
|
|
|
|
# Do not prompt user for input if it's in a testing mode
|
|
|
|
if not self.testing:
|
|
|
|
source = self.get_local_source(self.source_path)
|
|
|
|
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Copying source files from', source)
|
|
|
|
|
|
|
|
os.system('ROBOCOPY ' + source + '\shared ' + work_dir + '\Source\shared /xx /xo ')
|
|
|
|
os.system('ROBOCOPY ' + source + '\sqlsrv ' + work_dir + '\Source\sqlsrv /xx /xo ')
|
|
|
|
os.system('ROBOCOPY ' + source + '\pdo_sqlsrv ' + work_dir + '\Source\pdo_sqlsrv /xx /xo ')
|
|
|
|
|
|
|
|
print('Start building PHP with the extension...')
|
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
# If not testing, dest should be the root drive. Otherwise, dest should be None.
|
|
|
|
dest = None if self.testing else root_dir
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
# ext_dir is the directory where we can find the built extension(s)
|
|
|
|
ext_dir = self.util.build_drivers(self.make_clean, dest, logfile)
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2019-02-07 00:57:52 +01:00
|
|
|
# Do source indexing only if the tag and tools path are both specified
|
|
|
|
if self.tag_version is not '' and self.srctool_path is not '':
|
|
|
|
print('Source indexing begins...')
|
|
|
|
self.index_all_symbols(ext_dir, self.srctool_path, self.tag_version)
|
|
|
|
print('Source indexing done')
|
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
# Copy the binaries if a destination path is defined
|
|
|
|
if self.dest_path is not None:
|
|
|
|
dest_drivers = os.path.join(self.dest_path, self.util.major_version(), self.util.arch)
|
|
|
|
dest_symbols = os.path.join(dest_drivers, 'Symbols', self.util.thread)
|
|
|
|
|
|
|
|
# All intermediate directories will be created in order to create the leaf directory
|
|
|
|
if os.path.exists(dest_symbols) == False:
|
|
|
|
os.makedirs(dest_symbols)
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
# Now copy all the binaries
|
|
|
|
if self.util.driver == 'all':
|
|
|
|
self.util.copy_binary(ext_dir, dest_drivers, 'sqlsrv', '.dll')
|
|
|
|
self.util.copy_binary(ext_dir, dest_symbols, 'sqlsrv', '.pdb')
|
|
|
|
self.util.copy_binary(ext_dir, dest_drivers, 'pdo_sqlsrv', '.dll')
|
|
|
|
self.util.copy_binary(ext_dir, dest_symbols, 'pdo_sqlsrv', '.pdb')
|
|
|
|
else:
|
|
|
|
self.util.copy_binary(ext_dir, dest_drivers, self.util.driver, '.dll')
|
|
|
|
self.util.copy_binary(ext_dir, dest_symbols, self.util.driver, '.pdb')
|
2018-04-20 23:57:24 +02:00
|
|
|
|
|
|
|
return ext_dir
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2019-02-07 00:57:52 +01:00
|
|
|
def build(self, srctool_path, tag_version):
|
2017-08-14 23:58:37 +02:00
|
|
|
"""This is the main entry point of building drivers for PHP.
|
2017-08-18 19:25:19 +02:00
|
|
|
For development, this will loop till the user decides to quit.
|
2019-02-07 00:57:52 +01:00
|
|
|
|
|
|
|
:param srctool_path: the path to the tools for source indexing
|
|
|
|
:param tag_version: tag version for source indexing
|
2017-08-14 23:58:37 +02:00
|
|
|
"""
|
2017-08-11 21:49:54 +02:00
|
|
|
self.show_config()
|
|
|
|
|
|
|
|
work_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
root_dir = 'C:' + os.sep
|
|
|
|
|
|
|
|
quit = False
|
|
|
|
while not quit:
|
2018-01-24 21:47:27 +01:00
|
|
|
if self.testing:
|
|
|
|
self.make_clean = True
|
|
|
|
self.util.remove_old_builds(work_dir)
|
|
|
|
elif not self.rebuild:
|
2017-08-11 21:49:54 +02:00
|
|
|
self.clean_or_remove(root_dir, work_dir)
|
|
|
|
|
|
|
|
logfile = self.util.get_logfile_name()
|
|
|
|
|
2019-02-07 00:57:52 +01:00
|
|
|
# Save source indexing details
|
|
|
|
self.srctool_path = srctool_path
|
|
|
|
self.tag_version = tag_version
|
|
|
|
|
2017-08-11 21:49:54 +02:00
|
|
|
try:
|
2018-04-20 23:57:24 +02:00
|
|
|
ext_dir = self.build_extensions(root_dir, logfile)
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Build Completed')
|
|
|
|
except:
|
2017-08-17 18:16:57 +02:00
|
|
|
print('Something went wrong, launching log file', logfile)
|
2017-08-18 19:25:19 +02:00
|
|
|
# display log file only when not testing
|
|
|
|
if not self.testing:
|
2017-08-11 21:49:54 +02:00
|
|
|
os.startfile(os.path.join(root_dir, 'php-sdk', logfile))
|
2018-04-20 23:57:24 +02:00
|
|
|
os.chdir(work_dir)
|
|
|
|
exit(1)
|
2017-08-11 21:49:54 +02:00
|
|
|
|
2017-08-18 19:25:19 +02:00
|
|
|
if not self.testing:
|
2017-08-17 01:09:11 +02:00
|
|
|
choice = input("Rebuild using the same configuration(yes) or quit (no) [yes/no]: ")
|
2017-08-17 18:16:57 +02:00
|
|
|
choice = choice.lower()
|
|
|
|
if choice == 'yes' or choice == 'y' or choice == '':
|
2017-08-11 21:49:54 +02:00
|
|
|
print('Rebuilding drivers...')
|
|
|
|
self.make_clean = False
|
|
|
|
self.rebuild = True
|
|
|
|
self.util.remove_prev_build(root_dir)
|
|
|
|
else:
|
|
|
|
quit = True
|
|
|
|
else:
|
|
|
|
quit = True
|
|
|
|
|
|
|
|
os.chdir(work_dir)
|
|
|
|
|
|
|
|
def validate_input(question, values):
|
|
|
|
"""Return the user selected value, and it must be valid based on *values*."""
|
|
|
|
while True:
|
|
|
|
options = values.split('/')
|
|
|
|
prompt = '[' + values + ']'
|
|
|
|
value = input(question + prompt + ': ')
|
|
|
|
value = value.lower()
|
|
|
|
if not value in options:
|
|
|
|
print("An invalid choice is entered. Choose from", prompt)
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
return value
|
|
|
|
|
|
|
|
################################### Main Function ###################################
|
|
|
|
if __name__ == '__main__':
|
|
|
|
parser = argparse.ArgumentParser()
|
2017-08-18 19:25:19 +02:00
|
|
|
parser.add_argument('--PHPVER', help="PHP version, e.g. 7.1.*, 7.2.* etc.")
|
|
|
|
parser.add_argument('--ARCH', choices=['x64', 'x86'])
|
|
|
|
parser.add_argument('--THREAD', choices=['nts', 'ts'])
|
|
|
|
parser.add_argument('--DRIVER', default='all', choices=['all', 'sqlsrv', 'pdo_sqlsrv'], help="driver to build (default: all)")
|
|
|
|
parser.add_argument('--DEBUG', action='store_true', help="enable debug mode (default: False)")
|
|
|
|
parser.add_argument('--REPO', default='Microsoft', help="GitHub repository (default: Microsoft)")
|
2018-08-17 23:18:52 +02:00
|
|
|
parser.add_argument('--BRANCH', default='dev', help="GitHub repository branch or tag (default: dev)")
|
2018-01-24 21:47:27 +01:00
|
|
|
parser.add_argument('--SOURCE', default=None, help="a local path to source file (default: None)")
|
2017-08-18 19:25:19 +02:00
|
|
|
parser.add_argument('--TESTING', action='store_true', help="turns on testing mode (default: False)")
|
|
|
|
parser.add_argument('--DESTPATH', default=None, help="an alternative destination for the drivers (default: None)")
|
2018-04-23 18:05:21 +02:00
|
|
|
parser.add_argument('--NO_RENAME', action='store_true', help="drivers will not be renamed(default: False)")
|
2019-02-07 00:57:52 +01:00
|
|
|
parser.add_argument('--SRCIDX_PATH', default='', help="the path to the tools for source indexing (default: '')")
|
|
|
|
parser.add_argument('--TAG_VERSION', default='', help="the tag version for source indexing (default: '')")
|
2017-08-11 21:49:54 +02:00
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
phpver = args.PHPVER
|
|
|
|
arch = args.ARCH
|
|
|
|
thread = args.THREAD
|
|
|
|
driver = args.DRIVER
|
2017-08-18 19:25:19 +02:00
|
|
|
debug = args.DEBUG
|
2017-08-11 21:49:54 +02:00
|
|
|
repo = args.REPO
|
|
|
|
branch = args.BRANCH
|
2018-01-24 21:47:27 +01:00
|
|
|
source = args.SOURCE
|
2017-08-15 18:50:34 +02:00
|
|
|
path = args.DESTPATH
|
2017-08-18 19:25:19 +02:00
|
|
|
testing = args.TESTING
|
2018-04-23 18:05:21 +02:00
|
|
|
no_rename = args.NO_RENAME
|
2017-08-11 21:49:54 +02:00
|
|
|
|
|
|
|
if phpver is None:
|
2017-08-18 19:25:19 +02:00
|
|
|
# starts interactive mode, testing mode is False
|
|
|
|
# will not prompt for drivers' destination path, which is None by default
|
|
|
|
while True:
|
|
|
|
# perform some minimal checks
|
|
|
|
phpver = input("PHP Version (e.g. 7.1.* or 7.2.*): ")
|
|
|
|
if phpver == '':
|
|
|
|
print('Empty PHP version entered! Please try again.')
|
|
|
|
elif phpver[0] < '7':
|
|
|
|
print('Only PHP 7.0 or above is supported. Please try again.')
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
|
2017-08-15 18:50:34 +02:00
|
|
|
arch_version = input("64-bit? [y/n]: ")
|
2017-08-11 21:49:54 +02:00
|
|
|
thread = validate_input("Thread safe? ", "nts/ts")
|
|
|
|
driver = validate_input("Driver to build? ", "all/sqlsrv/pdo_sqlsrv")
|
2017-08-15 18:50:34 +02:00
|
|
|
debug_mode = input("Debug enabled? [y/n]: ")
|
2017-08-18 19:25:19 +02:00
|
|
|
|
2017-08-15 18:50:34 +02:00
|
|
|
answer = input("Download source from a GitHub repo? [y/n]: ")
|
2017-08-11 21:49:54 +02:00
|
|
|
if answer == 'yes' or answer == 'y' or answer == '':
|
|
|
|
repo = input("Name of the repo (hit enter for 'Microsoft'): ")
|
2018-08-17 23:18:52 +02:00
|
|
|
branch = input("Name of the branch or tag (hit enter for 'dev'): ")
|
2017-08-11 21:49:54 +02:00
|
|
|
if repo == '':
|
|
|
|
repo = 'Microsoft'
|
|
|
|
if branch == '':
|
|
|
|
branch = 'dev'
|
2018-04-20 23:57:24 +02:00
|
|
|
else:
|
|
|
|
repo = branch = None
|
|
|
|
|
|
|
|
arch_version = arch_version.lower()
|
2017-08-11 21:49:54 +02:00
|
|
|
arch = 'x64' if arch_version == 'yes' or arch_version == 'y' or arch_version == '' else 'x86'
|
|
|
|
|
|
|
|
debug_mode = debug_mode.lower()
|
|
|
|
debug = debug_mode == 'yes' or debug_mode == 'y' or debug_mode == ''
|
|
|
|
|
|
|
|
builder = BuildDriver(phpver,
|
|
|
|
driver,
|
|
|
|
arch,
|
|
|
|
thread,
|
|
|
|
debug,
|
|
|
|
repo,
|
|
|
|
branch,
|
2018-01-24 21:47:27 +01:00
|
|
|
source,
|
2017-08-18 19:25:19 +02:00
|
|
|
path,
|
2018-04-23 18:05:21 +02:00
|
|
|
testing,
|
|
|
|
no_rename)
|
2019-02-07 00:57:52 +01:00
|
|
|
builder.build(args.SRCIDX_PATH, args.TAG_VERSION)
|