From 902b3e34beaadaa2ac2932a9ff93f08008a4b16f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 8 Nov 2017 18:45:08 -0800 Subject: scons: Pull style hook management out of the main SConstruct. Put the code which supports style hooks for mercurial and git into two scons "tools". Change-Id: I3ffed85a177be4f9e458fff7b1cf16a3a479914e Reviewed-on: https://gem5-review.googlesource.com/5563 Reviewed-by: Gabe Black Maintainer: Gabe Black --- SConstruct | 189 ------------------------------------------------------------- 1 file changed, 189 deletions(-) (limited to 'SConstruct') diff --git a/SConstruct b/SConstruct index 7cf2c9c83..f0a3b655d 100755 --- a/SConstruct +++ b/SConstruct @@ -196,195 +196,6 @@ if not ('CC' in main_dict_keys and 'CXX' in main_dict_keys): # as well main.AppendENVPath('PYTHONPATH', extra_python_paths) -######################################################################## -# -# Mercurial Stuff. -# -# If the gem5 directory is a mercurial repository, we should do some -# extra things. -# -######################################################################## - -hgdir = main.root.Dir(".hg") - - -style_message = """ -You're missing the gem5 style hook, which automatically checks your code -against the gem5 style rules on %s. -This script will now install the hook in your %s. -Press enter to continue, or ctrl-c to abort: """ - -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: """ - -git_style_message = """ -You're missing the gem5 style or commit message hook. These hooks help -to ensure that your code follows gem5's style rules on git commit. -This script will now install the hook in your .git/hooks/ directory. -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 = """ -# 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 - -""" % (main.root.abspath) - -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. -""" - -# Check for style hook and prompt for installation if it's not there. -# Skip this if --ignore-style was specified, there's no interactive -# terminal to prompt, or no recognized revision control system can be -# found. -ignore_style = GetOption('ignore_style') or not sys.stdin.isatty() - -# Try wire up Mercurial to the style hooks -if not ignore_style and hgdir.exists(): - 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" % main.root.abspath - - new.write(l) - elif not style_hook: - print mercurial_style_message, - # 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' % main.root.abspath - print "Adding style hook to", hgrc_path, "\n" - try: - with open(hgrc_path, 'a') as f: - f.write(mercurial_style_hook) - except: - print "Error updating", hgrc_path - sys.exit(1) - -def install_git_style_hooks(): - try: - gitdir = Dir(readCommand( - ["git", "rev-parse", "--git-dir"]).strip("\n")) - except Exception, e: - print "Warning: Failed to find git repo directory: %s" % e - return - - git_hooks = gitdir.Dir("hooks") - def hook_exists(hook_name): - hook = git_hooks.File(hook_name) - return hook.exists() - - def hook_install(hook_name, script): - hook = git_hooks.File(hook_name) - if hook.exists(): - print "Warning: Can't install %s, hook already exists." % hook_name - return - - if hook.islink(): - print "Warning: Removing broken symlink for hook %s." % hook_name - os.unlink(hook.get_abspath()) - - if not git_hooks.exists(): - mkdir(git_hooks.get_abspath()) - git_hooks.clear() - - abs_symlink_hooks = git_hooks.islink() and \ - os.path.isabs(os.readlink(git_hooks.get_abspath())) - - # Use a relative symlink if the hooks live in the source directory, - # and the hooks directory is not a symlink to an absolute path. - if hook.is_under(main.root) and not abs_symlink_hooks: - script_path = os.path.relpath( - os.path.realpath(script.get_abspath()), - os.path.realpath(hook.Dir(".").get_abspath())) - else: - script_path = script.get_abspath() - - try: - os.symlink(script_path, hook.get_abspath()) - except: - print "Error updating git %s hook" % hook_name - raise - - if hook_exists("pre-commit") and hook_exists("commit-msg"): - return - - print git_style_message, - try: - raw_input() - except: - print "Input exception, exiting scons.\n" - sys.exit(1) - - git_style_script = File("util/git-pre-commit.py") - git_msg_script = File("ext/git-commit-msg") - - hook_install("pre-commit", git_style_script) - hook_install("commit-msg", git_msg_script) - -# Try to wire up git to the style hooks -if not ignore_style and main.root.Entry(".git").exists(): - install_git_style_hooks() - ################################################### # # Figure out which configurations to set up based on the path(s) of -- cgit v1.2.3