forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpre-commit
More file actions
executable file
·97 lines (82 loc) · 3.07 KB
/
pre-commit
File metadata and controls
executable file
·97 lines (82 loc) · 3.07 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env bash
egrep_q() {
egrep "$@" >/dev/null 2>/dev/null
}
die() {
echo 'pre-commit hook failure' 1>&2
echo '-----------------------' 1>&2
echo '' 1>&2
echo "$@" 1>&2
exit 1
}
ExternalData_stage_linked_content() {
# Identify the hash algorithm used.
case "$file" in
*.md5) algo=MD5 ; base="${file/.md5}" ; validate="^[0-9a-fA-F]{32}$" ;;
*) die "$file: invalid content link (unrecognized extension)" ;;
esac
# Load and validate the hash stored in the staged blob.
hash=$(git cat-file blob $dst_obj) || hash=""
echo "$hash" | egrep_q "$validate" ||
die "$file: invalid content link (does not match '$validate')"
# Reject simultaneous raw file and content link.
files=$(git ls-files -- "$base")
if test -n "$files"; then
die "$file: content link may not coexist with $files"
fi
# Find the content referenced by the link.
staged="$(dirname "$file")/.ExternalData_${algo}_${hash}"
stored="${ExternalData_STORE}/$algo/$hash"
ref="refs/data/$algo/$hash"
obj=$(git rev-parse --verify -q "$ref") || obj=""
if test -z "$obj" -a -f "$staged"; then
# Content is staged by the ExternalData module. Store it in Git.
obj=$(git hash-object --no-filters -w -- "$staged") ||
die "$file: git hash-object failed to load $staged"
git update-ref "$ref" "$obj" "" ||
die "$file: git update-ref failed to create $ref = $obj"
echo "$file: Added content to Git at $ref"
fi
# Move staged object to local store if it is in Git.
if test -f "$staged" && test -n "$obj"; then
mkdir -p "${stored%/*}" &&
mv "$staged" "$stored" &&
rm -f "$staged" &&
echo "$file: Added content to local store at $stored"
fi
# Report destination of content link.
if test -f "$stored"; then
echo "Content link $file -> $stored"
else
echo "Content link $file -> (object not in local store)"
fi
}
ExternalData_non_content_link() {
# Reject simultaneous raw file and content link.
files=$(git ls-files -- "$file.md5")
if test -n "$files"; then
die "$file: file may not coexist with $files"
fi
}
#-----------------------------------------------------------------------------
# Check that developmer setup is up-to-date.
lastSetupForDevelopment=$(git config --get hooks.SetupForDevelopment || echo 0)
eval $(grep '^SetupForDevelopment_VERSION=' "${BASH_SOURCE%/*}/../SetupForDevelopment.sh")
test -n "$SetupForDevelopment_VERSION" || SetupForDevelopment_VERSION=0
if test $lastSetupForDevelopment -lt $SetupForDevelopment_VERSION; then
die 'Developer setup in this work tree is out of date. Please re-run
Utilities/SetupForDevelopment.sh
'
fi
#-----------------------------------------------------------------------------
# Local ExternalData object repository.
ExternalData_STORE=".ExternalData"
# Process content links created by/for the CMake ExternalData module.
git diff-index --cached HEAD --diff-filter=AM |
while read src_mode dst_mode src_obj dst_obj status file; do
if echo "$dst_mode $file" | egrep_q '^100644 .*\.(md5)$'; then
ExternalData_stage_linked_content
else
ExternalData_non_content_link
fi
done || exit 1