git.py revision 12558
112244Sgabeblack@google.com# Copyright (c) 2013, 2015-2017 ARM Limited 212244Sgabeblack@google.com# All rights reserved. 312244Sgabeblack@google.com# 412244Sgabeblack@google.com# The license below extends only to copyright in the software and shall 512244Sgabeblack@google.com# not be construed as granting a license to any other intellectual 612244Sgabeblack@google.com# property including but not limited to intellectual property relating 712244Sgabeblack@google.com# to a hardware implementation of the functionality of the software 812244Sgabeblack@google.com# licensed hereunder. You may use the software subject to the license 912244Sgabeblack@google.com# terms below provided that you ensure that this notice is replicated 1012244Sgabeblack@google.com# unmodified and in its entirety in all distributions of the software, 1112244Sgabeblack@google.com# modified or unmodified, in source code or in binary form. 1212244Sgabeblack@google.com# 1312244Sgabeblack@google.com# Copyright (c) 2011 Advanced Micro Devices, Inc. 1412244Sgabeblack@google.com# Copyright (c) 2009 The Hewlett-Packard Development Company 1512244Sgabeblack@google.com# Copyright (c) 2004-2005 The Regents of The University of Michigan 1612244Sgabeblack@google.com# All rights reserved. 1712244Sgabeblack@google.com# 1812244Sgabeblack@google.com# Redistribution and use in source and binary forms, with or without 1912244Sgabeblack@google.com# modification, are permitted provided that the following conditions are 2012244Sgabeblack@google.com# met: redistributions of source code must retain the above copyright 2112244Sgabeblack@google.com# notice, this list of conditions and the following disclaimer; 2212244Sgabeblack@google.com# redistributions in binary form must reproduce the above copyright 2312244Sgabeblack@google.com# notice, this list of conditions and the following disclaimer in the 2412244Sgabeblack@google.com# documentation and/or other materials provided with the distribution; 2512244Sgabeblack@google.com# neither the name of the copyright holders nor the names of its 2612244Sgabeblack@google.com# contributors may be used to endorse or promote products derived from 2712244Sgabeblack@google.com# this software without specific prior written permission. 2812244Sgabeblack@google.com# 2912244Sgabeblack@google.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3012244Sgabeblack@google.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3112244Sgabeblack@google.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3212244Sgabeblack@google.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3312244Sgabeblack@google.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3412244Sgabeblack@google.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3512244Sgabeblack@google.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3612244Sgabeblack@google.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3712244Sgabeblack@google.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3812244Sgabeblack@google.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3912244Sgabeblack@google.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4012244Sgabeblack@google.com 4112558Ssiddhesh.poyarekar@gmail.comfrom __future__ import print_function 4212244Sgabeblack@google.comimport os 4312244Sgabeblack@google.com 4412244Sgabeblack@google.comimport gem5_scons.util 4512244Sgabeblack@google.comfrom m5.util import readCommand 4612244Sgabeblack@google.com 4712244Sgabeblack@google.comgit_style_message = """ 4812244Sgabeblack@google.comYou're missing the gem5 style or commit message hook. These hooks help 4912244Sgabeblack@google.comto ensure that your code follows gem5's style rules on git commit. 5012244Sgabeblack@google.comThis script will now install the hook in your .git/hooks/ directory. 5112244Sgabeblack@google.comPress enter to continue, or ctrl-c to abort: """ 5212244Sgabeblack@google.com 5312244Sgabeblack@google.comdef install_style_hooks(env): 5412244Sgabeblack@google.com try: 5512244Sgabeblack@google.com gitdir = env.Dir(readCommand( 5612244Sgabeblack@google.com ["git", "rev-parse", "--git-dir"]).strip("\n")) 5712244Sgabeblack@google.com except Exception, e: 5812558Ssiddhesh.poyarekar@gmail.com print("Warning: Failed to find git repo directory: %s" % e) 5912244Sgabeblack@google.com return 6012244Sgabeblack@google.com 6112244Sgabeblack@google.com git_hooks = gitdir.Dir("hooks") 6212244Sgabeblack@google.com def hook_exists(hook_name): 6312244Sgabeblack@google.com hook = git_hooks.File(hook_name) 6412244Sgabeblack@google.com return hook.exists() 6512244Sgabeblack@google.com 6612244Sgabeblack@google.com def hook_install(hook_name, script): 6712244Sgabeblack@google.com hook = git_hooks.File(hook_name) 6812244Sgabeblack@google.com if hook.exists(): 6912558Ssiddhesh.poyarekar@gmail.com print("Warning: Can't install %s, hook already exists." % 7012558Ssiddhesh.poyarekar@gmail.com hook_name) 7112244Sgabeblack@google.com return 7212244Sgabeblack@google.com 7312244Sgabeblack@google.com if hook.islink(): 7412558Ssiddhesh.poyarekar@gmail.com print("Warning: Removing broken symlink for hook %s." % hook_name) 7512244Sgabeblack@google.com os.unlink(hook.get_abspath()) 7612244Sgabeblack@google.com 7712244Sgabeblack@google.com if not git_hooks.exists(): 7812244Sgabeblack@google.com os.mkdir(git_hooks.get_abspath()) 7912244Sgabeblack@google.com git_hooks.clear() 8012244Sgabeblack@google.com 8112244Sgabeblack@google.com abs_symlink_hooks = git_hooks.islink() and \ 8212244Sgabeblack@google.com os.path.isabs(os.readlink(git_hooks.get_abspath())) 8312244Sgabeblack@google.com 8412244Sgabeblack@google.com # Use a relative symlink if the hooks live in the source directory, 8512244Sgabeblack@google.com # and the hooks directory is not a symlink to an absolute path. 8612244Sgabeblack@google.com if hook.is_under(env.root) and not abs_symlink_hooks: 8712244Sgabeblack@google.com script_path = os.path.relpath( 8812244Sgabeblack@google.com os.path.realpath(script.get_abspath()), 8912244Sgabeblack@google.com os.path.realpath(hook.Dir(".").get_abspath())) 9012244Sgabeblack@google.com else: 9112244Sgabeblack@google.com script_path = script.get_abspath() 9212244Sgabeblack@google.com 9312244Sgabeblack@google.com try: 9412244Sgabeblack@google.com os.symlink(script_path, hook.get_abspath()) 9512244Sgabeblack@google.com except: 9612558Ssiddhesh.poyarekar@gmail.com print("Error updating git %s hook" % hook_name) 9712244Sgabeblack@google.com raise 9812244Sgabeblack@google.com 9912244Sgabeblack@google.com if hook_exists("pre-commit") and hook_exists("commit-msg"): 10012244Sgabeblack@google.com return 10112244Sgabeblack@google.com 10212558Ssiddhesh.poyarekar@gmail.com print(git_style_message, end=' ') 10312244Sgabeblack@google.com try: 10412244Sgabeblack@google.com raw_input() 10512244Sgabeblack@google.com except: 10612558Ssiddhesh.poyarekar@gmail.com print("Input exception, exiting scons.\n") 10712244Sgabeblack@google.com sys.exit(1) 10812244Sgabeblack@google.com 10912244Sgabeblack@google.com git_style_script = env.root.Dir("util").File("git-pre-commit.py") 11012244Sgabeblack@google.com git_msg_script = env.root.Dir("ext").File("git-commit-msg") 11112244Sgabeblack@google.com 11212244Sgabeblack@google.com hook_install("pre-commit", git_style_script) 11312244Sgabeblack@google.com hook_install("commit-msg", git_msg_script) 11412244Sgabeblack@google.com 11512244Sgabeblack@google.comdef generate(env): 11612244Sgabeblack@google.com if exists(env) and not gem5_scons.util.ignore_style(): 11712244Sgabeblack@google.com install_style_hooks(env) 11812244Sgabeblack@google.com 11912244Sgabeblack@google.comdef exists(env): 12012244Sgabeblack@google.com return env.Entry('#.git').exists() 121