| # Copyright (c) 2013, 2015-2017 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) 2011 Advanced Micro Devices, Inc. | |
| # Copyright (c) 2009 The Hewlett-Packard Development Company | |
| # Copyright (c) 2004-2005 The Regents of The University of Michigan | |
| # 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. | |
| from __future__ import print_function | |
| import re | |
| import sys | |
| import gem5_scons.util | |
| mercurial_style_message = """ | |
| You're missing the gem5 style hook, which automatically checks your code | |
| against the gem5 style rules on hg commit and qrefresh commands. | |
| This script will now install the hook in your .hg/hgrc file. | |
| Press enter to continue, or ctrl-c to abort: """ | |
| mercurial_style_upgrade_message = """ | |
| Your Mercurial style hooks are not up-to-date. This script will now | |
| try to automatically update them. A backup of your hgrc will be saved | |
| in .hg/hgrc.old. | |
| Press enter to continue, or ctrl-c to abort: """ | |
| mercurial_style_hook_template = """ | |
| # The following lines were automatically added by gem5/SConstruct | |
| # to provide the gem5 style-checking hooks | |
| [extensions] | |
| hgstyle = %s/util/hgstyle.py | |
| [hooks] | |
| pretxncommit.style = python:hgstyle.check_style | |
| pre-qrefresh.style = python:hgstyle.check_style | |
| # End of SConstruct additions | |
| """ | |
| mercurial_lib_not_found = """ | |
| Mercurial libraries cannot be found, ignoring style hook. If | |
| you are a gem5 developer, please fix this and run the style | |
| hook. It is important. | |
| """ | |
| def install_style_hooks(env): | |
| hgdir = env.Dir('#.hg') | |
| style_hook = True | |
| style_hooks = tuple() | |
| hgrc = hgdir.File('hgrc') | |
| hgrc_old = hgdir.File('hgrc.old') | |
| try: | |
| from mercurial import ui | |
| ui = ui.ui() | |
| ui.readconfig(hgrc.abspath) | |
| style_hooks = (ui.config('hooks', 'pretxncommit.style', None), | |
| ui.config('hooks', 'pre-qrefresh.style', None)) | |
| style_hook = all(style_hooks) | |
| style_extension = ui.config('extensions', 'style', None) | |
| except ImportError: | |
| print(mercurial_lib_not_found) | |
| if "python:style.check_style" in style_hooks: | |
| # Try to upgrade the style hooks | |
| print(mercurial_style_upgrade_message) | |
| # continue unless user does ctrl-c/ctrl-d etc. | |
| try: | |
| raw_input() | |
| except: | |
| print("Input exception, exiting scons.\n") | |
| sys.exit(1) | |
| shutil.copyfile(hgrc.abspath, hgrc_old.abspath) | |
| re_style_hook = re.compile(r"^([^=#]+)\.style\s*=\s*([^#\s]+).*") | |
| re_style_extension = re.compile("style\s*=\s*([^#\s]+).*") | |
| old, new = open(hgrc_old.abspath, 'r'), open(hgrc.abspath, 'w') | |
| for l in old: | |
| m_hook = re_style_hook.match(l) | |
| m_ext = re_style_extension.match(l) | |
| if m_hook: | |
| hook, check = m_hook.groups() | |
| if check != "python:style.check_style": | |
| print("Warning: %s.style is using a non-default " \ | |
| "checker: %s" % (hook, check)) | |
| if hook not in ("pretxncommit", "pre-qrefresh"): | |
| print("Warning: Updating unknown style hook: %s" % hook) | |
| l = "%s.style = python:hgstyle.check_style\n" % hook | |
| elif m_ext and m_ext.group(1) == style_extension: | |
| l = "hgstyle = %s/util/hgstyle.py\n" % env.root.abspath | |
| new.write(l) | |
| elif not style_hook: | |
| print(mercurial_style_message, end=' ') | |
| # continue unless user does ctrl-c/ctrl-d etc. | |
| try: | |
| raw_input() | |
| except: | |
| print("Input exception, exiting scons.\n") | |
| sys.exit(1) | |
| hgrc_path = '%s/.hg/hgrc' % env.root.abspath | |
| print("Adding style hook to", hgrc_path, "\n") | |
| try: | |
| with open(hgrc_path, 'a') as f: | |
| f.write(mercurial_style_hook_template % env.root.abspath) | |
| except: | |
| print("Error updating", hgrc_path) | |
| sys.exit(1) | |
| def generate(env): | |
| if exists(env) and not gem5_scons.util.ignore_style(): | |
| install_style_hooks(env) | |
| def exists(env): | |
| return env.Dir('#.hg').exists() |