| | |
| | | import os.path |
| | | import sys |
| | | |
| | | ## To Do |
| | | # - Breaking Changes |
| | | # - Merge Commits |
| | | # - Error Handling |
| | | # - Deal with wrong user input (spelling, no repo) |
| | | |
| | | def getSeparatedGitLog(repo): |
| | | try: |
| | |
| | | def setScope(self): |
| | | try: |
| | | start = self.completeMessage.index("(")+1 |
| | | end = self.completeMessage.index(")") |
| | | end = self.completeMessage.index("):") |
| | | except: |
| | | self.scope = None |
| | | else: |
| | |
| | | |
| | | #### Main #### |
| | | |
| | | pathToRepo = "/Users/daniel/Developer/Repos/HfM/schumacher/Prisma-Binauralize" |
| | | #pathToRepo = "/Users/daniel/Desktop/testrepo" |
| | | inputPath = input("Please enter the base path of the repository: ") |
| | | userDecision = input("Should the generated changelog be stored in another location (y/n)? ").lower() |
| | | if userDecision == "y": |
| | | outputPath = (input("Please enter the output path: ")) |
| | | 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) |
| | | |
| | | commitList = getSeparatedGitLog(pathToRepo) |
| | | commitList = getSeparatedGitLog(inputPath) |
| | | |
| | | # Create a list of commits |
| | | commitHistory = [] |
| | |
| | | |
| | | |
| | | # Grouping by Type |
| | | commitsByType = {"Other":[], "Fixes":[], "Features":[]} |
| | | featType = ["Features"] |
| | | fixType = ["Fixes"] |
| | | otherType = ["Other"] |
| | | nonconformCommits = [] |
| | | |
| | | for commit in tag[1:]: |
| | | if commit.body.commitType == CommitBody.commitTypes[5]: # fix |
| | | commitsByType["Fixes"].append(commit) |
| | | fixType.append(commit) |
| | | elif commit.body.commitType == CommitBody.commitTypes[4]: # feat |
| | | commitsByType["Features"].append(commit) |
| | | featType.append(commit) |
| | | elif commit.body.commitType == "nonconform": |
| | | nonconformCommits.append(commit) |
| | | else: |
| | | commitsByType["Other"].append(commit) |
| | | otherType.append(commit) |
| | | |
| | | # Sub-Grouping by Scopes within Types |
| | | while len(commitsByType) > 0: |
| | | commitsByScope = {} |
| | | commitType, commits = commitsByType.popitem() |
| | | noScope = [] |
| | | if len(commits) == 0: |
| | | commitlistByType = [featType, fixType, otherType] |
| | | for commitsByType in commitlistByType: |
| | | if len(commitsByType) == 1: |
| | | continue |
| | | |
| | | for commit in commits: |
| | | commitlistByScope = {} |
| | | noScope = [] |
| | | for commit in commitsByType: |
| | | if type(commit) == str: |
| | | continue |
| | | if commit.body.scope == None: |
| | | noScope.append(commit) |
| | | elif commit.body.scope in commitsByScope: |
| | | commitsByScope[commit.body.scope].append(commit) |
| | | elif commit.body.scope in commitlistByScope: |
| | | commitlistByScope[commit.body.scope].append(commit) |
| | | else: |
| | | commitsByScope[commit.body.scope] = [commit] |
| | | commitlistByScope[commit.body.scope] = [commit] |
| | | |
| | | fileTemplate.append("\n### " + str(commitType)) |
| | | while len(commitsByScope) > 0: |
| | | scope, commits = commitsByScope.popitem() |
| | | fileTemplate.append("\n### " + commitsByType[0]) |
| | | while len(commitlistByScope) > 0: |
| | | scope, commits = commitlistByScope.popitem() |
| | | fileTemplate.append("- *" + str(scope) + "*") |
| | | for commit in commits: |
| | | if commitType == "Other": |
| | | if commitsByType[0] == "Other": |
| | | fileTemplate.append(" - (" + commit.body.commitType + ") " + commit.body.subject + commit.appendShortHash()) |
| | | else: |
| | | fileTemplate.append(" - " + commit.body.subject + commit.appendShortHash()) |
| | |
| | | |
| | | |
| | | # write into changelog |
| | | with open(pathToRepo + "/changelog.md", "w") as file: |
| | | with open(outputPath + "/changelog.md", "w") as file: |
| | | for line in fileTemplate: |
| | | file.write(line + "\n") |