diff --git a/scripts/release.py b/scripts/release.py index 25884f1dece..b7d43a33d08 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -58,6 +58,7 @@ ReleaseParameters = namedtuple("ReleaseParameters", ["branch", "name", "tag", "dd_repo", "rn", "prerelease"]) DEFAULT_BRANCH = "main" DRY_RUN = os.getenv("DRY_RUN", "0") == "1" +CHANGELOG_FILENAME = "../CHANGELOG.md" def _ensure_current_checkout(): @@ -244,6 +245,44 @@ def get_ddtrace_repo(): return Github(gh_token).get_repo(full_name_or_id="DataDog/dd-trace-py") +def add_release_to_changelog(name: str, release_notes: str): + separator = "---" + with open(CHANGELOG_FILENAME, "r") as changelog_file: + contents = changelog_file.read() + existing_release_notes_lines = contents.split("\n") + insert_index = existing_release_notes_lines.index(separator) + new_notes = ["", separator, "", f"## {name}", ""] + release_notes.split("\n") + composite = ( + existing_release_notes_lines[: insert_index - 1] + new_notes + existing_release_notes_lines[insert_index:] + ) + with open(CHANGELOG_FILENAME, "w") as changelog_file: + changelog_file.write("\n".join(composite)) + + +def commit_and_push(dd_repo, branch_name: str, release_name: str): + subprocess.check_output(f"git checkout -b {branch_name}", shell=True, cwd=os.pardir) + subprocess.check_output("git add -A", shell=True, cwd=os.pardir) + print(f"Committing changes to {CHANGELOG_FILENAME} on branch {branch_name}") + pr_body = f"update changelog for version {release_name}" + subprocess.check_output(f"git commit -m '{pr_body} via release script'", shell=True, cwd=os.pardir) + subprocess.check_output(f"git push origin {branch_name}", shell=True, cwd=os.pardir) + dd_repo.create_pull(DEFAULT_BRANCH, branch_name, title=f"chore: {pr_body}", body=f"- [x] {pr_body}", draft=False) + + +def create_changelog_pull_request(dd_repo, name: str, release_notes: str): + subprocess.check_output(f"git checkout {DEFAULT_BRANCH}", shell=True, cwd=os.pardir) + add_release_to_changelog(name, release_notes) + if not DRY_RUN: + commit_and_push(dd_repo, f"release.script/changelog-update-{name}", name) + else: + diff = subprocess.check_output("git diff", shell=True, cwd=os.pardir) + subprocess.check_output("git stash", shell=True, cwd=os.pardir) + diff = "\n".join(line.decode() for line in diff.split(b"\n")) + print( + f"\nDRY RUN: The following diff would be committed:\n\n{diff}\n\nDRY RUN: These changes have been stashed." + ) + + def create_notebook(dd_repo, name, rn, base): dd_api_key = os.getenv("DD_API_KEY_STAGING") dd_app_key = os.getenv("DD_APP_KEY_STAGING") @@ -446,6 +485,8 @@ def _dry(fn: Callable, description: Optional[str] = None) -> Any: "No notebook will be created at this time." ) ) + else: + create_changelog_pull_request(dd_repo, name, rn) # switch back to original git branch subprocess.check_output(