diff --git a/hgext/releasenotes.py b/hgext/releasenotes.py --- a/hgext/releasenotes.py +++ b/hgext/releasenotes.py @@ -242,6 +242,29 @@ read('.hgreleasenotes') return p['sections'] +def checkadmonitions(ui, repo, directives, revs): + """ + Checks the commit messages for admonitions and their validity. + + .. abcd:: + + First paragraph under this admonition + + For this commit message, using `hg releasenotes -r . --check` + returns: Invalid admonition 'abcd' present in changeset 3ea92981e103 + + As admonition 'abcd' is neither present in default nor custom admonitions + """ + for rev in revs: + ctx = repo[rev] + admonition = re.search(RE_DIRECTIVE, ctx.description()) + if admonition: + if admonition.group(1) in directives: + continue + else: + ui.write(_("Invalid admonition \'%s\' present in changeset %s\ +\n") % (admonition.group(1), ctx.hex()[:12])) + def parsenotesfromrevisions(repo, directives, revs): notes = parsedreleasenotes() @@ -432,9 +455,11 @@ return '\n'.join(lines) @command('releasenotes', - [('r', 'rev', '', _('revisions to process for release notes'), _('REV'))], - _('[-r REV] FILE')) -def releasenotes(ui, repo, file_, rev=None): + [('r', 'rev', '', _('revisions to process for release notes'), _('REV')), + ('c', 'check', False, _('checks for validity of admonitions (if any)'), + _('REV'))], + _('hg releasenotes [-r REV] [-c] FILE')) +def releasenotes(ui, repo, file_=None, **opts): """parse release notes from commit messages into an output file Given an output file and set of revisions, this command will parse commit @@ -511,23 +536,28 @@ release note after it has been added to the release notes file. """ sections = releasenotessections(ui, repo) + rev = opts.get('rev') revs = scmutil.revrange(repo, [rev or 'not public()']) - incoming = parsenotesfromrevisions(repo, sections.names(), revs) + if opts.get('check'): + checkadmonitions(ui, repo, sections.names(), revs) + + if not opts.get('check'): + incoming = parsenotesfromrevisions(repo, sections.names(), revs) - try: - with open(file_, 'rb') as fh: - notes = parsereleasenotesfile(sections, fh.read()) - except IOError as e: - if e.errno != errno.ENOENT: - raise + try: + with open(file_, 'rb') as fh: + notes = parsereleasenotesfile(sections, fh.read()) + except IOError as e: + if e.errno != errno.ENOENT: + raise - notes = parsedreleasenotes() + notes = parsedreleasenotes() - notes.merge(ui, incoming) + notes.merge(ui, incoming) - with open(file_, 'wb') as fh: - fh.write(serializenotes(sections, notes)) + with open(file_, 'wb') as fh: + fh.write(serializenotes(sections, notes)) @command('debugparsereleasenotes', norepo=True) def debugparsereleasenotes(ui, path, repo=None):