def main(argv=None):
    token = utils.get_github_api_accesstoken()
    asset_pattern = re.compile(utils.sapmachine_asset_pattern())
    asset_map_jre = {}
    asset_map_jdk = {}

    releases = utils.get_github_releases()

    for release in releases:
        if release['prerelease'] is True:
            continue

        t = SapMachineTag.from_string(release['name'])
        if t is None:
            continue

        assets = release['assets']
        for asset in assets:
            match = asset_pattern.match(asset['name'])
            if match is None:
                continue

            asset_image_type = match.group(1)
            asset_os = match.group(3)

            if asset_os == 'linux-x64':
                sapmachine_version = t.get_version()
                build_number = t.get_build_number()

                buildpack_version = str.format(
                    '{0}.{1}.{2}_{3}.{4}.b{5}', sapmachine_version[0],
                    sapmachine_version[1], sapmachine_version[2],
                    sapmachine_version[3], sapmachine_version[4],
                    build_number if build_number else '0')

                if asset_image_type == 'jre':
                    asset_map_jre[buildpack_version] = asset[
                        'browser_download_url']
                else:
                    asset_map_jdk[buildpack_version] = asset[
                        'browser_download_url']

    local_repo = join(os.getcwd(), 'gh-pages')
    utils.git_clone('github.com/SAP/SapMachine.git', 'gh-pages', local_repo)
    write_index_yaml(
        asset_map_jre,
        join(local_repo, 'assets', 'cf', 'jre', 'linux', 'x86_64'))
    write_index_yaml(
        asset_map_jdk,
        join(local_repo, 'assets', 'cf', 'jdk', 'linux', 'x86_64'))
    utils.git_commit(local_repo, 'Updated index.yml', ['assets'])
    utils.git_push(local_repo)
    utils.remove_if_exists(local_repo)

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tag', help='the SapMachine git tag', metavar='TAG')
    parser.add_argument('-b', '--build', help='the build number to use, overrules any value from tag(s)', metavar='BUILD_NR')
    parser.add_argument('-r', '--release', help='set if this is a release build', action='store_true', default=False)
    parser.add_argument('-g', '--branch', help='the SapMachine git branch', metavar='BRANCH')
    args = parser.parse_args()

    configure_opts = []

    # parse tag, if given
    tag = None
    if args.tag:
        tag = SapMachineTag.from_string(args.tag)
        if tag is None:
            print(str.format("Passed tag {0} not recognized as SapMachine tag, handling as snapshot build", args.tag), file=sys.stderr)

    # parse major from SapMachine branch, if given
    major_from_branch = 0
    if args.branch:
        branch_pattern = re.compile(utils.sapmachine_branch_pattern())
        match = branch_pattern.match(args.branch)
        if match is not None:
            if match.group(1) is not None:
                major_from_branch = int(match.group(1))
            else:
                major_from_branch = 9999

    # determine and set version date
    release_date = None
    if tag is not None:
        releases = utils.get_github_releases()
        if releases is not None:
            for release in releases:
                if release['tag_name'] == tag.as_string():
                    release_date = release['published_at'].split('T')[0]
                    print(str.format("Set date to release date of {0}: {1}", tag.as_string(), release_date), file=sys.stderr)
                    break
        if release_date is None:
            print(str.format("Tag {0} does not seem to exist or data could not be loaded from GitHub", tag.as_string()), file=sys.stderr)

    if release_date is None:
        release_date = date.today().strftime("%Y-%m-%d")
        print(str.format("Set date to today: {0}", release_date), file=sys.stderr)

    configure_opts.append(VERSION_DATE_ARG.format(release_date))

    # determine and set build number
    build_number = None
    if args.build is not None:
        build_number = args.build
        print(str.format("Set build number from parameter: {0}", build_number), file=sys.stderr)

    if build_number is None and tag is not None:
        build_number = tag.get_build_number()
        if build_number is not None:
            print(str.format("Set build number from tag: {0}", build_number), file=sys.stderr)
        else:
            latest_non_ga_tag = tag.get_latest_non_ga_tag()
            if latest_non_ga_tag is not None:
                build_number = latest_non_ga_tag.get_build_number()
                if build_number is not None:
                    print(str.format("Tag seems to be a ga tag, using build number from latest non-ga tag {0}: {1}",
                        latest_non_ga_tag.as_string(), build_number), file=sys.stderr)

    if build_number is not None:
        configure_opts.append(VERSION_BUILD_ARG.format(build_number))

    # set version pre
    version_pre = ''
    if not args.release:
        if tag is None:
            version_pre = 'snapshot'
        else:
            version_pre = 'ea'

    if utils.get_arch().startswith('aarch64'):
        if not version_pre:
            version_pre = 'beta'
        else:
            version_pre += '-beta'

    configure_opts.append(VERSION_PRE_ARG.format(version_pre))

    # set version opt
    if tag is None:
        configure_opts.append(VERSION_OPT_ARG.format(release_date))
    else:
        if args.release and utils.sapmachine_is_lts(tag.get_major()):
            if tag.get_major() < 15:
                configure_opts.append(VERSION_OPT_ARG.format('LTS-sapmachine'))
            else:
                configure_opts.append(VERSION_OPT_ARG.format('LTS'))
        else:
            if tag.get_major() < 15:
                configure_opts.append(VERSION_OPT_ARG.format('sapmachine'))
            else:
                configure_opts.append(VERSION_OPT_ARG.format(''))

    # set version extra1 arg (= sap version)
    if tag is not None and tag.get_version_sap() is not None:
        configure_opts.append(VERSION_EXTRA1_ARG.format(tag.get_version_sap()))

    # set vendor version string
    if (tag is None or
        (tag.get_major() > 14) or
        (tag.get_major() == 14 and tag.get_update() > 1) or
        (tag.get_major() == 11 and tag.get_update() > 7)):
        configure_opts.append(VENDOR_VERSION_STRING_ARG)

    # set other vendor options
    configure_opts.append(VENDOR_NAME_ARG)
    configure_opts.append(VENDOR_URL_ARG)
    configure_opts.append(VENDOR_BUG_URL_ARG)
    configure_opts.append(VENDOR_VM_BUG_URL_ARG)

    # set getest option
    if 'GTEST_DIR' in os.environ:
        if (tag is not None and tag.get_major() >= 15) or major_from_branch >= 15:
            configure_opts.append(GTEST_OPT.format(os.environ['GTEST_DIR']))

    print(' '.join(configure_opts))

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-m',
                        '--major',
                        help='the SapMachine major version to build',
                        metavar='MAJOR',
                        required=True)
    parser.add_argument('-d',
                        '--destination',
                        help='the download destination',
                        metavar='DIR',
                        required=True)
    args = parser.parse_args()

    boot_jdk_major_max = int(args.major)
    boot_jdk_major_min = boot_jdk_major_max - 1
    destination = os.path.realpath(args.destination)
    releases = utils.get_github_releases()
    platform = str.format('{0}-{1}_bin', utils.get_system(), utils.get_arch())
    retries = 2

    releases = extra_bootjdks + releases

    while retries > 0:
        for release in releases:

            if release['prerelease']:
                continue

            tag = SapMachineTag.from_string(release['name'])

            if tag is None:
                print(
                    str.format("SapMachine release {0} not recognized",
                               release['name']))
                continue
            major = tag.get_major()

            if major <= boot_jdk_major_max and major >= boot_jdk_major_min:
                assets = release['assets']

                for asset in assets:
                    asset_name = asset['name']
                    asset_url = asset['browser_download_url']

                    if 'jdk' in asset_name and platform in asset_name and (
                            asset_name.endswith('.tar.gz')
                            or asset_name.endswith('.zip')
                    ) and 'symbols' not in asset_name:
                        archive_path = join(destination, asset_name)
                        utils.remove_if_exists(archive_path)
                        utils.download_artifact(asset_url, archive_path)
                        boot_jdk_exploded = join(destination, 'boot_jdk')
                        utils.remove_if_exists(boot_jdk_exploded)
                        os.makedirs(boot_jdk_exploded)
                        utils.extract_archive(archive_path, boot_jdk_exploded)

                        sapmachine_folder = [
                            f for f_ in [
                                glob.glob(join(boot_jdk_exploded, e))
                                for e in ('sapmachine*', 'jdk*')
                            ] for f in f_
                        ]

                        if sapmachine_folder is not None:
                            sapmachine_folder = sapmachine_folder[0]
                            files = os.listdir(sapmachine_folder)

                            for f in files:
                                shutil.move(join(sapmachine_folder, f),
                                            boot_jdk_exploded)

                            utils.remove_if_exists(sapmachine_folder)

                            if utils.get_system() == 'osx':
                                files = os.listdir(
                                    join(boot_jdk_exploded, 'Contents',
                                         'Home'))

                                for f in files:
                                    shutil.move(
                                        join(boot_jdk_exploded, 'Contents',
                                             'Home', f), boot_jdk_exploded)

                                utils.remove_if_exists(
                                    join(boot_jdk_exploded, 'Contents'))

                        return 0
        retries -= 1
        if retries == 1:
            boot_jdk_major_min = boot_jdk_major_max - 2

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tag', help='Test a tag', metavar='TAG')
    parser.add_argument('-l',
                        '--list-latest-non-ga',
                        default=False,
                        help='List the latest non-ga tag',
                        action='store_true')
    parser.add_argument(
        '-a',
        '--test-all-tags',
        nargs='?',
        default='not present',
        const='all',
        help='List latest tags, value could be sap,jdk,unknown')
    parser.add_argument('-r',
                        '--test-all-releases',
                        default=False,
                        help='List latest releases',
                        action='store_true')
    parser.add_argument('-v', '--jvm', help='Test a VM', metavar='VM Path')
    parser.add_argument('-s',
                        '--version-string',
                        help='Test a VM version String',
                        metavar='Version String')
    args = parser.parse_args()

    if args.tag:
        tag = Tag.from_string(args.tag)
        if tag is None:
            print(
                str.format("Tag value {0} seems to be an invalid tag",
                           args.tag))
            sys.exit(-1)
        tag.print_details()
        if args.list_latest_non_ga:
            latest_non_ga_tag = tag.get_latest_non_ga_tag()
            if latest_non_ga_tag is None:
                print(str.format('Latest non-ga tag is None'))
            else:
                print(str.format('Latest non-ga tag:'))
                latest_non_ga_tag.print_details()

    if args.test_all_tags != 'not present':
        print_unknown = args.test_all_tags != "sap" and args.test_all_tags != "jdk"
        print_sap = args.test_all_tags != "unknown" and args.test_all_tags != "jdk"
        print_jdk = args.test_all_tags != "unknown" and args.test_all_tags != "sap"
        tags = utils.get_github_tags()
        if tags is None:
            print("Could not get tags from GitHub")
            sys.exit(-1)
        for tag in tags:
            to = Tag.from_string(tag['name'])
            if to is None:
                if print_unknown:
                    print(str.format("Tag {0} is unknown.", tag['name']))
            elif to.is_sapmachine_tag():
                if print_sap:
                    to.print_details()
                    latest_non_ga = to.get_latest_non_ga_tag()
                    if latest_non_ga is None:
                        print(
                            str.format("Latest non-ga tag for {0} is None",
                                       to.as_string()))
                        sys.exit(-1)
                    elif latest_non_ga != to:
                        print("  Latest non-ga tag:")
                        latest_non_ga.print_details(indent='  ')
            elif to.is_jdk_tag():
                if print_jdk:
                    to.print_details()
                    latest_non_ga = to.get_latest_non_ga_tag()
                    if latest_non_ga is None:
                        print(
                            str.format("Latest non-ga tag for {0} is None",
                                       to.as_string()))
                        sys.exit(-1)
                    elif latest_non_ga != to:
                        print("  Latest non-ga tag:")
                        latest_non_ga.print_details(indent='  ')

    if args.test_all_releases:
        releases = utils.get_github_releases()
        if releases is None:
            print("Could not get releases from GitHub")
            sys.exit(-1)
        for release in releases:
            t = SapMachineTag.from_string(release['name'])
            if t is None:
                print(str.format("Release {0} is unknown.", release['name']))
            else:
                t.print_details()

    if args.jvm:
        _, std_out, std_err = utils.run_cmd(
            [join(args.jvm, 'bin', 'java.exe'), '-version'], std=True)
        print('Stdout:')
        print(std_out)
        print('Stderr')
        print(std_err)

        version, major = utils.sapmachine_version_components(std_err)
        version_components = [version, major]
        print(' '.join([
            version_component if version_component else 'N/A'
            for version_component in version_components
        ]))
        sapmachine_version = [e for e in version.split('.')]
        print(sapmachine_version)

    if args.version_string:
        print(
            str.format("Version string to test: \"{0}\".",
                       args.version_string))

        version, major = utils.sapmachine_version_components(
            args.version_string)
        version_components = [version, major]
        print(' '.join([
            version_component if version_component else 'N/A'
            for version_component in version_components
        ]))
        sapmachine_version = [e for e in version.split('.')]
        print(sapmachine_version)

    return 0
def main(argv=None):
    print("Querying GitHub for SapMachine releases...")
    sys.stdout.flush()
    releases = utils.get_github_releases()
    print("Done.")

    asset_pattern = re.compile(utils.sapmachine_asset_pattern())
    release_dict = {}
    for release in releases:
        sapMachineTag = SapMachineTag.from_string(release['name'])

        if sapMachineTag is None:
            print(str.format("{0} is no SapMachine release, dropping", release['name']))
            continue

        major = sapMachineTag.get_major()
        if not major in release_dict:
            sapMachineVersion = SapMachineMajorVersion(major)
            release_dict[major] = sapMachineVersion
        else:
            sapMachineVersion = release_dict[major]

        sapMachineRelease = sapMachineVersion.get_release_object_to_update_if_tag_is_newer(sapMachineTag, release['prerelease'], release['html_url'])

        if sapMachineRelease is None:
            continue

        for asset in release['assets']:
            match = asset_pattern.match(asset['name'])

            if match is None:
                continue

            image_type = match.group(1)
            os = match.group(3)
            file_type = match.group(4)

            if os == 'windows-x64' and file_type == '.msi':
                os = 'windows-x64-installer'

            if os == 'macos-x64' or os == 'osx-x64':
                if file_type == '.dmg':
                    os = 'macos-x64-installer'
                else:
                    os = 'macos-x64'

            if os == 'macos-aarch64' or os == 'osx-aarch64':
                if file_type == '.dmg':
                    os = 'macos-aarch64-installer'
                else:
                    os = 'macos-aarch64'

            sapMachineRelease.add_asset(image_type, os, asset['browser_download_url'])

    # reduce releases dictionary by removing obsolete versions
    # Keep LTS versions, latest release and the release that is currently in development
    latest_released_version = 0
    for major in list(release_dict.keys()):
        if not release_dict[major].is_released():
            continue
        if major > latest_released_version:
            if latest_released_version > 0 and not release_dict[latest_released_version].is_lts():
                del release_dict[latest_released_version]
            latest_released_version = major
        elif not release_dict[major].is_lts():
            del release_dict[major]

    json_root = {
        'majors':[],
        'imageTypes':[],
        'os':[],
        'assets':{}
    }

    for major in release_dict:
        release_dict[major].add_to_release_json(json_root)

    for image_type in image_type_description:
        json_root['imageTypes'].append({'key': image_type, 'value': image_type_description[image_type]['name'], 'ordinal': image_type_description[image_type]['ordinal']})

    for os in os_description:
        json_root['os'].append({'key': os, 'value': os_description[os]['name'], 'ordinal': os_description[os]['ordinal']})

    files = [{
        'location': join('assets', 'data', 'sapmachine_releases.json'),
        'data': json.dumps(json_root, indent=4),
        'commit_message': 'Updated release data.'
    }]

    for major in release_dict:
        if not release_dict[major].is_released():
            continue

        files.append({
            'location': join('latest', str(major), 'index.md'),
            'data': Template(latest_template).substitute(
                major = major,
                url = release_dict[major].release.url
            ),
            'commit_message': str.format('Updated latest link for SapMachine {0}', major)
        })

    push_to_git(files)

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tag', help='the SapMachine tag', metavar='MAJOR', required=True)
    parser.add_argument('-d', '--description', help='the description of the release', required=False)
    parser.add_argument('-p', '--prerelease', help='this is a pre-release', action='store_true', default=False)
    parser.add_argument('-a', '--asset', help='the asset to upload', metavar='ASSET', required=False)
    args = parser.parse_args()

    tag = args.tag
    prerelease = args.prerelease
    asset = args.asset
    description = '' if args.description is None else args.description

    rc = 0

    if asset is not None:
        asset_file = os.path.realpath(asset)
        asset_name = os.path.basename(asset_file)
        asset_mime_type = mimetypes.guess_type(asset_file)

        if asset_mime_type is None or asset_mime_type[0] is None:
            asset_mime_type = 'application/octet-stream'
            print(str.format('could not detect mime-type: falling back to "{0}"', asset_mime_type))
        else:
            asset_mime_type = asset_mime_type[0]
            print(str.format('detected mime-type "{0}"', asset_mime_type))

    releases = utils.get_github_releases()

    release_id = None
    upload_url = None

    for release in releases:
        if release['tag_name'] == tag:
            release_id = release['id']
            upload_url = release['upload_url']
            break

    if release_id is None:
        '''
        release does not exist yet -> create it
        '''
        data = json.dumps({ "tag_name": tag, "name": tag, "body": description, "draft": False, "prerelease": prerelease })
        response = utils.github_api_request('releases', data=data, method='POST', content_type='application/json')
        release_id = response['id']
        upload_url = response['upload_url']
        print(str.format('created release "{0}"', tag))

    if asset is not None:
        '''
        asset file is specified (-a)
        first check wether the asset already exists
        '''
        gh_assets = utils.github_api_request(str.format('releases/{0}/assets', release_id), per_page=50)

        for gh_asset in gh_assets:
            if gh_asset['name'] == asset_name:
                '''
                asset already exists -> skip
                '''
                print(str.format('error: asset "{0}" already exists ...', asset_name))
                return 1

        upload_url = str(upload_url.split('{', 1)[0] + '?name=' + quote(asset_name))

        '''
        read the contents of the asset file
        '''
        with open(asset_file, 'rb') as asset_file:
            asset_data = asset_file.read()
            asset_length = len(asset_data)

        retry = 2
        rc = -1

        while retry > 0:
            try:
                '''
                upload the asset file
                '''
                print(str.format('uploading asset "{0}" with a length of {1} bytes ...', asset_name, str(asset_length)))
                utils.github_api_request(url=upload_url, data=asset_data, method='POST', content_type=asset_mime_type)
                rc = 0
                break
            except IOError as e:
                # _type, value, _traceback = sys.exc_info()
                # traceback.print_exception(_type, value, _traceback)
                print(str.format('Error uploading asset "{0}": {1}', asset_name, e))
                retry -= 1
            except URLError as e:
                print(str.format('Error uploading asset "{0}": {1}', asset_name, e))
                retry -= 1

    return rc
def main(argv=None):
    token = utils.get_github_api_accesstoken()
    org = 'SAP'
    repository = 'SapMachine'
    asset_pattern = re.compile(utils.sapmachine_asset_pattern())
    major_dict = {}
    release_dict = {}
    image_dict = {}
    latest_link_dict = {}

    releases = utils.get_github_releases()

    for release in releases:
        version, version_part, major, update, version_sap, build_number, os_ext = utils.sapmachine_tag_components(release['name'])

        is_prerelease = release['prerelease']

        if version is None or os_ext:
            continue

        if major in major_dict:
            if not is_prerelease and major_dict[major]:
                # this is not a pre-release but the release before this was a pre-release
                # remove all assets
                if major in release_dict:
                    release_dict[major].clear_assets()

                # remove entry in the image dictionary
                if major in image_dict:
                    del image_dict[major]
            else:
                if not major_dict[major]:
                    # the release before this was a release
                    # skip, we only keep the latest release version
                    continue

        major_dict[major] = is_prerelease
        assets = release['assets']

        if is_prerelease is not True and major not in latest_link_dict:
            latest_link_dict[major] = Template(latest_template).substitute(
                major=major,
                url = release['html_url']
            )

        has_dmg = False

        for asset in assets:
            match = asset_pattern.match(asset['name'])

            if match is not None:
                asset_image_type = match.group(1)
                asset_os = match.group(3)
                file_type = match.group(4)

                if asset_os == 'windows-x64' and file_type == '.msi':
                    asset_os = 'windows-x64-installer'

                if asset_os == 'osx-x64':
                    if file_type == '.dmg':
                        has_dmg = True
                    elif has_dmg:
                        continue

                tag = release['name']
                image_is_lts = utils.sapmachine_is_lts(major) and not release['prerelease']

                if major not in image_dict:
                    image_dict[major] = {
                        'label': str.format('SapMachine {0}', major),
                        'lts': image_is_lts,
                        'ea': release['prerelease']
                    }

                if major in release_dict:
                    releases_for_major = release_dict[major]
                else:
                    releases_for_major = Releases(major)
                    release_dict[major] = releases_for_major

                release_dict[major].add_asset(asset['browser_download_url'], asset_image_type, asset_os, tag)

    latest_lts_version = 0
    latest_non_lts_version = 0

    for major in image_dict:
        if image_dict[major]['lts'] and int(major) > latest_lts_version:
            latest_lts_version = int(major)
        if not image_dict[major]['lts'] and not image_dict[major]['ea'] and int(major) > latest_non_lts_version:
            latest_non_lts_version = int(major)

    json_root = {
        'majors':[],
        'imageTypes':[],
        'os':[],
        'assets':{}
    }

    for major in sorted(image_dict):
        add = False
        if image_dict[major]['lts']:
            if int(major) >= latest_lts_version:
                add = True
        else:
            if int(major) >= latest_non_lts_version and int(major) >= latest_lts_version:
                add = True

        if add:
            json_root['majors'].append({'id': major, 'label': image_dict[major]['label'], 'lts': image_dict[major]['lts'], 'ea': image_dict[major]['ea']})
        else:
            del image_dict[major]

    def get_os_key(os):
        return os_description[os]['ordinal']

    def get_image_type_key(image_type):
        return image_type_description[image_type]['ordinal']

    for os in sorted(os_description, key=get_os_key):
        json_root['os'].append({'key': os, 'value': os_description[os]['name'], 'ordinal': os_description[os]['ordinal']})

    for image_type in sorted(image_type_description, key=get_image_type_key):
        json_root['imageTypes'].append({'key': image_type, 'value': image_type_description[image_type]['name'], 'ordinal': image_type_description[image_type]['ordinal']})

    for major in release_dict:
        if major in image_dict:
            json_root['assets'].update(release_dict[major].transform())

    files = [
        {
            'location': join('assets', 'data', 'sapmachine_releases.json'),
            'data': json.dumps(json_root, indent=4),
            'commit_message': 'Updated release data.'
        }
    ]

    for major in latest_link_dict:
        files.append({
            'location': join('latest', major, 'index.md'),
            'data': latest_link_dict[major],
            'commit_message': str.format('Updated latest link for SapMachine {0}', major)
        })

    push_to_git(files)

    #with open('website_data.json', 'w') as website_data_json:
    #    website_data_json.write(json.dumps(json_root, indent=4))

    return 0
def main(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('-t',
                        '--tag',
                        help='the SapMachine git tag',
                        metavar='TAG')
    parser.add_argument(
        '-m',
        '--major',
        help='the SapMachine major version, overrules any value from tag(s)',
        metavar='MAJOR')
    parser.add_argument(
        '-b',
        '--build',
        help='the build number, overrules any value from tag(s)',
        metavar='BUILD_NR')
    parser.add_argument('-r',
                        '--release',
                        help='set if this is a release build',
                        action='store_true',
                        default=False)
    args = parser.parse_args()

    configure_opts = []

    # initialize major from args
    major = args.major
    if major is not None:
        major = int(major)

    # initialize build number from args
    build_number = args.build
    if args.build is not None:
        print(str.format("Set build number from parameter: {0}", build_number),
              file=sys.stderr)

    # parse tag, if given, and determine major
    tag = None
    if args.tag:
        tag = SapMachineTag.from_string(args.tag)
        if tag is None:
            print(str.format("Tag {0} not recognized as SapMachine tag",
                             args.tag),
                  file=sys.stderr)
        else:
            if (major is not None and tag.get_major() != major):
                print(str.format(
                    "Warning: Using major version {0}, given by parameter. Major version from tag would be {1}.",
                    major, tag.get_major()),
                      file=sys.stderr)
            else:
                major = tag.get_major()

            # determine build number from tag
            if build_number is None:
                build_number = tag.get_build_number()
                if build_number is not None:
                    print(str.format("Set build number from tag: {0}",
                                     build_number),
                          file=sys.stderr)
                else:
                    latest_non_ga_tag = tag.get_latest_non_ga_tag()
                    if latest_non_ga_tag is not None:
                        build_number = latest_non_ga_tag.get_build_number()
                        if build_number is not None:
                            print(str.format(
                                "Tag seems to be a ga tag, using build number from latest non-ga tag {0}: {1}",
                                latest_non_ga_tag.as_string(), build_number),
                                  file=sys.stderr)

    # if major could not be determined, use default
    if major is None:
        major = utils.sapmachine_default_major()

    # set build number
    if build_number is not None:
        configure_opts.append(VERSION_BUILD_ARG.format(build_number))

    # determine and set version date in non-release builds
    # in release builds we rely on DEFAULT_VERSION_DATE in version-numbers.conf
    if not args.release:
        release_date = None
        if tag is not None:
            releases = utils.get_github_releases()
            if releases is not None:
                for release in releases:
                    if release['tag_name'] == tag.as_string():
                        release_date = release['created_at'].split('T')[0]
                        print(str.format(
                            "Set date to release date of {0}: {1}",
                            tag.as_string(), release_date),
                              file=sys.stderr)
                        break
            if release_date is None:
                print(str.format(
                    "Tag {0} does not seem to exist or data could not be loaded from GitHub",
                    tag.as_string()),
                      file=sys.stderr)

        if release_date is None:
            release_date = date.today().strftime("%Y-%m-%d")
            print(str.format("Set date to today: {0}", release_date),
                  file=sys.stderr)

        configure_opts.append(VERSION_DATE_ARG.format(release_date))

    # set version pre
    version_pre = ''
    if not args.release:
        if tag is None:
            version_pre = 'snapshot'
        else:
            version_pre = 'ea'

    if utils.get_system(major) == 'linux' and utils.get_arch().startswith(
            'aarch64'):
        if not version_pre:
            version_pre = 'beta'
        else:
            version_pre += '-beta'

    configure_opts.append(VERSION_PRE_ARG.format(version_pre))

    # set version opt
    if tag is None:
        configure_opts.append(VERSION_OPT_ARG.format(release_date))
    else:
        if args.release and utils.sapmachine_is_lts(major):
            if major < 15:
                configure_opts.append(VERSION_OPT_ARG.format('LTS-sapmachine'))
            else:
                configure_opts.append(VERSION_OPT_ARG.format('LTS'))
        else:
            if major < 15:
                configure_opts.append(VERSION_OPT_ARG.format('sapmachine'))
            else:
                configure_opts.append(VERSION_OPT_ARG.format(''))

    # set version extra1 arg (= sap version)
    if tag is not None and tag.get_version_sap() is not None:
        configure_opts.append(VERSION_EXTRA1_ARG.format(tag.get_version_sap()))

    # set vendor version string
    if (tag is None or (major > 14) or (major == 14 and tag.get_update() > 1)
            or (major == 11 and tag.get_update() > 7)):
        configure_opts.append(VENDOR_VERSION_STRING_ARG)

    # set other vendor options
    configure_opts.append(VENDOR_NAME_ARG)
    configure_opts.append(VENDOR_URL_ARG)
    configure_opts.append(VENDOR_BUG_URL_ARG)
    configure_opts.append(VENDOR_VM_BUG_URL_ARG)

    # set getest option
    if 'GTEST_DIR' in os.environ:
        if major >= 15:
            configure_opts.append(GTEST_OPT.format(os.environ['GTEST_DIR']))

    print(' '.join(configure_opts))

    return 0