123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #!/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
|