File: pre-commit

package info (click to toggle)
insighttoolkit4 4.13.3withdata-dfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 489,260 kB
  • sloc: cpp: 557,342; ansic: 146,850; fortran: 34,788; python: 16,572; sh: 2,187; lisp: 2,070; tcl: 993; java: 362; perl: 200; makefile: 129; csh: 81; pascal: 69; xml: 19; ruby: 10
file content (212 lines) | stat: -rwxr-xr-x 7,312 bytes parent folder | download | duplicates (3)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/usr/bin/env bash
#==========================================================================
#
#   Copyright Insight Software Consortium
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#          http://www.apache.org/licenses/LICENSE-2.0.txt
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
#==========================================================================*/

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 -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 -n "$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")
top_level_dir=$(git rev-parse --show-toplevel)
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

  \"$top_level_dir/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=A |
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

git diff-index --cached HEAD --diff-filter=M |
while read src_mode dst_mode src_obj dst_obj status file; do
  if echo "$dst_mode $file" | egrep-q '^100644 .*\.(md5)$'; then
    if ! git diff-index --cached HEAD --diff-filter=DM -- "${file/.md5}".sha512 | egrep-q '\.(sha512)$'; then
      if git ls-tree -r HEAD~1 --name-only | grep "${file/.md5}".sha512; then # sha512 exists in git tree
          die "The $file content link was updated without
updating its .sha512 counterpart. Please run

  cd \"$top_level_dir\"
  git rm -- ${file/.md5}.sha512
"
      fi
    fi
    ExternalData_stage_linked_content
  elif echo "$dst_mode $file" | egrep-q '^100644 .*\.(sha512)$'; then
    if ! git diff-index --cached HEAD --diff-filter=DM -- "${file/.sha512}".md5 | egrep-q '\.(md5)$'; then
      die "The $file content link was updated without
updating its .md5 counterpart. Please run

  cd \"$top_level_dir\"
  git rm -- ${file/.sha512}.md5
"
    fi
    ExternalData_non_content_link
  else
    ExternalData_non_content_link
  fi
done || exit 1

#-----------------------------------------------------------------------------

validate_migration_xml_with_xmllint() {
  dtd='Documentation/Migration/ITKMigration.dtd' &&
  changes=$(git diff-files -- "$1" "$dtd") &&
  if test -n "$changes"; then
    die "Cannot validate '$1' against '$dtd' with work tree changes."
  fi &&
  if ! out=$("$xmllint" --dtdvalid "$dtd" --noout "$1" 2>&1); then
    die "$out"
  fi
}

# Validate migration guide xml files.
files=$(git diff-index --cached HEAD --diff-filter=AM -- Documentation/Migration) &&
if test -n "$files"; then
  validate=$(git config --get --bool hooks.ValidateMigrationXML || echo true) &&
  if test "$validate" = "true"; then
    xmllint=$(git config hooks.xmllint.path || type -p xmllint || true) &&
    if test -z "$xmllint"; then
      die 'Cannot validate Documentation/Migration files without xmllint.
Install xmllint in the PATH or configure its location:

  git config hooks.xmllint.path "/path/to/xmllint"

Alternatively, disable this check:

  git config hooks.ValidateMigrationXML false

and manually validate the xml files at "http://validator.w3.org/".'
    fi &&
    echo "$files" |
    while read src_mode dst_mode src_obj dst_obj status file; do
      if echo "$file" | egrep-q '\.xml$'; then
        validate_migration_xml_with_xmllint "$file"
      fi
    done
  fi
fi || exit

#-----------------------------------------------------------------------------
# Check files added by commit

added=$(git diff-index --diff-filter=A --cached HEAD --)
added_normal=$(echo "$added" | grep -v '^:...... 160000')
added_module=$(echo "$added" | grep    '^:...... 160000')

# Do not allow adding of files with .txx extension.
added_txx=$(echo "$added_normal" | grep '\.txx$')
bad=$(
  test -n "$added_txx" &&
  echo "Files with the .txx extension are deprecated -- please use .hxx instead:" &&
  echo "$added_txx" | awk '{printf("  %s\n",$6)}'
)
test -z "$bad" || die "$bad"

# Do not allow addition of submodules.
bad=$(
  test -n "$added_module" &&
  echo "Submodules may not be added to ITK at this time:" &&
  echo "$added_module" | awk '{printf("  %s\n",$6)}'
)
test -z "$bad" || die "$bad"

#-----------------------------------------------------------------------------
# Style hooks.
. "${BASH_SOURCE%/*}/pre-commit-style.bash"