scripts/register_new_version.py (118 lines of code) (raw):
#!/usr/bin/env python3
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import json
import sys
import re
from datetime import datetime
def add_version_to_releases_json(new_version):
file_path = 'releases.json'
# Read the JSON file
with open(file_path, 'r') as file:
versions = json.load(file)
# Split the new version into major, minor, and patch
new_major, new_minor, _ = new_version.split('.')
# Find the position to insert the new version
insert_index = 0
for i, version in enumerate(versions):
major, minor, _ = version.split('.')
if major == new_major and minor == new_minor:
insert_index = i
break
# Insert the new version at the found position
updated_versions = versions[:insert_index] + [new_version] + versions[insert_index:]
# Write the updated JSON back to the file
with open(file_path, 'w') as file:
json.dump(updated_versions, file, indent=2)
print(f"Added version {new_version} to {file_path}")
def add_version_to_release_pulsar_js(new_version, author, published_at):
file_path = 'data/release-pulsar.js'
# Read the file content
with open(file_path, 'r') as file:
content = file.read()
# Extract the JSON array from the file content
match = re.search(r'module\.exports\s*=\s*(\[.*\])', content, re.DOTALL)
if not match:
print(f"Error: Could not find the JSON array in {file_path}")
sys.exit(1)
json_array_str = match.group(1)
releases = json.loads(json_array_str)
# Split the new version into major, minor, and patch
new_major, new_minor, _ = new_version.split('.')
major_minor_x = f"v{new_major}.{new_minor}.x"
# Create the new release entry
new_release = {
"author": author,
"tagName": f"v{new_version}",
"publishedAt": published_at,
"vtag": f"{new_major}.{new_minor}.x",
"releaseNotes": f"/release-notes/versioned/pulsar-{new_version}/",
"doc": f"/docs/{new_major}.{new_minor}.x",
"version": major_minor_x
}
# Find the position to insert the new version
insert_index = 0
for i, release in enumerate(releases):
major, minor, _ = release['tagName'][1:].split('.')
if major == new_major and minor == new_minor:
insert_index = i
break
# Insert the new release at the found position
releases.insert(insert_index, new_release)
# Update the version fields
for i, release in enumerate(releases):
if i == insert_index:
release['version'] = major_minor_x
elif release['version'] == major_minor_x:
release['version'] = ""
# Convert the updated releases back to a JSON string
updated_json_array_str = json.dumps(releases, indent=2)
# Replace the old JSON array in the file content with the updated one
updated_content = re.sub(r'module\.exports\s*=\s*\[.*\]', f'module.exports = {updated_json_array_str}', content, flags=re.DOTALL)
# Write the updated content back to the file
with open(file_path, 'w') as file:
file.write(updated_content)
print(f"Added version {new_version} to {file_path}")
def add_version_to_release_java_js(new_version):
file_path = 'data/release-java.js'
# Read the file content
with open(file_path, 'r') as file:
content = file.read()
# Extract the JSON array from the file content
match = re.search(r'module\.exports\s*=\s*(\[.*\])', content, re.DOTALL)
if not match:
print(f"Error: Could not find the JSON array in {file_path}")
sys.exit(1)
json_array_str = match.group(1)
releases = json.loads(json_array_str)
# Split the new version into major, minor, and patch
new_major, new_minor, _ = new_version.split('.')
major_minor_x = f"v{new_major}.{new_minor}.x"
# Create the new release entry
new_release = {
"tagName": f"v{new_version}",
"vtag": f"{new_major}.{new_minor}.x",
"releaseNotes": f"/release-notes/versioned/client-java-{new_version}/",
"doc": f"/docs/{new_major}.{new_minor}.x/client-libraries-java",
"version": major_minor_x
}
# Find the position to insert the new version
insert_index = 0
for i, release in enumerate(releases):
major, minor, _ = release['tagName'][1:].split('.')
if major == new_major and minor == new_minor:
insert_index = i
break
# Insert the new release at the found position
releases.insert(insert_index, new_release)
# Update the version fields
for i, release in enumerate(releases):
if i == insert_index:
release['version'] = major_minor_x
elif release['version'] == major_minor_x:
release['version'] = ""
# Convert the updated releases back to a JSON string
updated_json_array_str = json.dumps(releases, indent=2)
# Replace the old JSON array in the file content with the updated one
updated_content = re.sub(r'module\.exports\s*=\s*\[.*\]', f'module.exports = {updated_json_array_str}', content, flags=re.DOTALL)
# Write the updated content back to the file
with open(file_path, 'w') as file:
file.write(updated_content)
print(f"Added version {new_version} to {file_path}")
def create_pulsar_release_notes(new_version, prev_version):
# Create release notes content
content = f"""---
id: pulsar-{new_version}
title: Apache Pulsar {new_version}
sidebar_label: Apache Pulsar {new_version}
---
#### {datetime.now().strftime('%Y-%m-%d')}
### Library updates
### Broker
### Client
### Pulsar IO and Pulsar Functions
### Others
### Tests & CI
For the complete list, check the [full changelog](https://github.com/apache/pulsar/compare/v{prev_version}...v{new_version}).
"""
# Write file
file_path = f'release-notes/versioned/pulsar-{new_version}.md'
with open(file_path, 'w') as f:
f.write(content)
print(f"Created release notes file at {file_path}")
def create_client_java_release_notes(new_version):
# Create release notes content
content = f"""---
id: client-java-{new_version}
title: Client Java {new_version}
sidebar_label: Client Java {new_version}
---
"""
# Write file
file_path = f'release-notes/versioned/client-java-{new_version}.md'
with open(file_path, 'w') as f:
f.write(content)
print(f"Created client Java release notes file at {file_path}")
if __name__ == "__main__":
if len(sys.argv) != 5:
print("Usage: python register_new_version.py <new-version> <previous-version> <author> <published-at>")
sys.exit(1)
new_version = sys.argv[1]
previous_version = sys.argv[2]
author = sys.argv[3]
published_at = sys.argv[4]
add_version_to_releases_json(new_version)
add_version_to_release_pulsar_js(new_version, author, published_at)
add_version_to_release_java_js(new_version)
create_pulsar_release_notes(new_version, previous_version)
create_client_java_release_notes(new_version)