##// END OF EJS Templates
releasenotes: add check flag for use of admonitions and its validity...
Rishabh Madan -
r33883:6a49c74b default
parent child Browse files
Show More
@@ -13,6 +13,7 b' process simpler by automating it.'
13 13
14 14 from __future__ import absolute_import
15 15
16 import difflib
16 17 import errno
17 18 import re
18 19 import sys
@@ -242,6 +243,38 b' def getcustomadmonitions(repo):'
242 243 read('.hgreleasenotes')
243 244 return p['sections']
244 245
246 def checkadmonitions(ui, repo, directives, revs):
247 """
248 Checks the commit messages for admonitions and their validity.
249
250 .. abcd::
251
252 First paragraph under this admonition
253
254 For this commit message, using `hg releasenotes -r . --check`
255 returns: Invalid admonition 'abcd' present in changeset 3ea92981e103
256
257 As admonition 'abcd' is neither present in default nor custom admonitions
258 """
259 for rev in revs:
260 ctx = repo[rev]
261 admonition = re.search(RE_DIRECTIVE, ctx.description())
262 if admonition:
263 if admonition.group(1) in directives:
264 continue
265 else:
266 ui.write(_("Invalid admonition '%s' present in changeset %s"
267 "\n") % (admonition.group(1), ctx.hex()[:12]))
268 sim = lambda x: difflib.SequenceMatcher(None,
269 admonition.group(1), x).ratio()
270
271 similar = [s for s in directives if sim(s) > 0.6]
272 if len(similar) == 1:
273 ui.write(_("(did you mean %s?)\n") % similar[0])
274 elif similar:
275 ss = ", ".join(sorted(similar))
276 ui.write(_("(did you mean one of %s?)\n") % ss)
277
245 278 def parsenotesfromrevisions(repo, directives, revs):
246 279 notes = parsedreleasenotes()
247 280
@@ -432,9 +465,11 b' def serializenotes(sections, notes):'
432 465 return '\n'.join(lines)
433 466
434 467 @command('releasenotes',
435 [('r', 'rev', '', _('revisions to process for release notes'), _('REV'))],
436 _('[-r REV] FILE'))
437 def releasenotes(ui, repo, file_, rev=None):
468 [('r', 'rev', '', _('revisions to process for release notes'), _('REV')),
469 ('c', 'check', False, _('checks for validity of admonitions (if any)'),
470 _('REV'))],
471 _('hg releasenotes [-r REV] [-c] FILE'))
472 def releasenotes(ui, repo, file_=None, **opts):
438 473 """parse release notes from commit messages into an output file
439 474
440 475 Given an output file and set of revisions, this command will parse commit
@@ -511,8 +546,12 b' def releasenotes(ui, repo, file_, rev=No'
511 546 release note after it has been added to the release notes file.
512 547 """
513 548 sections = releasenotessections(ui, repo)
549 rev = opts.get('rev')
514 550
515 551 revs = scmutil.revrange(repo, [rev or 'not public()'])
552 if opts.get('check'):
553 return checkadmonitions(ui, repo, sections.names(), revs)
554
516 555 incoming = parsenotesfromrevisions(repo, sections.names(), revs)
517 556
518 557 try:
@@ -378,3 +378,32 b' Overriding default sections (For eg. by '
378 378
379 379 * Adds a new feature.
380 380
381 $ cd ..
382
383 Testing output for the --check (-c) flag
384
385 $ hg init check-flag
386 $ cd check-flag
387
388 $ touch a
389 $ hg -q commit -A -l - << EOF
390 > .. asf::
391 >
392 > First paragraph under this admonition.
393 > EOF
394
395 Suggest similar admonition in place of the invalid one.
396
397 $ hg releasenotes -r . -c
398 Invalid admonition 'asf' present in changeset 4026fe9e1c20
399
400 $ touch b
401 $ hg -q commit -A -l - << EOF
402 > .. fixes::
403 >
404 > First paragraph under this admonition.
405 > EOF
406
407 $ hg releasenotes -r . -c
408 Invalid admonition 'fixes' present in changeset 0e7130d2705c
409 (did you mean fix?)
General Comments 0
You need to be logged in to leave comments. Login now