doc/check-seclevel.py
changeset 32544 e9f456183402
parent 30559 d83ca854fa21
child 40292 9c6473d2038b
equal deleted inserted replaced
32543:cf7c88986e9f 32544:e9f456183402
    21 )
    21 )
    22 
    22 
    23 table = commands.table
    23 table = commands.table
    24 helptable = help.helptable
    24 helptable = help.helptable
    25 
    25 
    26 level2mark = ['"', '=', '-', '.', '#']
    26 level2mark = [b'"', b'=', b'-', b'.', b'#']
    27 reservedmarks = ['"']
    27 reservedmarks = [b'"']
    28 
    28 
    29 mark2level = {}
    29 mark2level = {}
    30 for m, l in zip(level2mark, xrange(len(level2mark))):
    30 for m, l in zip(level2mark, range(len(level2mark))):
    31     if m not in reservedmarks:
    31     if m not in reservedmarks:
    32         mark2level[m] = l
    32         mark2level[m] = l
    33 
    33 
    34 initlevel_topic = 0
    34 initlevel_topic = 0
    35 initlevel_cmd = 1
    35 initlevel_cmd = 1
    36 initlevel_ext = 1
    36 initlevel_ext = 1
    37 initlevel_ext_cmd = 3
    37 initlevel_ext_cmd = 3
    38 
    38 
    39 def showavailables(ui, initlevel):
    39 def showavailables(ui, initlevel):
    40     ui.warn(('    available marks and order of them in this help: %s\n') %
    40     avail = ('    available marks and order of them in this help: %s\n') % (
    41             (', '.join(['%r' % (m * 4) for m in level2mark[initlevel + 1:]])))
    41         ', '.join(['%r' % (m * 4) for m in level2mark[initlevel + 1:]]))
       
    42     ui.warn(avail.encode('utf-8'))
    42 
    43 
    43 def checkseclevel(ui, doc, name, initlevel):
    44 def checkseclevel(ui, doc, name, initlevel):
    44     ui.note(('checking "%s"\n') % name)
    45     ui.note(('checking "%s"\n') % name)
       
    46     if not isinstance(doc, bytes):
       
    47         doc = doc.encode('utf-8')
    45     blocks, pruned = minirst.parse(doc, 0, ['verbose'])
    48     blocks, pruned = minirst.parse(doc, 0, ['verbose'])
    46     errorcnt = 0
    49     errorcnt = 0
    47     curlevel = initlevel
    50     curlevel = initlevel
    48     for block in blocks:
    51     for block in blocks:
    49         if block['type'] != 'section':
    52         if block[b'type'] != b'section':
    50             continue
    53             continue
    51         mark = block['underline']
    54         mark = block[b'underline']
    52         title = block['lines'][0]
    55         title = block[b'lines'][0]
    53         if (mark not in mark2level) or (mark2level[mark] <= initlevel):
    56         if (mark not in mark2level) or (mark2level[mark] <= initlevel):
    54             ui.warn(('invalid section mark %r for "%s" of %s\n') %
    57             ui.warn((('invalid section mark %r for "%s" of %s\n') %
    55                     (mark * 4, title, name))
    58                      (mark * 4, title, name)).encode('utf-8'))
    56             showavailables(ui, initlevel)
    59             showavailables(ui, initlevel)
    57             errorcnt += 1
    60             errorcnt += 1
    58             continue
    61             continue
    59         nextlevel = mark2level[mark]
    62         nextlevel = mark2level[mark]
    60         if curlevel < nextlevel and curlevel + 1 != nextlevel:
    63         if curlevel < nextlevel and curlevel + 1 != nextlevel:
    70     return errorcnt
    73     return errorcnt
    71 
    74 
    72 def checkcmdtable(ui, cmdtable, namefmt, initlevel):
    75 def checkcmdtable(ui, cmdtable, namefmt, initlevel):
    73     errorcnt = 0
    76     errorcnt = 0
    74     for k, entry in cmdtable.items():
    77     for k, entry in cmdtable.items():
    75         name = k.split("|")[0].lstrip("^")
    78         name = k.split(b"|")[0].lstrip(b"^")
    76         if not entry[0].__doc__:
    79         if not entry[0].__doc__:
    77             ui.note(('skip checking %s: no help document\n') %
    80             ui.note(('skip checking %s: no help document\n') %
    78                     (namefmt % name))
    81                     (namefmt % name))
    79             continue
    82             continue
    80         errorcnt += checkseclevel(ui, entry[0].__doc__,
    83         errorcnt += checkseclevel(ui, entry[0].__doc__,
    91                                   '%s help topic' % names[0],
    94                                   '%s help topic' % names[0],
    92                                   initlevel_topic)
    95                                   initlevel_topic)
    93 
    96 
    94     errorcnt += checkcmdtable(ui, table, '%s command', initlevel_cmd)
    97     errorcnt += checkcmdtable(ui, table, '%s command', initlevel_cmd)
    95 
    98 
    96     for name in sorted(extensions.enabled().keys() +
    99     for name in sorted(list(extensions.enabled()) +
    97                        extensions.disabled().keys()):
   100                        list(extensions.disabled())):
    98         mod = extensions.load(ui, name, None)
   101         mod = extensions.load(ui, name, None)
    99         if not mod.__doc__:
   102         if not mod.__doc__:
   100             ui.note(('skip checking %s extension: no help document\n') % name)
   103             ui.note(('skip checking %s extension: no help document\n') % name)
   101             continue
   104             continue
   102         errorcnt += checkseclevel(ui, mod.__doc__,
   105         errorcnt += checkseclevel(ui, mod.__doc__,
   104                                   initlevel_ext)
   107                                   initlevel_ext)
   105 
   108 
   106         cmdtable = getattr(mod, 'cmdtable', None)
   109         cmdtable = getattr(mod, 'cmdtable', None)
   107         if cmdtable:
   110         if cmdtable:
   108             errorcnt += checkcmdtable(ui, cmdtable,
   111             errorcnt += checkcmdtable(ui, cmdtable,
   109                                       '%s command of ' + name + ' extension',
   112                                       '%%s command of %s extension' % name,
   110                                       initlevel_ext_cmd)
   113                                       initlevel_ext_cmd)
   111     return errorcnt
   114     return errorcnt
   112 
   115 
   113 def checkfile(ui, filename, initlevel):
   116 def checkfile(ui, filename, initlevel):
   114     if filename == '-':
   117     if filename == '-':