Files
email-tracker/external/duckdb/tools/juliapkg/release.py
2025-10-24 19:21:19 -05:00

92 lines
3.0 KiB
Python

import subprocess
import os
import argparse
import re
parser = argparse.ArgumentParser(description='Publish a Julia release.')
parser.add_argument(
'--yggdrassil-fork',
dest='yggdrassil',
action='store',
help='Fork of the Julia Yggdrassil repository (https://github.com/JuliaPackaging/Yggdrasil)',
default='/Users/myth/Programs/Yggdrasil',
)
args = parser.parse_args()
if not os.path.isfile(os.path.join('tools', 'juliapkg', 'release.py')):
print('This script must be run from the root DuckDB directory (i.e. `python3 tools/juliapkg/release.py`)')
exit(1)
def run_syscall(syscall, ignore_failure=False):
res = os.system(syscall)
if ignore_failure:
return
if res != 0:
print(f'Failed to execute {syscall}: got exit code {str(res)}')
exit(1)
# helper script to generate a julia release
duckdb_path = os.getcwd()
# fetch the latest tags
os.system('git fetch upstream --tags')
proc = subprocess.Popen(['git', 'show-ref', '--tags'], stdout=subprocess.PIPE)
tags = [x for x in proc.stdout.read().decode('utf8').split('\n') if len(x) > 0 and 'master-builds' not in x]
def extract_tag(x):
keys = x.split('refs/tags/')[1].lstrip('v').split('.')
return int(keys[0]) * 10000000 + int(keys[1]) * 10000 + int(keys[2])
tags.sort(key=extract_tag)
# latest tag
splits = tags[-1].split(' ')
hash = splits[0]
tag = splits[1].replace('refs/tags/', '')
if tag[0] != 'v':
print(f"Tag {tag} does not start with a v?")
exit(1)
print(f'Creating a Julia release from the latest tag {tag} with commit hash {hash}')
print('> Creating a PR to the Yggdrassil repository (https://github.com/JuliaPackaging/Yggdrasil)')
os.chdir(args.yggdrassil)
run_syscall('git checkout master')
run_syscall('git pull upstream master')
run_syscall(f'git branch -D {tag}', True)
run_syscall(f'git checkout -b {tag}')
tarball_build = os.path.join('D', 'DuckDB', 'build_tarballs.jl')
with open(tarball_build, 'r') as f:
text = f.read()
text = re.sub('\nversion = v["][0-9.]+["]\n', f'\nversion = v"{tag[1:]}"\n', text)
text = re.sub(
'GitSource[(]["]https[:][/][/]github[.]com[/]duckdb[/]duckdb[.]git["][,] ["][a-zA-Z0-9]+["][)]',
f'GitSource("https://github.com/duckdb/duckdb.git", "{hash}")',
text,
)
with open(tarball_build, 'w+') as f:
f.write(text)
run_syscall(f'git add {tarball_build}')
run_syscall(f'git commit -m "[DuckDB] Bump to {tag}"')
run_syscall(f'git push --set-upstream origin {tag}')
run_syscall(
f'gh pr create --title "[DuckDB] Bump to {tag}" --repo "https://github.com/JuliaPackaging/Yggdrasil" --body ""'
)
print('PR has been created.\n')
print(f'Next up we need to bump the version and DuckDB_jll version to {tag} in `tools/juliapkg/Project.toml`')
print('This is not yet automated.')
print(
'> After that PR is merged - we need to post a comment containing the text `@JuliaRegistrator register subdir=tools/juliapkg`'
)
print('> For example, see https://github.com/duckdb/duckdb/commit/0f0461113f3341135471805c9928c4d71d1f5874')