From d82e59f74bdb2fb9b5e770a0cc9a1e7c649fbd81 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 25 Mar 2017 02:26:04 -0700 Subject: scons: Use a relative symlink for git hooks more selectively. If the hooks directory is a symlink, then there are at least two possible scenarios to consider when installing a hook which is itself a symlink. The first is that hooks is a relative symlink, and so is likely intended to stay in place relative to .git and the git working directory. In that case, it's ok for the symlinks inside of hooks to be relative to the working directory too, since they should also stay in place relatively speaking. The second situation is that the symlink is absolute. In that case, moving the git working directory will move the hook relative to the hook directory, and any relative symlink will become broken. In that case, the hook symlink needs to be absolute. The same logic likely applies to the .git directory itself, although I haven't run into a situation in practice where the .git directory is actually a symlink. Change-Id: I047aa198094dd0fd5a841417d93b211ece02783f Reviewed-on: https://gem5-review.googlesource.com/2541 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg --- SConstruct | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SConstruct b/SConstruct index 4593fdd4b..fbc52ccd5 100755 --- a/SConstruct +++ b/SConstruct @@ -400,8 +400,12 @@ def install_git_style_hooks(): if not git_hooks.exists(): mkdir(git_hooks.get_abspath()) - # Use a relative symlink if the hooks live in the source directory - if hook.is_under(main.root): + 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( script.get_abspath(), hook.Dir(".").get_abspath()) -- cgit v1.2.3