diff --git a/tools/readme-autogen/migrate_patches.py b/tools/readme-autogen/migrate_patches.py new file mode 100755 index 0000000..5d61198 --- /dev/null +++ b/tools/readme-autogen/migrate_patches.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import sys +import argparse +import json +import os.path +import posixpath +from string import Template +from itertools import groupby +from functools import partial +import urllib.request +import urllib.parse + +from constants import OSKind, Product, WinSeries, DATAFILE_PATH, \ + DRIVER_URL_TEMPLATE, DRIVER_DIR_PREFIX, BASE_PATH, REPO_BASE +from utils import find_driver, linux_driver_key, windows_driver_key + +def posixpath_components(path): + result = [] + while True: + head, tail = posixpath.split(path) + if head == path: + break + result.append(tail) + path = head + result.reverse() + if result and not result[-1]: + result.pop() + return result + +def validate_patch(patch64, patch32): + wc_base = os.path.abspath(os.path.join(BASE_PATH, "..", "..")) + base_parse = urllib.parse.urlsplit(REPO_BASE, scheme='http') + p64_parse = urllib.parse.urlsplit(patch64, scheme='http') + p32_parse = urllib.parse.urlsplit(patch32, scheme='http') + if not (p64_parse[0] == p32_parse[0] == base_parse[0]): + raise Exception("URL scheme doesn't match repo base URL scheme") + if not (p64_parse[1] == p32_parse[1] == base_parse[1]): + raise Exception("URL network location doesn't match repo base URL network location") + if posixpath.commonpath((base_parse[2], p64_parse[2], p32_parse[2])) != \ + posixpath.commonpath((base_parse[2],)): + raise Exception("URL is not subpath of repo base path") + p64_posix_relpath = posixpath.relpath(p64_parse[2], base_parse[2]) + p32_posix_relpath = posixpath.relpath(p32_parse[2], base_parse[2]) + p64_comp = posixpath_components(p64_posix_relpath) + p32_comp = posixpath_components(p32_posix_relpath) + p64_filepath = os.path.join(wc_base, *p64_comp) + p32_filepath = os.path.join(wc_base, *p32_comp) + if not os.path.exists(p64_filepath): + raise Exception("File %s not found!" % p64_filepath) + if not os.path.exists(p32_filepath): + raise Exception("File %s not found!" % p32_filepath) + if os.path.getsize(p64_filepath) == 0: + raise Exception("File %s empty!" % p64_filepath) + if os.path.exists(p32_filepath) == 0: + raise Exception("File %s empty!" % p32_filepath) + +def main(): + with open(DATAFILE_PATH) as data_file: + data = json.load(data_file) + + drivers = data[OSKind.Windows.value]['x86_64']['drivers'] + for d in drivers: + base, sep, tail = d['patch64_url'].rpartition('/') + assert sep + assert tail + d['patch64_url'] = base + '/' + 'nvencodeapi64.1337' + d['patch32_url'] = base + '/' + 'nvencodeapi.1337' + d['driver_url'] = d['driver_url'] + validate_patch(d['patch64_url'], d['patch32_url']) + with open(DATAFILE_PATH, 'w') as data_file: + json.dump(data, data_file, indent=4) + +if __name__ == '__main__': + main()