Files
odfstudio/tools/upstream/git_divergence.sh
T
elioperdreau c2b5ab6b2e odfstudio: add upstream maintenance tools
Change-Id: I352b0b0bf55ba845afd6289250060b7af44a26ee
2026-09-16 21:28:39 +02:00

69 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ODF_BRANCH="${1:-main}"
UPSTREAM_BRANCH="${2:-upstream/master}"
git rev-parse --git-dir >/dev/null 2>&1 || {
echo "ERROR: not inside a Git repository" >&2
exit 1
}
git rev-parse --verify "$ODF_BRANCH" >/dev/null
git rev-parse --verify "$UPSTREAM_BRANCH" >/dev/null
BASE="$(git merge-base "$ODF_BRANCH" "$UPSTREAM_BRANCH")"
ODF_HEAD="$(git rev-parse "$ODF_BRANCH")"
UPSTREAM_HEAD="$(git rev-parse "$UPSTREAM_BRANCH")"
TMPDIR_WORK="$(mktemp -d)"
trap 'rm -rf "$TMPDIR_WORK"' EXIT
ODF_FILES="$TMPDIR_WORK/odfstudio-files.txt"
UPSTREAM_FILES="$TMPDIR_WORK/upstream-files.txt"
SHARED_FILES="$TMPDIR_WORK/shared-files.txt"
git diff --name-only "$BASE".."$ODF_BRANCH" | sort -u > "$ODF_FILES"
git diff --name-only "$BASE".."$UPSTREAM_BRANCH" | sort -u > "$UPSTREAM_FILES"
comm -12 "$ODF_FILES" "$UPSTREAM_FILES" > "$SHARED_FILES"
ODF_COMMITS="$(git rev-list --count "$UPSTREAM_BRANCH".."$ODF_BRANCH")"
UPSTREAM_COMMITS="$(git rev-list --count "$ODF_BRANCH".."$UPSTREAM_BRANCH")"
ODF_FILE_COUNT="$(wc -l < "$ODF_FILES")"
UPSTREAM_FILE_COUNT="$(wc -l < "$UPSTREAM_FILES")"
SHARED_FILE_COUNT="$(wc -l < "$SHARED_FILES")"
echo "ODFStudio upstream synchronization report"
echo "========================================="
echo
printf "BASE %s\n" "$BASE"
printf "ODFStudio %s (%s)\n" "$ODF_HEAD" "$ODF_BRANCH"
printf "Upstream %s (%s)\n" "$UPSTREAM_HEAD" "$UPSTREAM_BRANCH"
echo
echo "Commits"
printf " ODFStudio %8d\n" "$ODF_COMMITS"
printf " Upstream %8d\n" "$UPSTREAM_COMMITS"
echo
echo "Modified files since common base"
printf " ODFStudio %8d\n" "$ODF_FILE_COUNT"
printf " Upstream %8d\n" "$UPSTREAM_FILE_COUNT"
printf " Shared %8d\n" "$SHARED_FILE_COUNT"
echo
echo "Upstream activity on shared files"
echo "---------------------------------"
if [[ ! -s "$SHARED_FILES" ]]; then
echo "No shared modified files."
exit 0
fi
while IFS= read -r file; do
count="$(git rev-list --count "$BASE".."$UPSTREAM_BRANCH" -- "$file")"
printf "%5d %s\n" "$count" "$file"
done < "$SHARED_FILES" | sort -nr