112 lines
3.5 KiB
Bash
Executable File
112 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
|
|
fileSizeThresholdMB='2'
|
|
|
|
export BASHBREW_ARCH=
|
|
|
|
gitCache="$(bashbrew cat --format '{{ gitCache }}' <(echo 'Maintainers: empty hack (@example)'))"
|
|
_git() {
|
|
git -C "$gitCache" "$@"
|
|
}
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
set -- '--all'
|
|
fi
|
|
|
|
imgs="$(bashbrew list --repos "$@" | sort -u)"
|
|
for img in $imgs; do
|
|
bashbrew fetch "$img" # force `git fetch`
|
|
commits="$(
|
|
bashbrew cat --format '
|
|
{{- range $e := .Entries -}}
|
|
{{- range $a := .Architectures -}}
|
|
{
|
|
{{- json "GitRepo" }}:{{ json ($e.ArchGitRepo $a) -}},
|
|
{{- json "GitFetch" }}:{{ json ($e.ArchGitFetch $a) -}},
|
|
{{- json "GitCommit" }}:{{ json ($e.ArchGitCommit $a) -}}
|
|
}
|
|
{{- "\n" -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
' "$img" | jq -s 'unique'
|
|
)"
|
|
|
|
declare -A naughtyCommits=() naughtyTopCommits=() seenCommits=()
|
|
length="$(jq -r 'length' <<<"$commits")"
|
|
for (( i = 0; i < length; i++ )); do
|
|
topCommit="$(jq -r ".[$i].GitCommit" <<<"$commits")"
|
|
gitRepo="$(jq -r ".[$i].GitRepo" <<<"$commits")"
|
|
gitFetch="$(jq -r ".[$i].GitFetch" <<<"$commits")"
|
|
|
|
if ! _git fetch --quiet "$gitRepo" "$gitFetch:" ; then
|
|
naughtyCommits[$topCommit]="unable to to fetch specified GitFetch: $gitFetch"
|
|
naughtyTopCommits[$topCommit]="$topCommit"
|
|
elif ! _git merge-base --is-ancestor "$topCommit" 'FETCH_HEAD'; then
|
|
# check that the commit is in the GitFetch branch specified
|
|
naughtyCommits[$topCommit]="is not in the specified ref GitFetch: $gitFetch"
|
|
naughtyTopCommits[$topCommit]="$topCommit"
|
|
fi
|
|
|
|
IFS=$'\n'
|
|
potentiallyNaughtyGlobs=( '**.tar**' )
|
|
potentiallyNaughtyCommits=( $(_git log --diff-filter=DMT --format='format:%H' "$topCommit" -- "${potentiallyNaughtyGlobs[@]}") )
|
|
unset IFS
|
|
|
|
# bash 4.3 sucks (https://stackoverflow.com/a/7577209/433558)
|
|
[ "${#potentiallyNaughtyCommits[@]}" -gt 0 ] || continue
|
|
|
|
for commit in "${potentiallyNaughtyCommits[@]}"; do
|
|
[ -z "${seenCommits[$commit]:-}" ] || break
|
|
seenCommits[$commit]=1
|
|
|
|
IFS=$'\n'
|
|
binaryFiles=( $(
|
|
_git diff-tree --no-commit-id -r --numstat --diff-filter=DMT "$commit" -- "${potentiallyNaughtyGlobs[@]}" \
|
|
| grep '^-' \
|
|
| cut -d$'\t' -f3- \
|
|
|| :
|
|
) )
|
|
unset IFS
|
|
|
|
# bash 4.3 sucks (https://stackoverflow.com/a/7577209/433558)
|
|
[ "${#binaryFiles[@]}" -gt 0 ] || continue
|
|
|
|
naughtyReasons=()
|
|
for file in "${binaryFiles[@]}"; do
|
|
fileSize="$(_git ls-tree -r --long "$commit" -- "$file" | awk '{ print $4 }')"
|
|
fileSizeMB="$(( fileSize / 1024 / 1024 ))"
|
|
if [ "$fileSizeMB" -gt "$fileSizeThresholdMB" ]; then
|
|
naughtyReasons+=( "modified binary file (larger than ${fileSizeThresholdMB}MB): $file (${fileSizeMB}MB)" )
|
|
fi
|
|
done
|
|
|
|
if [ "${#naughtyReasons[@]}" -gt 0 ]; then
|
|
: "${naughtyCommits[$commit]:=}"
|
|
if [ -n "${naughtyCommits[$commit]}" ]; then
|
|
naughtyCommits[$commit]+=$'\n'
|
|
fi
|
|
IFS=$'\n'
|
|
naughtyCommits[$commit]+="${naughtyReasons[*]}"
|
|
unset IFS
|
|
naughtyTopCommits[$commit]="$topCommit"
|
|
fi
|
|
done
|
|
done
|
|
|
|
if [ "${#naughtyCommits[@]}" -gt 0 ]; then
|
|
echo " - $img:"
|
|
for naughtyCommit in "${!naughtyCommits[@]}"; do
|
|
naughtyReasons="${naughtyCommits[$naughtyCommit]}"
|
|
naughtyTopCommit="${naughtyTopCommits[$naughtyCommit]}"
|
|
if [ "$naughtyTopCommit" != "$naughtyCommit" ]; then
|
|
#commitsBetween="$(_git rev-list --count "$naughtyCommit...$naughtyTopCommit")"
|
|
naughtyCommit+=" (in history of $naughtyTopCommit)"
|
|
fi
|
|
echo " - commit $naughtyCommit:"
|
|
sed -e 's/^/ - /' <<<"$naughtyReasons"
|
|
done
|
|
echo
|
|
fi
|
|
done
|