Print this page
manpage lint.
   1 #!/usr/bin/python2.6
   2 #
   3 #  This program is free software; you can redistribute it and/or modify
   4 #  it under the terms of the GNU General Public License version 2
   5 #  as published by the Free Software Foundation.
   6 #
   7 #  This program is distributed in the hope that it will be useful,
   8 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 #  GNU General Public License for more details.
  11 #
  12 #  You should have received a copy of the GNU General Public License
  13 #  along with this program; if not, write to the Free Software
  14 #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15 #
  16 
  17 #
  18 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  19 # Copyright 2008, 2012 Richard Lowe

  20 #
  21 
  22 import getopt
  23 import os
  24 import re
  25 import subprocess
  26 import sys
  27 import tempfile
  28 
  29 from cStringIO import StringIO
  30 
  31 # This is necessary because, in a fit of pique, we used hg-format ignore lists
  32 # for NOT files.
  33 from mercurial import ignore
  34 
  35 #
  36 # Adjust the load path based on our location and the version of python into
  37 # which it is being loaded.  This assumes the normal onbld directory
  38 # structure, where we are in bin/ and the modules are in
  39 # lib/python(version)?/onbld/Scm/.  If that changes so too must this.
  40 #
  41 sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "lib",
  42                                 "python%d.%d" % sys.version_info[:2]))
  43 
  44 #
  45 # Add the relative path to usr/src/tools to the load path, such that when run
  46 # from the source tree we use the modules also within the source tree.
  47 #
  48 sys.path.insert(2, os.path.join(os.path.dirname(__file__), ".."))
  49 
  50 from onbld.Checks import Comments, Copyright, CStyle, HdrChk
  51 from onbld.Checks import JStyle, Keywords, Mapfile
  52 
  53 
  54 class GitError(Exception):
  55     pass
  56 
  57 def git(command):
  58     """Run a command and return a stream containing its stdout (and write its
  59     stderr to its stdout)"""
  60 
  61     if type(command) != list:
  62         command = command.split()
  63 
  64     command = ["git"] + command
  65 
  66     try:
  67         tmpfile = tempfile.TemporaryFile(prefix="git-nits")
  68     except EnvironmentError, e:
  69         raise GitError("Could not create temporary file: %s\n" % e)
  70 
  71     try:


 265     output.write("C style:\n")
 266     for f in flist(lambda x: x.endswith('.c') or x.endswith('.h')):
 267         fh = open(f, 'r')
 268         ret |= CStyle.cstyle(fh, output=output, picky=True,
 269                              check_posix_types=True,
 270                              check_continuation=True)
 271         fh.close()
 272     return ret
 273 
 274 
 275 def jstyle(root, parent, flist, output):
 276     ret = 0
 277     output.write("Java style:\n")
 278     for f in flist(lambda x: x.endswith('.java')):
 279         fh = open(f, 'r')
 280         ret |= JStyle.jstyle(fh, output=output, picky=True)
 281         fh.close()
 282     return ret
 283 
 284 










 285 def keywords(root, parent, flist, output):
 286     ret = 0
 287     output.write("SCCS Keywords:\n")
 288     for f in flist():
 289         fh = open(f, 'r')
 290         ret |= Keywords.keywords(fh, output=output)
 291         fh.close()
 292     return ret
 293 
 294 
 295 def run_checks(root, parent, cmds, paths='', opts={}):
 296     """Run the checks given in 'cmds', expected to have well-known signatures,
 297     and report results for any which fail.
 298 
 299     Return failure if any of them did.
 300 
 301     NB: the function name of the commands passed in is used to name the NOT
 302     file which excepts files from them."""
 303 
 304     ret = 0


 306     for cmd in cmds:
 307         s = StringIO()
 308 
 309         exclude = not_check(root, cmd.func_name)
 310         result = cmd(root, parent, gen_files(root, parent, paths, exclude),
 311                      output=s)
 312         ret |= result
 313 
 314         if result != 0:
 315             print s.getvalue()
 316 
 317     return ret
 318 
 319 
 320 def nits(root, parent, paths):
 321     cmds = [copyright,
 322             cstyle,
 323             hdrchk,
 324             jstyle,
 325             keywords,

 326             mapfilechk]
 327     run_checks(root, parent, cmds, paths)
 328 
 329 
 330 def pbchk(root, parent, paths):
 331     cmds = [comchk,
 332             copyright,
 333             cstyle,
 334             hdrchk,
 335             jstyle,
 336             keywords,

 337             mapfilechk]
 338     run_checks(root, parent, cmds)
 339 
 340 
 341 def main(cmd, args):
 342     parent_branch = None
 343 
 344     try:
 345         opts, args = getopt.getopt(args, 'b:')
 346     except getopt.GetoptError, e:
 347         sys.stderr.write(str(e) + '\n')
 348         sys.stderr.write("Usage: %s [-b branch] [path...]\n" % cmd)
 349         sys.exit(1)
 350 
 351     for opt, arg in opts:
 352         if opt == '-b':
 353             parent_branch = arg
 354 
 355     if not parent_branch:
 356         parent_branch = git_parent_branch(git_branch())
   1 #!/usr/bin/python2.6
   2 #
   3 #  This program is free software; you can redistribute it and/or modify
   4 #  it under the terms of the GNU General Public License version 2
   5 #  as published by the Free Software Foundation.
   6 #
   7 #  This program is distributed in the hope that it will be useful,
   8 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 #  GNU General Public License for more details.
  11 #
  12 #  You should have received a copy of the GNU General Public License
  13 #  along with this program; if not, write to the Free Software
  14 #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15 #
  16 
  17 #
  18 # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  19 # Copyright 2008, 2012 Richard Lowe
  20 # Copyright 2014 Garrett D'Amore <garrett@damore.org>
  21 #
  22 
  23 import getopt
  24 import os
  25 import re
  26 import subprocess
  27 import sys
  28 import tempfile
  29 
  30 from cStringIO import StringIO
  31 
  32 # This is necessary because, in a fit of pique, we used hg-format ignore lists
  33 # for NOT files.
  34 from mercurial import ignore
  35 
  36 #
  37 # Adjust the load path based on our location and the version of python into
  38 # which it is being loaded.  This assumes the normal onbld directory
  39 # structure, where we are in bin/ and the modules are in
  40 # lib/python(version)?/onbld/Scm/.  If that changes so too must this.
  41 #
  42 sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "lib",
  43                                 "python%d.%d" % sys.version_info[:2]))
  44 
  45 #
  46 # Add the relative path to usr/src/tools to the load path, such that when run
  47 # from the source tree we use the modules also within the source tree.
  48 #
  49 sys.path.insert(2, os.path.join(os.path.dirname(__file__), ".."))
  50 
  51 from onbld.Checks import Comments, Copyright, CStyle, HdrChk
  52 from onbld.Checks import JStyle, Keywords, ManLint, Mapfile
  53 
  54 
  55 class GitError(Exception):
  56     pass
  57 
  58 def git(command):
  59     """Run a command and return a stream containing its stdout (and write its
  60     stderr to its stdout)"""
  61 
  62     if type(command) != list:
  63         command = command.split()
  64 
  65     command = ["git"] + command
  66 
  67     try:
  68         tmpfile = tempfile.TemporaryFile(prefix="git-nits")
  69     except EnvironmentError, e:
  70         raise GitError("Could not create temporary file: %s\n" % e)
  71 
  72     try:


 266     output.write("C style:\n")
 267     for f in flist(lambda x: x.endswith('.c') or x.endswith('.h')):
 268         fh = open(f, 'r')
 269         ret |= CStyle.cstyle(fh, output=output, picky=True,
 270                              check_posix_types=True,
 271                              check_continuation=True)
 272         fh.close()
 273     return ret
 274 
 275 
 276 def jstyle(root, parent, flist, output):
 277     ret = 0
 278     output.write("Java style:\n")
 279     for f in flist(lambda x: x.endswith('.java')):
 280         fh = open(f, 'r')
 281         ret |= JStyle.jstyle(fh, output=output, picky=True)
 282         fh.close()
 283     return ret
 284 
 285 
 286 def manlint(root, parent, flist, output):
 287     ret = 0
 288     output.write("Man page format:\n")
 289     ManfileRE = re.compile(r'.*\.[0-9][a-z]*$', re.IGNORECASE)
 290     for f in flist(lambda x: ManfileRE.match(x)):
 291         fh = open(f, 'r')
 292         ret |= ManLint.manlint(fh, output=output, picky=True)
 293         fh.close()
 294     return ret
 295 
 296 def keywords(root, parent, flist, output):
 297     ret = 0
 298     output.write("SCCS Keywords:\n")
 299     for f in flist():
 300         fh = open(f, 'r')
 301         ret |= Keywords.keywords(fh, output=output)
 302         fh.close()
 303     return ret
 304 
 305 
 306 def run_checks(root, parent, cmds, paths='', opts={}):
 307     """Run the checks given in 'cmds', expected to have well-known signatures,
 308     and report results for any which fail.
 309 
 310     Return failure if any of them did.
 311 
 312     NB: the function name of the commands passed in is used to name the NOT
 313     file which excepts files from them."""
 314 
 315     ret = 0


 317     for cmd in cmds:
 318         s = StringIO()
 319 
 320         exclude = not_check(root, cmd.func_name)
 321         result = cmd(root, parent, gen_files(root, parent, paths, exclude),
 322                      output=s)
 323         ret |= result
 324 
 325         if result != 0:
 326             print s.getvalue()
 327 
 328     return ret
 329 
 330 
 331 def nits(root, parent, paths):
 332     cmds = [copyright,
 333             cstyle,
 334             hdrchk,
 335             jstyle,
 336             keywords,
 337             manlint,
 338             mapfilechk]
 339     run_checks(root, parent, cmds, paths)
 340 
 341 
 342 def pbchk(root, parent, paths):
 343     cmds = [comchk,
 344             copyright,
 345             cstyle,
 346             hdrchk,
 347             jstyle,
 348             keywords,
 349             manlint,
 350             mapfilechk]
 351     run_checks(root, parent, cmds)
 352 
 353 
 354 def main(cmd, args):
 355     parent_branch = None
 356 
 357     try:
 358         opts, args = getopt.getopt(args, 'b:')
 359     except getopt.GetoptError, e:
 360         sys.stderr.write(str(e) + '\n')
 361         sys.stderr.write("Usage: %s [-b branch] [path...]\n" % cmd)
 362         sys.exit(1)
 363 
 364     for opt, arg in opts:
 365         if opt == '-b':
 366             parent_branch = arg
 367 
 368     if not parent_branch:
 369         parent_branch = git_parent_branch(git_branch())