diff options
author | Jarkko Kniivilä <jkniiv@gmail.com> | 2015-09-05 23:31:42 +0300 |
---|---|---|
committer | Mike Burns <mike@mike-burns.com> | 2015-11-01 18:59:02 +0100 |
commit | b3f25262c260e81a4bffaa6444b48013f902a04a (patch) | |
tree | 8e83ad07b4af379f48de7941779dc600a8f6d8b4 /share | |
parent | 5f592878eed79dd28f9f93418f9456185fd21ac9 (diff) |
Fix hooks so that they are run in the directory where they are located
Calls `find(1)` with the `-exec` action just like before but instead of `run_hooks()`
letting `find` execute the hook directly it is wrapped in a shell one-liner which
changes to the hook's directory and executes the hook with "./" prepended to its
basename. These changes allow hooks to refer to dotfiles with relative paths.
For instance we can call a Makefile two directories up simply with `make -C ../..`.
Also make sure we are compatible with Solaris' Bourne shell and `find(1)`.
Closes #150. Closes #149.
Diffstat (limited to 'share')
-rw-r--r-- | share/rcm.sh.in | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/share/rcm.sh.in b/share/rcm.sh.in index d8fc19e..c7a3dfb 100644 --- a/share/rcm.sh.in +++ b/share/rcm.sh.in @@ -126,7 +126,14 @@ run_hooks() { find_opts=-print fi - find "$hook_file" -type f \( \( -user $USER -perm -100 \) -o -perm -001 \) $find_opts -exec {} \; + # Emulate the non-POSIX-compliant `-execdir` action with `-exec` and a shell one-liner. + # The former is however a bit better when it comes to security. On the other hand + # running these hooks imply some level of trust; surely one doesn't clone somebody + # else's dotfiles repository without reviewing the hooks before doing an `rcup`? + find "$hook_file" -type f \( \( -user $USER -perm -100 \) -o -perm -001 \) \ + -exec \ + sh -c 'cd "`dirname $1`" && ./"`basename $1`"' arg0 '{}' \ + \; else $DEBUG "no $when-$direction hook present for $dotfiles_dir, skipping" fi |