diff hgext/releasenotes.py @ 33571:9a944e908ecf

releasenotes: add custom admonitions support for release notes By default, the extension has default sections like fix, feature, perf etc.. This patch allow user to add support for custom admonition. In order to add a custom admonition, one needs to have a .hgreleasenotes file inside the repository. All the custom directive with name specified under the tag [sections] will be usable by the extension. One important thing to keep in mind is if there exists any custom admonitions with same key as default then they will override the default ones.
author Rishabh Madan <rishabhmadan96@gmail.com>
date Tue, 18 Jul 2017 23:04:08 +0530
parents 5814db57941c
children 3748098d072a
line wrap: on
line diff
--- a/hgext/releasenotes.py	Tue Jul 18 06:27:36 2017 -0700
+++ b/hgext/releasenotes.py	Tue Jul 18 23:04:08 2017 +0530
@@ -20,10 +20,12 @@
 
 from mercurial.i18n import _
 from mercurial import (
+    config,
     error,
     minirst,
     registrar,
     scmutil,
+    util,
 )
 
 cmdtable = {}
@@ -111,9 +113,15 @@
                 self.addnontitleditem(section, paragraphs)
 
 class releasenotessections(object):
-    def __init__(self, ui):
-        # TODO support defining custom sections from config.
-        self._sections = list(DEFAULT_SECTIONS)
+    def __init__(self, ui, repo=None):
+        if repo:
+            sections = util.sortdict(DEFAULT_SECTIONS)
+            custom_sections = getcustomadmonitions(repo)
+            if custom_sections:
+                sections.update(custom_sections)
+            self._sections = list(sections.iteritems())
+        else:
+            self._sections = list(DEFAULT_SECTIONS)
 
     def __iter__(self):
         return iter(self._sections)
@@ -128,6 +136,22 @@
 
         return None
 
+def getcustomadmonitions(repo):
+    ctx = repo['.']
+    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)
+        else:
+            raise error.Abort(_(".hgreleasenotes file \'%s\' not found") %
+                              repo.pathto(f))
+
+    if '.hgreleasenotes' in ctx:
+        read('.hgreleasenotes')
+    return p['sections']
+
 def parsenotesfromrevisions(repo, directives, revs):
     notes = parsedreleasenotes()
 
@@ -396,7 +420,7 @@
     that file. A particular use case for this is to tweak the wording of a
     release note after it has been added to the release notes file.
     """
-    sections = releasenotessections(ui)
+    sections = releasenotessections(ui, repo)
 
     revs = scmutil.revrange(repo, [rev or 'not public()'])
     incoming = parsenotesfromrevisions(repo, sections.names(), revs)
@@ -416,7 +440,7 @@
         fh.write(serializenotes(sections, notes))
 
 @command('debugparsereleasenotes', norepo=True)
-def debugparsereleasenotes(ui, path):
+def debugparsereleasenotes(ui, path, repo=None):
     """parse release notes and print resulting data structure"""
     if path == '-':
         text = sys.stdin.read()
@@ -424,7 +448,7 @@
         with open(path, 'rb') as fh:
             text = fh.read()
 
-    sections = releasenotessections(ui)
+    sections = releasenotessections(ui, repo)
 
     notes = parsereleasenotesfile(sections, text)