1 #! /usr/bin/env python2.7
3 # Copyright (c) 2016 ARM Limited
6 # The license below extends only to copyright in the software and shall
7 # not be construed as granting a license to any other intellectual
8 # property including but not limited to intellectual property relating
9 # to a hardware implementation of the functionality of the software
10 # licensed hereunder. You may use the software subject to the license
11 # terms below provided that you ensure that this notice is replicated
12 # unmodified and in its entirety in all distributions of the software,
13 # modified or unmodified, in source code or in binary form.
15 # Redistribution and use in source and binary forms, with or without
16 # modification, are permitted provided that the following conditions are
17 # met: redistributions of source code must retain the above copyright
18 # notice, this list of conditions and the following disclaimer;
19 # redistributions in binary form must reproduce the above copyright
20 # notice, this list of conditions and the following disclaimer in the
21 # documentation and/or other materials provided with the distribution;
22 # neither the name of the copyright holders nor the names of its
23 # contributors may be used to endorse or promote products derived from
24 # this software without specific prior written permission.
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 # Authors: Andreas Sandberg
43 from style
.file_types
import lang_type
44 import style
.verifiers
45 from style
.region
import all_regions
47 from style
.style
import StdioUI
48 from style
import repo
50 verifier_names
= dict([
51 (c
.__name
__, c
) for c
in style
.verifiers
.all_verifiers
])
53 def verify(filename
, regions
=all_regions
, verbose
=False, verifiers
=None,
59 base
= os
.path
.join(os
.path
.dirname(__file__
), "..")
61 verifiers
= style
.verifiers
.all_verifiers
64 print "Verifying %s[%s]..." % (filename
, regions
)
65 for verifier
in [ v(ui
, opts
, base
=base
) for v
in verifiers
]:
67 print "Applying %s (%s)" % (
68 verifier
.test_name
, verifier
.__class
__.__name
__)
69 if verifier
.apply(filename
, regions
=regions
):
74 repo_classes
= repo
.detect_repo()
76 print >> sys
.stderr
, "Error: Failed to detect repository type, no " \
77 "known repository type found."
79 elif len(repo_classes
) > 1:
80 print >> sys
.stderr
, "Error: Detected multiple repository types."
83 return repo_classes
[0]()
87 "none" : lambda : None,
89 "hg" : repo
.MercurialRepo
,
92 if __name__
== '__main__':
95 parser
= argparse
.ArgumentParser(
96 description
="Check a file for gem5 style violations",
97 epilog
="""If no files are specified, the style checker tries to
98 determine the list of modified and added files from the version
99 control system and checks those."""
102 parser
.add_argument("--verbose", "-v", action
="count",
103 help="Produce verbose output")
105 parser
.add_argument("--fix", "-f", action
="store_true",
106 help="Automatically fix style violations.")
108 parser
.add_argument("--modifications", "-m", action
="store_true",
109 help="""Apply the style checker to modified regions
110 instead of whole files""")
112 parser
.add_argument("--repo-type", choices
=repo_types
, default
="auto",
113 help="Repository type to use to detect changes")
115 parser
.add_argument("--checker", "-c", choices
=verifier_names
, default
=[],
117 help="""Style checkers to run. Can be specified
120 parser
.add_argument("files", metavar
="FILE", nargs
="*",
122 help="Source file(s) to inspect")
124 args
= parser
.parse_args()
126 repo
= repo_types
[args
.repo_type
]()
128 verifiers
= [ verifier_names
[name
] for name
in args
.checker
] \
129 if args
.checker
else None
132 if not files
and repo
:
133 added
, modified
= repo
.staged_files()
134 files
= [ repo
.file_path(f
) for f
in added
+ modified
]
136 for filename
in files
:
137 if args
.modifications
and repo
and repo
.in_repo(filename
):
138 regions
= repo
.modified_regions(filename
)
140 regions
= all_regions
142 if not verify(filename
, regions
=regions
,
143 verbose
=args
.verbose
,