contrib/check-code.py
changeset 21222 4840abc83970
parent 21097 e8ef59b351c3
child 21487 c26464ce0781
equal deleted inserted replaced
21221:e3ca21e4d05f 21222:4840abc83970
   366   # warnings
   366   # warnings
   367   []
   367   []
   368 ]
   368 ]
   369 
   369 
   370 checks = [
   370 checks = [
   371     ('python', r'.*\.(py|cgi)$', pyfilters, pypats),
   371     ('python', r'.*\.(py|cgi)$', r'^#!.*python', pyfilters, pypats),
   372     ('test script', r'(.*/)?test-[^.~]*$', testfilters, testpats),
   372     ('test script', r'(.*/)?test-[^.~]*$', '', testfilters, testpats),
   373     ('c', r'.*\.[ch]$', cfilters, cpats),
   373     ('c', r'.*\.[ch]$', '', cfilters, cpats),
   374     ('unified test', r'.*\.t$', utestfilters, utestpats),
   374     ('unified test', r'.*\.t$', '', utestfilters, utestpats),
   375     ('layering violation repo in revlog', r'mercurial/revlog\.py', pyfilters,
   375     ('layering violation repo in revlog', r'mercurial/revlog\.py', '',
   376      inrevlogpats),
   376      pyfilters, inrevlogpats),
   377     ('layering violation ui in util', r'mercurial/util\.py', pyfilters,
   377     ('layering violation ui in util', r'mercurial/util\.py', '', pyfilters,
   378      inutilpats),
   378      inutilpats),
   379     ('txt', r'.*\.txt$', txtfilters, txtpats),
   379     ('txt', r'.*\.txt$', '', txtfilters, txtpats),
   380 ]
   380 ]
   381 
   381 
   382 def _preparepats():
   382 def _preparepats():
   383     for c in checks:
   383     for c in checks:
   384         failandwarn = c[-1]
   384         failandwarn = c[-1]
   390                 p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p)
   390                 p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p)
   391                 # [^...] doesn't match newline
   391                 # [^...] doesn't match newline
   392                 p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p)
   392                 p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p)
   393 
   393 
   394                 pats[i] = (re.compile(p, re.MULTILINE),) + pseq[1:]
   394                 pats[i] = (re.compile(p, re.MULTILINE),) + pseq[1:]
   395         filters = c[2]
   395         filters = c[3]
   396         for i, flt in enumerate(filters):
   396         for i, flt in enumerate(filters):
   397             filters[i] = re.compile(flt[0]), flt[1]
   397             filters[i] = re.compile(flt[0]), flt[1]
   398 _preparepats()
   398 _preparepats()
   399 
   399 
   400 class norepeatlogger(object):
   400 class norepeatlogger(object):
   444 
   444 
   445     return True if no error is found, False otherwise.
   445     return True if no error is found, False otherwise.
   446     """
   446     """
   447     blamecache = None
   447     blamecache = None
   448     result = True
   448     result = True
   449     for name, match, filters, pats in checks:
   449 
       
   450     try:
       
   451         fp = open(f)
       
   452     except IOError, e:
       
   453         print "Skipping %s, %s" % (f, str(e).split(':', 1)[0])
       
   454         return result
       
   455     pre = post = fp.read()
       
   456     fp.close()
       
   457 
       
   458     for name, match, magic, filters, pats in checks:
   450         if debug:
   459         if debug:
   451             print name, f
   460             print name, f
   452         fc = 0
   461         fc = 0
   453         if not re.match(match, f):
   462         if not (re.match(match, f) or (magic and re.search(magic, f))):
   454             if debug:
   463             if debug:
   455                 print "Skipping %s for %s it doesn't match %s" % (
   464                 print "Skipping %s for %s it doesn't match %s" % (
   456                        name, match, f)
   465                        name, match, f)
   457             continue
   466             continue
   458         try:
       
   459             fp = open(f)
       
   460         except IOError, e:
       
   461             print "Skipping %s, %s" % (f, str(e).split(':', 1)[0])
       
   462             continue
       
   463         pre = post = fp.read()
       
   464         fp.close()
       
   465         if "no-" "check-code" in pre:
   467         if "no-" "check-code" in pre:
   466             print "Skipping %s it has no-" "check-code" % f
   468             print "Skipping %s it has no-" "check-code" % f
   467             return "Skip" # skip checking this file
   469             return "Skip" # skip checking this file
   468         for p, r in filters:
   470         for p, r in filters:
   469             post = re.sub(p, r, post)
   471             post = re.sub(p, r, post)