diff --git a/semantic_release/history/logs.py b/semantic_release/history/logs.py index 110c3a51..ba63e031 100644 --- a/semantic_release/history/logs.py +++ b/semantic_release/history/logs.py @@ -98,14 +98,10 @@ def generate_changelog( # Additional sections will be added as new types are encountered changes: dict = {"breaking": []} - rev = None - if from_version: - rev = from_version - found_the_release = to_version is None to_version_commit = to_version and get_formatted_commit(to_version) from_version_commit = from_version and get_formatted_commit(from_version) - for _hash, commit_message in get_commit_log(rev): + for _hash, commit_message in get_commit_log(from_version, to_version): if not found_the_release: # Skip until we find the last commit in this release # (we are looping in the order of newest -> oldest) diff --git a/semantic_release/vcs_helpers.py b/semantic_release/vcs_helpers.py index 8063e732..8df9ae6d 100644 --- a/semantic_release/vcs_helpers.py +++ b/semantic_release/vcs_helpers.py @@ -50,18 +50,34 @@ def get_formatted_commit(version: str) -> str: return message -def get_commit_log(from_rev=None): +def get_commit_log(from_rev=None, to_rev=None): """Yield all commit messages from last to first.""" - rev = None if from_rev: from_rev = get_formatted_tag(from_rev) try: repo().commit(from_rev) - rev = f"...{from_rev}" except BadName: logger.debug( f"Reference {from_rev} does not exist, considering entire history" ) + from_rev = None + if to_rev: + to_rev = get_formatted_tag(to_rev) + try: + repo().commit(to_rev) + except BadName: + logger.debug( + f"Reference {to_rev} does not exist, considering entire history until HEAD" + ) + to_rev = None + + rev = None + if from_rev and to_rev: + rev = f"{to_rev}...{from_rev}" + elif from_rev: + rev = f"...{from_rev}" + elif to_rev: + rev = f"{to_rev}..." for commit in repo().iter_commits(rev): yield (commit.hexsha, commit.message.replace("\r\n", "\n"))