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 from style
.verifiers
import all_verifiers
45 from style
.region
import all_regions
47 from style
.style
import StdioUI
48 from style
import repo
50 def verify(filename
, regions
=all_regions
, verbose
=False):
53 base
= os
.path
.join(os
.path
.dirname(__file__
), "..")
54 verifiers
= [ v(ui
, opts
, base
=base
) for v
in all_verifiers
]
57 print "Verifying %s[%s]..." % (filename
, regions
)
58 for verifier
in verifiers
:
60 print "Applying %s (%s)" % (
61 verifier
.test_name
, verifier
.__class
__.__name
__)
62 if verifier
.apply(filename
, regions
=regions
):
67 repo_classes
= repo
.detect_repo()
69 print >> sys
.stderr
, "Error: Failed to detect repository type, no " \
70 "known repository type found."
72 elif len(repo_classes
) > 1:
73 print >> sys
.stderr
, "Error: Detected multiple repository types."
76 return repo_classes
[0]()
80 "none" : lambda : None,
82 "hg" : repo
.MercurialRepo
,
85 if __name__
== '__main__':
88 parser
= argparse
.ArgumentParser(
89 description
="Check a file for gem5 style violations",
90 epilog
="""If no files are specified, the style checker tries to
91 determine the list of modified and added files from the version
92 control system and checks those."""
95 parser
.add_argument("--verbose", "-v", action
="count",
96 help="Produce verbose output")
98 parser
.add_argument("--modifications", "-m", action
="store_true",
99 help="""Apply the style checker to modified regions
100 instead of whole files""")
102 parser
.add_argument("--repo-type", choices
=repo_types
, default
="auto",
103 help="Repository type to use to detect changes")
105 parser
.add_argument("files", metavar
="FILE", nargs
="*",
107 help="Source file(s) to inspect")
109 args
= parser
.parse_args()
111 repo
= repo_types
[args
.repo_type
]()
114 if not files
and repo
:
115 added
, modified
= repo
.staged_files()
116 files
= [ repo
.file_path(f
) for f
in added
+ modified
]
118 for filename
in files
:
119 if args
.modifications
and repo
and repo
.in_repo(filename
):
120 regions
= repo
.modified_regions(filename
)
122 regions
= all_regions
124 if not verify(filename
, regions
=regions
,
125 verbose
=args
.verbose
):