1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
import os
import argparse
import subprocess
import tempfile
from pathlib import Path
# the threshold at which we consider something a regression (percentage)
regression_threshold_percentage = 0.20
parser = argparse.ArgumentParser(description='Generate TPC-DS reference results from Postgres.')
parser.add_argument(
'--old', dest='old_extension_dir', action='store', help='Path to the old extension dir', required=True
)
parser.add_argument(
'--new', dest='new_extension_dir', action='store', help='Path to the new extension dir', required=True
)
parser.add_argument(
'--expect',
dest='expected_extensions_raw',
action='store',
help='Comma separated list of expected extensions',
required=True,
)
args = parser.parse_args()
expected_extensions = args.expected_extensions_raw.split(',')
exit_code = 0
def parse_extensions(dir):
result = {}
for root, dirs, files in os.walk(dir):
for filename in files:
if filename.endswith(".duckdb_extension"):
result[Path(filename).stem] = os.path.join(root, filename)
# Check all expected extensions are there
for expected_extension in expected_extensions:
if expected_extension not in result.keys():
print(f"Did not find expected extension {expected_extension} in {dir}")
exit(1)
return result
old_extensions = parse_extensions(args.old_extension_dir)
new_extensions = parse_extensions(args.new_extension_dir)
matching_extensions = []
for extension in old_extensions.keys():
if extension in new_extensions:
matching_extensions.append(extension)
check_passed = True
error_message = ""
for extension in matching_extensions:
old_size = os.path.getsize(old_extensions[extension])
new_size = os.path.getsize(new_extensions[extension])
print(f" - checking '{extension}': old size={old_size}, new_size={new_size}")
if new_size / (old_size + 0.1) > (1.0 + regression_threshold_percentage):
check_passed = False
error_message += f" - Extension '{extension}' was bigger than expected {new_size}\n"
error_message += f" - old size: {old_size}\n"
error_message += f" - new size: {new_size}\n"
print()
if not check_passed:
print("Extension size regression check failed:\n")
print(error_message)
exit(1)
else:
print(f"All extensions passed the check!")
|