scons: Rewrite git style hook installer

The SCons script currently assumes that .git is a proper directory
with all git meta data. This isn't the case if the working directory
was checked out using git worktrees. In such case .git is a file with
meta data telling git where the repository data is stored.

This changeset updates changes the SConstruct file to rely on git
rev-parse to get the real git directory.

Change-Id: I3d0475eabc12e868193797067a88e540a9b6e927
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
This commit is contained in:
Andreas Sandberg 2016-05-09 11:32:11 +01:00
parent 8b412fcfd6
commit 5131a768c3

View file

@ -260,7 +260,6 @@ main.AppendENVPath('PYTHONPATH', extra_python_paths)
######################################################################## ########################################################################
hgdir = main.root.Dir(".hg") hgdir = main.root.Dir(".hg")
gitdir = main.root.Dir(".git")
style_message = """ style_message = """
@ -368,11 +367,21 @@ if not ignore_style and hgdir.exists():
print "Error updating", hgrc_path print "Error updating", hgrc_path
sys.exit(1) sys.exit(1)
# Try to wire up git to the style hooks def install_git_style_hooks():
git_pre_commit_hook = gitdir.File("hooks/pre-commit") try:
if not ignore_style and gitdir.exists() and not git_pre_commit_hook.exists(): 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")
git_pre_commit_hook = git_hooks.File("pre-commit")
git_style_script = File("util/git-pre-commit.py") git_style_script = File("util/git-pre-commit.py")
if git_pre_commit_hook.exists():
return
print git_style_message, print git_style_message,
try: try:
raw_input() raw_input()
@ -380,15 +389,26 @@ if not ignore_style and gitdir.exists() and not git_pre_commit_hook.exists():
print "Input exception, exiting scons.\n" print "Input exception, exiting scons.\n"
sys.exit(1) sys.exit(1)
try: if not git_hooks.exists():
rel_style_script = os.path.relpath( mkdir(git_hooks.get_abspath())
# Use a relative symlink if the hooks live in the source directory
if git_pre_commit_hook.is_under(main.root):
script_path = os.path.relpath(
git_style_script.get_abspath(), git_style_script.get_abspath(),
git_pre_commit_hook.Dir(".").get_abspath()) git_pre_commit_hook.Dir(".").get_abspath())
os.symlink(rel_style_script, git_pre_commit_hook.get_abspath()) else:
script_path = git_style_script.get_abspath()
try:
os.symlink(script_path, git_pre_commit_hook.get_abspath())
except: except:
print "Error updating git pre-commit hook" print "Error updating git pre-commit hook"
raise raise
sys.exit(1)
# Try to wire up git to the style hooks
if not ignore_style and main.root.Entry(".git").exists():
install_git_style_hooks()
################################################### ###################################################
# #