File: pre-commit

package info (click to toggle)
vtk7 7.1.1%2Bdfsg2-8
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 127,396 kB
  • sloc: cpp: 1,539,584; ansic: 124,382; python: 78,038; tcl: 47,013; xml: 8,142; yacc: 5,040; java: 4,439; perl: 3,132; lex: 1,926; sh: 1,500; makefile: 126; objc: 83
file content (97 lines) | stat: -rwxr-xr-x 3,135 bytes parent folder | download | duplicates (12)
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 -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