Skip to content

Commit

Permalink
feat(rewrite-existing): add a rewrite all
Browse files Browse the repository at this point in the history
to rewrite all existing tags under a prefix
  • Loading branch information
Anis Campos committed Oct 21, 2022
1 parent bff456d commit ae21162
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 11 deletions.
6 changes: 3 additions & 3 deletions changelog_generator/tag_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,6 @@ def is_release_tag(self, tag: str) -> bool:
return res and res.group("prefix") == self.prefix and not res.group("rc")

def get_tags(self):
return self.repository.git.tag(f"--merged", "HEAD", f"{self.prefix}/*").split(
"\n"
)
return self.repository.git.tag(
"--merged", "origin/master", f"{self.prefix}/*"
).split("\n")
58 changes: 58 additions & 0 deletions rewrite_all.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from argparse import ArgumentParser
from collections import deque
from itertools import islice
from typing import Iterator, Tuple, TypeVar

from changelog_generator.repository_manager import RepositoryManager
from rewrite_existing import update_release_note

Item = TypeVar("Item")


def sliding_window_iter(it: Iterator[Item], size: int) -> Iterator[Tuple[Item, ...]]:
"""
Get a iterator of sliding sequences
Examples:
it=[1 2 3 4], size=2 -> [(1,2) (2,3) (3,4)]
"""
window = deque(islice(it, size), maxlen=size)
for item in it:
yield tuple(window)
window.append(item)
if window:
yield tuple(window)


def rewrite_all_release_notes_by_prefix():
parser = ArgumentParser()
parser.add_argument(
"repository_path",
help="The path to the repository",
)
parser.add_argument(
"prefix",
help="The prefix to filter the tags",
)
parser.add_argument(
"filter_paths",
nargs="*",
help="A space separated list of path to be used to the commits that edited files within "
"them",
)
args = parser.parse_args()

filter_paths = args.filter_paths
path = args.repository_path
prefix = args.prefix
all_tags_descending = RepositoryManager(
path, prefix=prefix, filter_paths=filter_paths
).tags

for chunk in sliding_window_iter(reversed(all_tags_descending), 2):
n, n1 = chunk
update_release_note(filter_paths, path, f"{n}..{n1}")


if __name__ == "__main__":
rewrite_all_release_notes_by_prefix()
49 changes: 41 additions & 8 deletions rewrite_existing.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,52 @@ def run():
"them",
)
args = parser.parse_args()
(tag_n, tag_n1) = args.target.split("..")
target = args.target
filter_paths = args.filter_paths
path = args.repository_path

update_release_note(filter_paths, path, target)


def update_release_note(filter_paths, path, target, create: bool = True):
tag_n, tag_n1 = target.split("..")
print("Will rewrite the release with the commits between ", tag_n, tag_n1)
changelog = generate(
args.repository_path, target=args.target, filter_paths=args.filter_paths
)
print(
changelog = generate(path, target=target, filter_paths=filter_paths)
changelog = changelog[:125000]
try:
# checking if the release exists
subprocess.check_output(
["gh", "release", "edit", tag_n1, "-F", "-"],
["gh", "release", "view", tag_n1],
input=changelog.encode(),
cwd=args.repository_path,
cwd=path,
)
except subprocess.CalledProcessError:
print(f"the tag {tag_n1} exists but has not been released yet")
if create:
print(
subprocess.check_output(
[
"gh",
"release",
"create",
tag_n1,
"--title",
f"Release {tag_n1}",
"-F",
"-",
],
input=changelog.encode(),
cwd=path,
)
)
else:
print(
subprocess.check_output(
["gh", "release", "edit", tag_n1, "-F", "-"],
input=changelog.encode(),
cwd=path,
)
)
)


if __name__ == "__main__":
Expand Down

0 comments on commit ae21162

Please sign in to comment.