import os.path import sys from functions import getCommitList from rawcommit import RawCommit from commit import Commit from scope import Scope from commitBody import CommitBody # Compute user input of repository path via console inputPath = input("Please enter the base path of the repository: ").strip() userDecision = input("Should the generated changelog be stored in another location (y/n)? ").lower().strip() if userDecision == "y": outputPath = input("Please enter the output path: ").strip() elif userDecision == "n": print("The changelog will be stored in the same location as the repository.") outputPath = inputPath else: print("invalid input") sys.exit(1) # create a list of separate commits in chronological order (new to old) commitHistory = getCommitList(inputPath) # Create a two-dimensional list by tags: [[tag, [commits]],[tag, [commits]],...] taggedHistory = [] for commit in commitHistory: if commit.tag.tagAsString: taggedHistory.append([commit.tag, commit]) else: if len(taggedHistory) == 0: taggedHistory.append([None, commit]) else: taggedHistory[-1].append(commit) # Construction of the changelog-file fileTemplate = ["# Changelog"] for tag in taggedHistory: ## If latest commit has no tag: if not tag[0]: fileTemplate.append("\n## Without version number") else: fileTemplate.append("\n## Version " + tag[0].tagAsString) ## Grouping by Type featType = ["Features"] fixType = ["Fixes"] otherType = ["Other"] nonconformCommits = [] for commit in tag[1:]: if commit.body.commitType == CommitBody.commitTypes[5]: # fix fixType.append(commit) elif commit.body.commitType == CommitBody.commitTypes[4]: # feat featType.append(commit) elif commit.body.commitType == "nonconform": nonconformCommits.append(commit) else: otherType.append(commit) ## Sub-Grouping by Scopes within Types commitlistByType = [featType, fixType, otherType] for commitsByType in commitlistByType: if len(commitsByType) == 1: continue commitlistByScope = {} noScope = [] for commit in commitsByType: if type(commit) == str: continue if commit.body.scope == None: noScope.append(commit) elif commit.body.scope in commitlistByScope: commitlistByScope[commit.body.scope].append(commit) else: commitlistByScope[commit.body.scope] = [commit] fileTemplate.append("\n### " + commitsByType[0]) while len(commitlistByScope) > 0: scope, commits = commitlistByScope.popitem() fileTemplate.append("- *" + str(scope) + "*") for commit in commits: if commitsByType[0] == "Other": fileTemplate.append(" - (" + commit.body.commitType + ") " + commit.body.subject + commit.appendShortHash()) else: fileTemplate.append(" - " + commit.body.subject + commit.appendShortHash()) if len(noScope) > 0: fileTemplate.append("- *no scope*") for commit in noScope: fileTemplate.append(" - " + commit.body.subject + commit.appendShortHash()) ## nonconform commits if len(nonconformCommits) > 0: fileTemplate.append("\n### Non-conform commits") for commit in nonconformCommits: fileTemplate.append("- " + commit.body.subject + commit.appendShortHash()) # write into changelog.md file with open(outputPath + "/changelog.md", "w") as file: for line in fileTemplate: file.write(line + "\n")