##// END OF EJS Templates
obsutil: sort metadata before comparing in geteffectflag()...
obsutil: sort metadata before comparing in geteffectflag() This is probably less important now that we dropped Python 2. We do still support Python 3.6 though, and the dictionaries aren't ordered there either (that was a big change that came with 3.7). Still, maybe it's a good idea to sort metadata explicitly.

File last commit:

r50691:98e7be1e default
r52395:a5d8f261 stable
Show More
check-seclevel.py
242 lines | 6.2 KiB | text/x-python | PythonLexer
/ doc / check-seclevel.py
Gregory Szorc
global: use python3 in shebangs...
r46434 #!/usr/bin/env python3
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 #
timeless@mozdev.org
check-seclevel: fix file description grammar
r26192 # checkseclevel - checking section title levels in each online help document
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Pulkit Goyal
py3: make check-seclevel use absolute_import...
r28965
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 import optparse
Pulkit Goyal
py3: make check-seclevel use absolute_import...
r28965 import os
import sys
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
# import from the live mercurial repo
Gregory Szorc
check-seclevel: set module load policy to Python only...
r27221 os.environ['HGMODULEPOLICY'] = 'py'
av6
doc: use an absolute path in sys.path...
r50100 sys.path.insert(0, os.path.abspath(".."))
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial import demandimport
demandimport.enable()
Pulkit Goyal
py3: make check-seclevel use absolute_import...
r28965 from mercurial import (
commands,
extensions,
help,
minirst,
ui as uimod,
)
table = commands.table
helptable = help.helptable
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 level2mark = [b'"', b'=', b'-', b'.', b'#']
reservedmarks = [b'"']
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
mark2level = {}
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 for m, l in zip(level2mark, range(len(level2mark))):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 if m not in reservedmarks:
mark2level[m] = l
initlevel_topic = 0
initlevel_cmd = 1
initlevel_ext = 1
initlevel_ext_cmd = 3
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 def showavailables(ui, initlevel):
Augie Fackler
formatting: blacken the codebase...
r43346 avail = ' available marks and order of them in this help: %s\n' % (
', '.join(['%r' % (m * 4) for m in level2mark[initlevel + 1 :]])
)
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 ui.warn(avail.encode('utf-8'))
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 def checkseclevel(ui, doc, name, initlevel):
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 ui.notenoi18n(('checking "%s"\n' % name).encode('utf-8'))
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 if not isinstance(doc, bytes):
doc = doc.encode('utf-8')
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 blocks, pruned = minirst.parse(doc, 0, ['verbose'])
errorcnt = 0
curlevel = initlevel
for block in blocks:
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 if block[b'type'] != b'section':
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 continue
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 mark = block[b'underline']
title = block[b'lines'][0]
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 if (mark not in mark2level) or (mark2level[mark] <= initlevel):
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
(
'invalid section mark %r for "%s" of %s\n'
% (mark * 4, title, name)
).encode('utf-8')
)
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 showavailables(ui, initlevel)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 errorcnt += 1
continue
nextlevel = mark2level[mark]
if curlevel < nextlevel and curlevel + 1 != nextlevel:
formatting: run black on all file again...
r43364 ui.warnnoi18n(
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 ('gap of section level at "%s" of %s\n' % (title, name)).encode(
'utf-8'
)
formatting: run black on all file again...
r43364 )
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 showavailables(ui, initlevel)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 errorcnt += 1
continue
Augie Fackler
cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n...
r43350 ui.notenoi18n(
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 (
'appropriate section level for "%s %s"\n'
% (mark * (nextlevel * 2), title)
).encode('utf-8')
Augie Fackler
formatting: blacken the codebase...
r43346 )
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 curlevel = nextlevel
return errorcnt
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 def checkcmdtable(ui, cmdtable, namefmt, initlevel):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 errorcnt = 0
for k, entry in cmdtable.items():
Augie Fackler
doc: port check-seclevel.py to be Python 2/3 portable
r32544 name = k.split(b"|")[0].lstrip(b"^")
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 if not entry[0].__doc__:
formatting: run black on all file again...
r43364 ui.notenoi18n(
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 (
'skip checking %s: no help document\n' % (namefmt % name)
).encode('utf-8')
formatting: run black on all file again...
r43364 )
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 continue
Augie Fackler
formatting: blacken the codebase...
r43346 errorcnt += checkseclevel(
ui, entry[0].__doc__, namefmt % name, initlevel
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 return errorcnt
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 def checkhghelps(ui):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 errorcnt = 0
Rodrigo Damazio
help: splitting the topics by category...
r40328 for h in helptable:
names, sec, doc = h[0:3]
Augie Fackler
check-seclevel: restore use of callable() since it was readded in Python 3.2
r21792 if callable(doc):
Yuya Nishihara
help: pass around ui to doc loader (API)...
r26413 doc = doc(ui)
Augie Fackler
formatting: blacken the codebase...
r43346 errorcnt += checkseclevel(
ui, doc, '%s help topic' % names[0], initlevel_topic
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 errorcnt += checkcmdtable(ui, table, '%s command', initlevel_cmd)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
formatting: blacken the codebase...
r43346 for name in sorted(
list(extensions.enabled()) + list(extensions.disabled())
):
Bryan O'Sullivan
check-seclevel: pass a ui to the extension loader...
r27511 mod = extensions.load(ui, name, None)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 if not mod.__doc__:
formatting: run black on all file again...
r43364 ui.notenoi18n(
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 (
'skip checking %s extension: no help document\n' % name
).encode('utf-8')
formatting: run black on all file again...
r43364 )
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 continue
Augie Fackler
formatting: blacken the codebase...
r43346 errorcnt += checkseclevel(
ui, mod.__doc__, '%s extension' % name, initlevel_ext
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
cmdtable = getattr(mod, 'cmdtable', None)
if cmdtable:
Augie Fackler
formatting: blacken the codebase...
r43346 errorcnt += checkcmdtable(
ui,
cmdtable,
'%%s command of %s extension' % name,
initlevel_ext_cmd,
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 return errorcnt
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 def checkfile(ui, filename, initlevel):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 if filename == '-':
filename = 'stdin'
doc = sys.stdin.read()
else:
Bryan O'Sullivan
check-seclevel: use a context manager for file I/O
r27770 with open(filename) as fp:
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 doc = fp.read()
Augie Fackler
cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n...
r43350 ui.notenoi18n(
Matt Harbison
doc: don't pass str to ui methods in check-seclevel.py
r50691 (
'checking input from %s with initlevel %d\n' % (filename, initlevel)
).encode('utf-8')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 return checkseclevel(ui, doc, 'input from %s' % filename, initlevel)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: wrap entry point by function...
r26398 def main():
Augie Fackler
formatting: blacken the codebase...
r43346 optparser = optparse.OptionParser(
"""%prog [options]
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
This checks all help documents of Mercurial (topics, commands,
extensions and commands of them), if no file is specified by --file
option.
Augie Fackler
formatting: blacken the codebase...
r43346 """
)
optparser.add_option(
"-v", "--verbose", help="enable additional output", action="store_true"
)
optparser.add_option(
"-d", "--debug", help="debug mode", action="store_true"
)
optparser.add_option(
"-f",
"--file",
help="filename to read in (or '-' for stdin)",
action="store",
default="",
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
formatting: blacken the codebase...
r43346 optparser.add_option(
"-t",
"--topic",
help="parse file as help topic",
action="store_const",
dest="initlevel",
const=0,
)
optparser.add_option(
"-c",
"--command",
help="parse file as help of core command",
action="store_const",
dest="initlevel",
const=1,
)
optparser.add_option(
"-e",
"--extension",
help="parse file as help of extension",
action="store_const",
dest="initlevel",
const=1,
)
optparser.add_option(
"-C",
"--extension-command",
help="parse file as help of extension command",
action="store_const",
dest="initlevel",
const=3,
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
Augie Fackler
formatting: blacken the codebase...
r43346 optparser.add_option(
"-l",
"--initlevel",
help="set initial section level manually",
action="store",
type="int",
default=0,
)
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
(options, args) = optparser.parse_args()
Yuya Nishihara
ui: factor out ui.load() to create a ui without loading configs (API)...
r30559 ui = uimod.ui.load()
Pulkit Goyal
py3: add b'' prefixes in doc/check-seclevel.py...
r41391 ui.setconfig(b'ui', b'verbose', options.verbose, b'--verbose')
ui.setconfig(b'ui', b'debug', options.debug, b'--debug')
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648
if options.file:
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 if checkfile(ui, options.file, options.initlevel):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 sys.exit(1)
else:
Yuya Nishihara
check-seclevel: use ui to show status and error messages...
r26411 if checkhghelps(ui):
FUJIWARA Katsunori
doc: add the tool to check section marks in help documents...
r17648 sys.exit(1)
Yuya Nishihara
check-seclevel: wrap entry point by function...
r26398
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
check-seclevel: wrap entry point by function...
r26398 if __name__ == "__main__":
main()