92 lines
3.0 KiB
Python
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')
|