diff --git a/util/hgstyle.py b/util/hgstyle.py index ccb04a94f..ecdec4b0f 100755 --- a/util/hgstyle.py +++ b/util/hgstyle.py @@ -50,8 +50,6 @@ current_dir = os.path.dirname(__file__) sys.path.insert(0, current_dir) from style.verifiers import all_verifiers -from style.validators import all_validators -from style.file_types import lang_type from style.style import MercurialUI, check_ignores from style.region import * @@ -85,35 +83,6 @@ def modregions(wctx, fname): return mod_regions -def validate(filename, verbose, exit_code): - lang = lang_type(filename) - if lang not in ('C', 'C++'): - return - - def bad(): - if exit_code is not None: - sys.exit(exit_code) - - try: - f = file(filename, 'r') - except OSError: - if verbose > 0: - print 'could not open file %s' % filename - bad() - return None - - vals = [ v(filename, verbose=(verbose > 1), language=lang) - for v in all_validators ] - - for i, line in enumerate(f): - line = line.rstrip('\n') - for v in vals: - v.validate_line(i, line) - - - return vals - - def _modified_regions(repo, patterns, **kwargs): opt_all = kwargs.get('all', False) opt_no_ignore = kwargs.get('no_ignore', False) @@ -198,37 +167,6 @@ def do_check_style(hgui, repo, *pats, **opts): return False -def do_check_format(hgui, repo, *pats, **opts): - """check files for gem5 code formatting violations - - Without an argument, checks all modified and added files for gem5 - code formatting violations. A list of files can be specified to - limit the checker to a subset of the repository. The style rules - are normally applied on a diff of the repository state (i.e., - added files are checked in their entirety while only modifications - of modified files are checked). - - The --all option can be specified to include clean files and check - modified files in their entirety. - """ - ui = MercurialUI(hgui, hgui.verbose) - - verbose = 0 - for fname, mod_regions in _modified_regions(repo, pats, **opts): - vals = validate(joinpath(repo.root, fname), verbose, None) - if vals is None: - return True - elif any([not v for v in vals]): - print "%s:" % fname - for v in vals: - v.dump() - result = ui.prompt("invalid formatting\n(i)gnore or (a)bort?", - 'ai', 'a') - if result == 'a': - return True - - return False - def check_hook(hooktype): if hooktype not in ('pretxncommit', 'pre-qrefresh'): raise AttributeError, \ @@ -247,17 +185,6 @@ def check_style(ui, repo, hooktype, **kwargs): traceback.print_exc() return True -def check_format(ui, repo, hooktype, **kwargs): - check_hook(hooktype) - args = {} - - try: - return do_check_format(ui, repo, **args) - except Exception, e: - import traceback - traceback.print_exc() - return True - try: from mercurial.i18n import _ except ImportError: @@ -287,31 +214,9 @@ cmdtable = { '^m5style' : ( do_check_style, all_opts + _common_region_options + commands.walkopts, _('hg m5style [-a] [FILE]...')), - '^m5format' : - ( do_check_format, [ - ] + _common_region_options + commands.walkopts, - _('hg m5format [FILE]...')), } if __name__ == '__main__': - import argparse - - parser = argparse.ArgumentParser( - description="Check a file for style violations") - - parser.add_argument("--verbose", "-v", action="count", - help="Produce verbose output") - - parser.add_argument("file", metavar="FILE", nargs="+", - type=str, - help="Source file to inspect") - - args = parser.parse_args() - - for filename in args.file: - vals = validate(filename, verbose=args.verbose, - exit_code=1) - - if args.verbose > 0 and vals is not None: - for v in vals: - v.dump() + print >> sys.stderr, "This file cannot be used from the command line. Use" + print >> sys.stderr, "style.py instead." + sys.exit(1) diff --git a/util/style/validators.py b/util/style/validators.py deleted file mode 100644 index 2c1e594c2..000000000 --- a/util/style/validators.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2014, 2016 ARM Limited -# All rights reserved -# -# The license below extends only to copyright in the software and shall -# not be construed as granting a license to any other intellectual -# property including but not limited to intellectual property relating -# to a hardware implementation of the functionality of the software -# licensed hereunder. You may use the software subject to the license -# terms below provided that you ensure that this notice is replicated -# unmodified and in its entirety in all distributions of the software, -# modified or unmodified, in source code or in binary form. -# -# Copyright (c) 2006 The Regents of The University of Michigan -# Copyright (c) 2007,2011 The Hewlett-Packard Development Company -# Copyright (c) 2016 Advanced Micro Devices, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer; -# redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution; -# neither the name of the copyright holders nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Authors: Nathan Binkert -# Steve Reinhardt -# Andreas Sandberg - -from abc import ABCMeta, abstractmethod -import inspect -import re -import sys - -import style - -tabsize = 8 -lead = re.compile(r'^([ \t]+)') -trail = re.compile(r'([ \t]+)$') -any_control = re.compile(r'\b(if|while|for)([ \t]*)\(') - -class Validator(object): - """Base class for style validators - - Validators analyze source files for common style violations and - produce source code style violation statistics. Unlike style - verifiers (see verifiers.py), they do not try to fix any style - violations violations. - - Deprecation warning: These classes are currently only used by the - "hg m5format" command and not by any style hooks. New style - checkers should inherit from Verifier instead of Validator. - - """ - - __metaclass__ = ABCMeta - - def __init__(self, file_name, verbose=False, language=None): - self.file_name = file_name - self.verbose = verbose - self.bad = 0 - self.language = language - - def fail_line(self, line_no, line, message): - print '%s:%d>' % (self.file_name, line_no + 1), message - if self.verbose: - print line - self.bad += 1 - - def __nonzero__(self): - return self.bad == 0 - - @classmethod - def supported_lang(cls, language): - return True - - @abstractmethod - def validate_line(self, line_no, line): - pass - - @abstractmethod - def dump(self): - pass - -class SimpleValidator(Validator): - supported_langs = set() - - def __init__(self, fail_message, dump_message, file_name, **kwargs): - super(SimpleValidator, self).__init__(file_name, **kwargs) - - self.fail_message = fail_message - self.dump_message = dump_message - - @classmethod - def supported_lang(cls, language): - return not cls.cupported_langs or language in cls.supported_langs - - def validate_line(self, line_no, line): - if not self.simple_validate_line(line): - self.fail_line(line_no, line, self.fail_message) - return False - else: - return True - - @abstractmethod - def simple_validate_line(self, line): - pass - - def dump(self): - print self.dump_message % { - "bad" : self.bad - } - -class LineLength(Validator): - def __init__(self, *args, **kwargs): - super(LineLength, self).__init__(*args, **kwargs) - - self.toolong80 = 0 - - def validate_line(self, line_no, line): - llen = style.normalized_len(line) - if llen == 80: - self.toolong80 += 1 - - if llen > 79: - self.fail_line(line_no, line, 'line too long (%d chars)' % llen) - return False - else: - return True - - def dump(self): - print "%d violations of lines over 79 chars. " \ - "%d of which are 80 chars exactly." % (self.bad, self.toolong80) - -class ControlSpacing(Validator): - supported_langs = set(('C', 'C++')) - - def validate_line(self, line_no, line): - match = any_control.search(line) - if match and match.group(2) != " ": - stats.badcontrol += 1 - self.fail_line(line_no, line, - 'improper spacing after %s' % match.group(1)) - return False - else: - return True - - def dump(self): - print "%d bad parens after if/while/for." % (self.bad, ) - -class CarriageReturn(SimpleValidator): - def __init__(self, *args, **kwargs): - super(CarriageReturn, self).__init__( - "carriage return found", - "%(bad)d carriage returns found.", - *args, **kwargs) - - def simple_validate_line(self, line): - return line.find('\r') == -1 - -class TabIndent(SimpleValidator): - lead = re.compile(r'^([ \t]+)') - - def __init__(self, *args, **kwargs): - super(TabIndent, self).__init__( - "using tabs to indent", - "%(bad)d cases of tabs to indent.", - *args, **kwargs) - - def simple_validate_line(self, line): - match = TabIndent.lead.search(line) - return not (match and match.group(1).find('\t') != -1) - -class TrailingWhitespace(SimpleValidator): - trail = re.compile(r'([ \t]+)$') - - def __init__(self, *args, **kwargs): - super(TrailingWhitespace, self).__init__( - "trailing whitespace", - "%(bad)d cases of whitespace at the end of a line.", - *args, **kwargs) - - def simple_validate_line(self, line): - return not TrailingWhitespace.trail.search(line) - -def is_validator(cls): - """Determine if a class is a Validator that can be instantiated""" - - return inspect.isclass(cls) and issubclass(cls, Validator) and \ - not inspect.isabstract(cls) - -# list of all verifier classes -all_validators = [ v for n, v in \ - inspect.getmembers(sys.modules[__name__], is_validator) ] -