feat(gitlab_release): python module to check if a commit message has gitlab references in the footer
#4
This commit is contained in:
7
gitlab_release/python-module/commit_footer/__main__.py
Normal file
7
gitlab_release/python-module/commit_footer/__main__.py
Normal file
@ -0,0 +1,7 @@
|
||||
#-*- coding: utf-8 -*-
|
||||
|
||||
from commit_footer.cli import main
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
14
gitlab_release/python-module/commit_footer/cli.py
Normal file
14
gitlab_release/python-module/commit_footer/cli.py
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env python3
|
||||
#-*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
from commits import Commits
|
||||
|
||||
def main():
|
||||
|
||||
commits = Commits()
|
||||
|
||||
if commits.check():
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
123
gitlab_release/python-module/commit_footer/commits.py
Normal file
123
gitlab_release/python-module/commit_footer/commits.py
Normal file
@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env python3
|
||||
#-*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import git
|
||||
import re
|
||||
|
||||
class Commits:
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self._repository = git.Repo(os.getcwd())
|
||||
|
||||
self._failed = []
|
||||
merge_base = self._repository.merge_base('development', 'changelog-footer-toggle')
|
||||
self._merge_base = str(merge_base[0])
|
||||
|
||||
self.fetch_all()
|
||||
|
||||
|
||||
def fetch_all(self) -> bool: # get the commits and filter to only the current branch
|
||||
|
||||
commits = list(self._repository.iter_commits(self._repository.active_branch))
|
||||
|
||||
clean = True
|
||||
Branch_commits = []
|
||||
for remove in commits:
|
||||
|
||||
if str(remove).lower() == self._merge_base.lower():
|
||||
|
||||
clean = False
|
||||
|
||||
if clean:
|
||||
|
||||
Branch_commits.append(remove)
|
||||
|
||||
self._commits = Branch_commits
|
||||
|
||||
|
||||
def fetch(self, sha1:str) -> str: # fetch a single git message
|
||||
|
||||
for commit in self._commits:
|
||||
|
||||
if str(commit).lower() == sha1.lower():
|
||||
|
||||
return commit.message
|
||||
|
||||
return ''
|
||||
|
||||
|
||||
def footer(self, git_message:str) -> list: # Get the last line of the commit message if has more than 2 lines
|
||||
|
||||
if git_message.count("\n") > 2:
|
||||
|
||||
footer_line = git_message.split("\n")
|
||||
footer_line = footer_line[(len(footer_line)-1)]
|
||||
|
||||
footer = re.findall(r"([\!|\#][0-9]+)", str(git_message))
|
||||
|
||||
if len(footer) > 0:
|
||||
return footer
|
||||
else:
|
||||
return False
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def junit(self) -> bool:
|
||||
junit = False
|
||||
|
||||
junit_testsuites = '<testsuites id="Commits Messages Check" name="commit footer references" errors="{0}" tests="{1}" time="0">'.format(len(self._failed), len(self._commits))
|
||||
junit_testsuite = '<testsuite errors="{0}" name="commit footer references" tests="{1}">'.format(len(self._failed), len(self._commits))
|
||||
|
||||
junit_testcase = ''
|
||||
for commit in self._failed:
|
||||
for key in commit:
|
||||
junit_testcase += '''
|
||||
<testcase classname="{0}" file="https://gitlab.com/nofusscomputing/projects/gitlab-ci/-/blob/development/gitlab_release/README.md" line="0" name="commit footer references" time="0" timestamp="date">
|
||||
<failure message="No References in the commit footer" type="validation">{1}</failure>
|
||||
<system-out>
|
||||
<![CDATA[ {1} ]]>
|
||||
</system-out>
|
||||
<system-err>
|
||||
<![CDATA[ {1} ]]>
|
||||
</system-err>
|
||||
</testcase>'''.format(key, str(commit[key]))
|
||||
|
||||
|
||||
if junit_testcase == '':
|
||||
junit_testcase = '<testcase classname="nil" file="https://gitlab.com/nofusscomputing/projects/gitlab-ci/-/blob/development/gitlab_release/README.md" name="commit footer references"/>'
|
||||
|
||||
junit_close = '</testsuite></testsuites>'
|
||||
print(str(junit_testsuites))
|
||||
print(str(junit_testsuite))
|
||||
print(str(junit_testcase))
|
||||
print(str(junit_close))
|
||||
|
||||
|
||||
def check(self) -> bool:
|
||||
check = True
|
||||
|
||||
start_check = False
|
||||
|
||||
for commit in self._commits:
|
||||
|
||||
if commit.message.count('\n') < 3:
|
||||
continue
|
||||
footer = self.footer(commit.message)
|
||||
|
||||
if footer is False:
|
||||
failed = {str(commit): str(commit.message)}
|
||||
self._failed.append(failed)
|
||||
continue
|
||||
|
||||
self.junit()
|
||||
|
||||
if len(self._failed) > 0:
|
||||
check = False
|
||||
|
||||
return check
|
||||
|
||||
|
14
gitlab_release/python-module/commit_footer/setup.py
Normal file
14
gitlab_release/python-module/commit_footer/setup.py
Normal file
@ -0,0 +1,14 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='NFC commit footer validation',
|
||||
version='0.1.0',
|
||||
py_modules=['main'],
|
||||
license='MIT',
|
||||
long_description='this is a long description',
|
||||
install_requires=['gitpython'],
|
||||
entry_points = {
|
||||
'console_scripts': ['commit_footer=cli:main'],
|
||||
},
|
||||
)
|
||||
|
Reference in New Issue
Block a user