...
1#!/usr/bin/env bash
2# Copyright 2023 The Kubernetes Authors.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16set -o errexit
17set -o nounset
18set -o pipefail
19
20KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
21source "${KUBE_ROOT}/hack/lib/init.sh"
22cd "${KUBE_ROOT}"
23
24# Files larger than 1MB need to be allowed explicitly.
25maxsize=$((1 * 1024 * 1024))
26
27# Sorted list of those exceptions.
28allowlist=(
29 staging/src/k8s.io/kubectl/images/kubectl-logo-full.png
30)
31
32
33# Files larger than 1MB get reported and verification fails, unless the file is
34# allowed to be larger. Any output or a non-zero exit status indicate a
35# failure.
36largefiles () {
37 # --eol adds information that allows detecting binary files:
38 # i/-text w/-text attr/text=auto eol=lf test/images/sample-device-plugin/sampledeviceplugin
39 #
40 # shellcheck disable=SC2034 # Some variables unused and only present to capture the output field.
41 git ls-files -cm --exclude-standard ':!:vendor/*' --eol | while read -r index tree attr eol file; do
42 case "$tree" in
43 w/-text)
44 # Only binary files have a size limit.
45 size="$(stat --printf=%s "$file")"
46 if [ "${size}" -gt "$maxsize" ] &&
47 ! kube::util::array_contains "$file" "${allowlist[@]}"; then
48 echo "$file is too large ($size bytes)"
49 fi
50 ;;
51 w/|w/lf|w/crlf|w/mixed|w/none)
52 # Other files are okay.
53 ;;
54 *)
55 echo "unexpected 'git ls-files --eol' output for $file: $tree"
56 ;;
57 esac
58 done
59}
60
61if ! result="$(largefiles 2>&1)" || [ "${result}" != "" ]; then
62 # Help "make verify" and Prow identify the failure message through the "ERROR" prefix.
63 sed -e 's/^/ERROR: /' <<EOF
64$result
65
66Large binary files should not be committed to git. Exceptions need to be listed in
67${BASH_SOURCE[0]}.
68EOF
69 exit 1
70fi
View as plain text