forked from ddddavidmartin/Pre-commit-hooks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcanonicalize_filename.sh
executable file
·48 lines (38 loc) · 1.6 KB
/
canonicalize_filename.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
# Provide the canonicalize filename (physical filename with out any symlinks)
# like the GNU version readlink with the -f option regardless of the version of
# readlink (GNU or BSD).
# This file is part of a set of unofficial pre-commit hooks available
# at github.
# Link: https://github.com/githubbrowser/Pre-commit-hooks
# Contact: David Martin, david.martin.mailbox@googlemail.com
###########################################################
# There should be no need to change anything below this line.
# Canonicalize by recursively following every symlink in every component of the
# specified filename. This should reproduce the results of the GNU version of
# readlink with the -f option.
#
# Reference: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
function canonicalize_filename () {
local target_file=$1
local physical_directory=""
local result=""
# Need to restore the working directory after work.
pushd `pwd` > /dev/null
cd "$(dirname "$target_file")"
target_file=`basename $target_file`
# Iterate down a (possible) chain of symlinks
while [ -L "$target_file" ]
do
target_file=$(readlink "$target_file")
cd "$(dirname "$target_file")"
target_file=$(basename "$target_file")
done
# Compute the canonicalized name by finding the physical path
# for the directory we're in and appending the target file.
physical_directory=`pwd -P`
result="$physical_directory"/"$target_file"
# restore the working directory after work.
popd > /dev/null
echo "$result"
}