199,387d198
< ########################################################################
< #
< # 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()
<