hgext/releasenotes.py
changeset 33571 9a944e908ecf
parent 33012 5814db57941c
child 33698 3748098d072a
--- 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)