misc: Add Arm contributions to gem5-20 RELEASE-NOTES.md
[gem5.git] / util / git-pre-commit.py
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2016 ARM Limited
4 # All rights reserved
5 #
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.
14 #
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.
25 #
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.
37
38 from __future__ import print_function
39
40 from tempfile import TemporaryFile
41 import os
42 import subprocess
43 import sys
44
45 from style.repo import GitRepo
46 from style.verifiers import all_verifiers, all_regions
47 from style.style import StdioUI, check_ignores
48
49 import argparse
50
51 parser = argparse.ArgumentParser(
52 description="gem5 git style checker hook")
53
54 parser.add_argument("--verbose", "-v", action="store_true",
55 help="Produce verbose output")
56
57 args = parser.parse_args()
58
59 git = GitRepo()
60
61 opts = {}
62 repo_base = git.repo_base()
63 ui = StdioUI()
64
65 os.chdir(repo_base)
66 failing_files = set()
67 staged_mismatch = set()
68
69 for status, fname in git.status(filter="MA", cached=True):
70 if args.verbose:
71 print("Checking {}...".format(fname))
72 if check_ignores(fname):
73 continue
74 if status == "M":
75 regions = git.staged_regions(fname)
76 else:
77 regions = all_regions
78
79 # Show they appropriate object and dump it to a file
80 status = git.file_from_index(fname)
81 f = TemporaryFile()
82 f.write(status.encode())
83
84 verifiers = [ v(ui, opts, base=repo_base) for v in all_verifiers ]
85 for v in verifiers:
86 f.seek(0)
87 # It is prefered that the first check is silent as it is in the
88 # staged file. If the check fails, then we will do it non-silently
89 # on the current file, reporting meaningful shortcomings
90 if not v.skip(fname) and v.check(fname, regions, fobj=f, silent=True):
91 failing_files.add(fname)
92 if not v.check(fname, regions):
93 staged_mismatch.add(fname)
94 f.close()
95
96 if failing_files:
97 if len(failing_files) > len(staged_mismatch):
98 print("\n", file=sys.stderr)
99 print("Style checker failed for the following files:", file=sys.stderr)
100 for f in failing_files:
101 if f not in staged_mismatch:
102 print("\t{}".format(f), file=sys.stderr)
103 print("\n", file=sys.stderr)
104 print(
105 "Please run the style checker manually to fix "
106 "the offending files.\n"
107 "To check your modifications, run: util/style.py -m",
108 file=sys.stderr)
109
110 print("\n", file=sys.stderr)
111 if staged_mismatch:
112 print(
113 "It looks like you have forgotten to stage your "
114 "fixes for commit in\n"
115 "the following files: ", file=sys.stderr)
116 for f in staged_mismatch:
117 print("\t%s".format(f), file=sys.stderr)
118 print("Please `git --add' them", file=sys.stderr)
119 sys.exit(1)