git-diff-upstream (1217B)
1 #!/bin/bash 2 set -euo pipefail 3 4 usage() { 5 echo "Usage: $0 --repo <url> --branch <branch> --prefix <path>" 6 exit 1 7 } 8 9 cleanup() { 10 [ -n "${upstream_dir:-}" ] && rm -rf "$upstream_dir" 11 [ -n "${upstream_dir:-}" ] && git remote remove "$remote_name" 12 } 13 trap cleanup EXIT 14 15 repo_url="" 16 branch="" 17 prefix="" 18 19 while [[ "$#" -gt 0 ]]; do 20 case $1 in 21 --repo) 22 repo_url="$2" 23 shift 24 ;; 25 --branch) 26 branch="$2" 27 shift 28 ;; 29 --prefix) 30 prefix="$2" 31 shift 32 ;; 33 *) 34 echo "Unknown parameter: $1" 35 usage 36 ;; 37 esac 38 shift 39 done 40 41 [ -z "$repo_url" ] || [ -z "$branch" ] || [ -z "$prefix" ] && usage 42 43 # Normalize prefix and vars 44 clean_prefix=${prefix%/} 45 remote_name="${clean_prefix}.upstream" 46 upstream_dir="${clean_prefix}.upstream" 47 48 cd "$(git rev-parse --show-toplevel)" 49 50 if ! git remote | grep -q "^${remote_name}$"; then 51 git remote add -f "$remote_name" "$repo_url" 52 else 53 git fetch "$remote_name" 54 fi 55 56 [ -d "$upstream_dir" ] && rm -rf "$upstream_dir" 57 mkdir -p "$upstream_dir" 58 59 git archive --format=tar "${remote_name}/${branch}" | tar -xf - -C "$upstream_dir" 60 61 if ! command -v difft &>/dev/null; then 62 echo "Error: difft (difftastic) not found." >&2 63 exit 1 64 fi 65 66 difft --color=always "$clean_prefix" "$upstream_dir" | less -R