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.
41 from style
.file_types
import lang_type
42 import style
.verifiers
43 from style
.region
import all_regions
45 from style
.style
import StdioUI
46 from style
import repo
48 verifier_names
= dict([
49 (c
.__name
__, c
) for c
in style
.verifiers
.all_verifiers
])
51 def verify(filename
, regions
=all_regions
, verbose
=False, verifiers
=None,
57 base
= os
.path
.join(os
.path
.dirname(__file__
), "..")
59 verifiers
= style
.verifiers
.all_verifiers
62 print "Verifying %s[%s]..." % (filename
, regions
)
63 for verifier
in [ v(ui
, opts
, base
=base
) for v
in verifiers
]:
65 print "Applying %s (%s)" % (
66 verifier
.test_name
, verifier
.__class
__.__name
__)
67 if verifier
.apply(filename
, regions
=regions
):
72 repo_classes
= repo
.detect_repo()
74 print >> sys
.stderr
, "Error: Failed to detect repository type, no " \
75 "known repository type found."
77 elif len(repo_classes
) > 1:
78 print >> sys
.stderr
, "Error: Detected multiple repository types."
81 return repo_classes
[0]()
85 "none" : lambda : None,
87 "hg" : repo
.MercurialRepo
,
90 if __name__
== '__main__':
93 parser
= argparse
.ArgumentParser(
94 description
="Check a file for gem5 style violations",
95 epilog
="""If no files are specified, the style checker tries to
96 determine the list of modified and added files from the version
97 control system and checks those."""
100 parser
.add_argument("--verbose", "-v", action
="count",
101 help="Produce verbose output")
103 parser
.add_argument("--fix", "-f", action
="store_true",
104 help="Automatically fix style violations.")
106 parser
.add_argument("--modifications", "-m", action
="store_true",
107 help="""Apply the style checker to modified regions
108 instead of whole files""")
110 parser
.add_argument("--repo-type", choices
=repo_types
, default
="auto",
111 help="Repository type to use to detect changes")
113 parser
.add_argument("--checker", "-c", choices
=verifier_names
, default
=[],
115 help="""Style checkers to run. Can be specified
118 parser
.add_argument("files", metavar
="FILE", nargs
="*",
120 help="Source file(s) to inspect")
122 args
= parser
.parse_args()
124 repo
= repo_types
[args
.repo_type
]()
126 verifiers
= [ verifier_names
[name
] for name
in args
.checker
] \
127 if args
.checker
else None
130 if not files
and repo
:
131 added
, modified
= repo
.staged_files()
132 files
= [ repo
.file_path(f
) for f
in added
+ modified
]
134 for filename
in files
:
135 if args
.modifications
and repo
and repo
.in_repo(filename
):
136 regions
= repo
.modified_regions(filename
)
138 regions
= all_regions
140 if not verify(filename
, regions
=regions
,
141 verbose
=args
.verbose
,