# HG changeset patch
# User Rishabh Madan <rishabhmada...@gmail.com>
# Date 1501903168 -19800
#      Sat Aug 05 08:49:28 2017 +0530
# Node ID cc695f1458baf2c39ffdec4a1256a93fd659d62d
# Parent  609606d217659e0a6c1cf6f907b6512be5340e57
contrib: add check for use of admonitions and its validity

While using releasenotes extension, we will be using admonitions in commit 
messages.
This check will look for an admonition within the message. If it exists, it will
verify if it is stated under default or custom admonition. The check fails if 
the
admonition is not present in any of them.

diff -r 609606d21765 -r cc695f1458ba contrib/check-commit
--- a/contrib/check-commit      Thu Jul 20 01:30:41 2017 -0700
+++ b/contrib/check-commit      Sat Aug 05 08:49:28 2017 +0530
@@ -21,9 +21,16 @@
 import re
 import sys
 
+from mercurial import (
+    config,
+    hg,
+    ui as uimod,
+)
+
 commitheader = r"^(?:# [^\n]*\n)*"
 afterheader = commitheader + r"(?!#)"
 beforepatch = afterheader + r"(?!\n(?!@@))"
+admonitioncheck = r"\.\. ([a-zA-Z0-9_]+)::"
 
 errors = [
     (beforepatch + r".*[(]bc[)]", "(BC) needs to be uppercase"),
@@ -59,6 +66,7 @@
     exitcode = 0
     printed = node is None
     hits = []
+    exitcode = checkadmonition(commit, node)
     signtag = (afterheader +
           r'Added (tag [^ ]+|signature) for changeset [a-f0-9]{12}')
     if re.search(signtag, commit):
@@ -95,13 +103,38 @@
 def readcommit(node):
     return os.popen("hg export %s" % node).read()
 
+def getcustomadmonitions(node):
+    repo = hg.repository(uimod.ui(), '.')
+    ctx = repo[node]
+    p = config.config()
+
+    def read(f, sections=None, remap=None):
+        if f in ctx:
+            data = ctx[f].data()
+            p.parse(f, data, sections, remap, read)
+
+    if '.hgreleasenotes' in ctx:
+        read('.hgreleasenotes')
+    return p['sections'].keys()
+
+def checkadmonition(commit, node=None):
+    admonitions = ["fix", "feature", "bc", "api", "perf"]
+    x = re.search(admonitioncheck, commit)
+    if x:
+        if node:
+            admonitions += getcustomadmonitions(node)
+        if x.group(1) in admonitions:
+            return 0
+        else:
+            print("admonition: %s is invalid" % x.group(1))
+            return 1
+
 if __name__ == "__main__":
     exitcode = 0
     node = os.environ.get("HG_NODE")
-
     if node:
         commit = readcommit(node)
-        exitcode = checkcommit(commit)
+        exitcode = checkcommit(commit, node)
     elif sys.argv[1:]:
         for node in sys.argv[1:]:
             exitcode |= checkcommit(readcommit(node), node)
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to