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")
|