11b362b15af34006e6a11974088a46d42b903418eJohann#!/bin/sh 21b362b15af34006e6a11974088a46d42b903418eJohannself="$0" 31b362b15af34006e6a11974088a46d42b903418eJohanndirname_self=$(dirname "$self") 41b362b15af34006e6a11974088a46d42b903418eJohann 51b362b15af34006e6a11974088a46d42b903418eJohannusage() { 61b362b15af34006e6a11974088a46d42b903418eJohann cat <<EOF >&2 71b362b15af34006e6a11974088a46d42b903418eJohannUsage: $self [option] 81b362b15af34006e6a11974088a46d42b903418eJohann 91b362b15af34006e6a11974088a46d42b903418eJohannThis script applies a whitespace transformation to the commit at HEAD. If no 101b362b15af34006e6a11974088a46d42b903418eJohannoptions are given, then the modified files are left in the working tree. 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohannOptions: 131b362b15af34006e6a11974088a46d42b903418eJohann -h, --help Shows this message 141b362b15af34006e6a11974088a46d42b903418eJohann -n, --dry-run Shows a diff of the changes to be made. 151b362b15af34006e6a11974088a46d42b903418eJohann --amend Squashes the changes into the commit at HEAD 161b362b15af34006e6a11974088a46d42b903418eJohann This option will also reformat the commit message. 171b362b15af34006e6a11974088a46d42b903418eJohann --commit Creates a new commit containing only the whitespace changes 181b362b15af34006e6a11974088a46d42b903418eJohann --msg-only Reformat the commit message only, ignore the patch itself. 191b362b15af34006e6a11974088a46d42b903418eJohann 201b362b15af34006e6a11974088a46d42b903418eJohannEOF 211b362b15af34006e6a11974088a46d42b903418eJohann rm -f ${CLEAN_FILES} 221b362b15af34006e6a11974088a46d42b903418eJohann exit 1 231b362b15af34006e6a11974088a46d42b903418eJohann} 241b362b15af34006e6a11974088a46d42b903418eJohann 251b362b15af34006e6a11974088a46d42b903418eJohann 261b362b15af34006e6a11974088a46d42b903418eJohannlog() { 271b362b15af34006e6a11974088a46d42b903418eJohann echo "${self##*/}: $@" >&2 281b362b15af34006e6a11974088a46d42b903418eJohann} 291b362b15af34006e6a11974088a46d42b903418eJohann 301b362b15af34006e6a11974088a46d42b903418eJohann 311b362b15af34006e6a11974088a46d42b903418eJohannvpx_style() { 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for f; do 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case "$f" in 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *.h|*.c|*.cc) 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "${dirname_self}"/vpx-astyle.sh "$f" 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ;; 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang esac 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang done 391b362b15af34006e6a11974088a46d42b903418eJohann} 401b362b15af34006e6a11974088a46d42b903418eJohann 411b362b15af34006e6a11974088a46d42b903418eJohann 421b362b15af34006e6a11974088a46d42b903418eJohannapply() { 431b362b15af34006e6a11974088a46d42b903418eJohann [ $INTERSECT_RESULT -ne 0 ] && patch -p1 < "$1" 441b362b15af34006e6a11974088a46d42b903418eJohann} 451b362b15af34006e6a11974088a46d42b903418eJohann 461b362b15af34006e6a11974088a46d42b903418eJohann 471b362b15af34006e6a11974088a46d42b903418eJohanncommit() { 481b362b15af34006e6a11974088a46d42b903418eJohann LAST_CHANGEID=$(git show | awk '/Change-Id:/{print $2}') 491b362b15af34006e6a11974088a46d42b903418eJohann if [ -z "$LAST_CHANGEID" ]; then 501b362b15af34006e6a11974088a46d42b903418eJohann log "HEAD doesn't have a Change-Id, unable to generate a new commit" 511b362b15af34006e6a11974088a46d42b903418eJohann exit 1 521b362b15af34006e6a11974088a46d42b903418eJohann fi 531b362b15af34006e6a11974088a46d42b903418eJohann 541b362b15af34006e6a11974088a46d42b903418eJohann # Build a deterministic Change-Id from the parent's 551b362b15af34006e6a11974088a46d42b903418eJohann NEW_CHANGEID=${LAST_CHANGEID}-styled 561b362b15af34006e6a11974088a46d42b903418eJohann NEW_CHANGEID=I$(echo $NEW_CHANGEID | git hash-object --stdin) 571b362b15af34006e6a11974088a46d42b903418eJohann 581b362b15af34006e6a11974088a46d42b903418eJohann # Commit, preserving authorship from the parent commit. 591b362b15af34006e6a11974088a46d42b903418eJohann git commit -a -C HEAD > /dev/null 601b362b15af34006e6a11974088a46d42b903418eJohann git commit --amend -F- << EOF 611b362b15af34006e6a11974088a46d42b903418eJohannCosmetic: Fix whitespace in change ${LAST_CHANGEID:0:9} 621b362b15af34006e6a11974088a46d42b903418eJohann 631b362b15af34006e6a11974088a46d42b903418eJohannChange-Id: ${NEW_CHANGEID} 641b362b15af34006e6a11974088a46d42b903418eJohannEOF 651b362b15af34006e6a11974088a46d42b903418eJohann} 661b362b15af34006e6a11974088a46d42b903418eJohann 671b362b15af34006e6a11974088a46d42b903418eJohann 681b362b15af34006e6a11974088a46d42b903418eJohannshow_commit_msg_diff() { 691b362b15af34006e6a11974088a46d42b903418eJohann if [ $DIFF_MSG_RESULT -ne 0 ]; then 701b362b15af34006e6a11974088a46d42b903418eJohann log "Modified commit message:" 711b362b15af34006e6a11974088a46d42b903418eJohann diff -u "$ORIG_COMMIT_MSG" "$NEW_COMMIT_MSG" | tail -n +3 721b362b15af34006e6a11974088a46d42b903418eJohann fi 731b362b15af34006e6a11974088a46d42b903418eJohann} 741b362b15af34006e6a11974088a46d42b903418eJohann 751b362b15af34006e6a11974088a46d42b903418eJohann 761b362b15af34006e6a11974088a46d42b903418eJohannamend() { 771b362b15af34006e6a11974088a46d42b903418eJohann show_commit_msg_diff 781b362b15af34006e6a11974088a46d42b903418eJohann if [ $DIFF_MSG_RESULT -ne 0 ] || [ $INTERSECT_RESULT -ne 0 ]; then 791b362b15af34006e6a11974088a46d42b903418eJohann git commit -a --amend -F "$NEW_COMMIT_MSG" 801b362b15af34006e6a11974088a46d42b903418eJohann fi 811b362b15af34006e6a11974088a46d42b903418eJohann} 821b362b15af34006e6a11974088a46d42b903418eJohann 831b362b15af34006e6a11974088a46d42b903418eJohann 841b362b15af34006e6a11974088a46d42b903418eJohanndiff_msg() { 851b362b15af34006e6a11974088a46d42b903418eJohann git log -1 --format=%B > "$ORIG_COMMIT_MSG" 861b362b15af34006e6a11974088a46d42b903418eJohann "${dirname_self}"/wrap-commit-msg.py \ 871b362b15af34006e6a11974088a46d42b903418eJohann < "$ORIG_COMMIT_MSG" > "$NEW_COMMIT_MSG" 881b362b15af34006e6a11974088a46d42b903418eJohann cmp -s "$ORIG_COMMIT_MSG" "$NEW_COMMIT_MSG" 891b362b15af34006e6a11974088a46d42b903418eJohann DIFF_MSG_RESULT=$? 901b362b15af34006e6a11974088a46d42b903418eJohann} 911b362b15af34006e6a11974088a46d42b903418eJohann 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohann# Temporary files 941b362b15af34006e6a11974088a46d42b903418eJohannORIG_DIFF=orig.diff.$$ 951b362b15af34006e6a11974088a46d42b903418eJohannMODIFIED_DIFF=modified.diff.$$ 961b362b15af34006e6a11974088a46d42b903418eJohannFINAL_DIFF=final.diff.$$ 971b362b15af34006e6a11974088a46d42b903418eJohannORIG_COMMIT_MSG=orig.commit-msg.$$ 981b362b15af34006e6a11974088a46d42b903418eJohannNEW_COMMIT_MSG=new.commit-msg.$$ 991b362b15af34006e6a11974088a46d42b903418eJohannCLEAN_FILES="${ORIG_DIFF} ${MODIFIED_DIFF} ${FINAL_DIFF}" 1001b362b15af34006e6a11974088a46d42b903418eJohannCLEAN_FILES="${CLEAN_FILES} ${ORIG_COMMIT_MSG} ${NEW_COMMIT_MSG}" 1011b362b15af34006e6a11974088a46d42b903418eJohann 1021b362b15af34006e6a11974088a46d42b903418eJohann# Preconditions 1031b362b15af34006e6a11974088a46d42b903418eJohann[ $# -lt 2 ] || usage 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann# Check that astyle supports pad-header and align-pointer=name 1061b362b15af34006e6a11974088a46d42b903418eJohannif ! astyle --pad-header --align-pointer=name < /dev/null; then 1071b362b15af34006e6a11974088a46d42b903418eJohann log "Install astyle v1.24 or newer" 1081b362b15af34006e6a11974088a46d42b903418eJohann exit 1 1091b362b15af34006e6a11974088a46d42b903418eJohannfi 1101b362b15af34006e6a11974088a46d42b903418eJohann 1111b362b15af34006e6a11974088a46d42b903418eJohannif ! git diff --quiet HEAD; then 1121b362b15af34006e6a11974088a46d42b903418eJohann log "Working tree is dirty, commit your changes first" 1131b362b15af34006e6a11974088a46d42b903418eJohann exit 1 1141b362b15af34006e6a11974088a46d42b903418eJohannfi 1151b362b15af34006e6a11974088a46d42b903418eJohann 1161b362b15af34006e6a11974088a46d42b903418eJohann# Need to be in the root 1171b362b15af34006e6a11974088a46d42b903418eJohanncd "$(git rev-parse --show-toplevel)" 1181b362b15af34006e6a11974088a46d42b903418eJohann 1191b362b15af34006e6a11974088a46d42b903418eJohann# Collect the original diff 1201b362b15af34006e6a11974088a46d42b903418eJohanngit show > "${ORIG_DIFF}" 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann# Apply the style guide on new and modified files and collect its diff 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangfor f in $(git diff HEAD^ --name-only -M90 --diff-filter=AM); do 1241b362b15af34006e6a11974088a46d42b903418eJohann case "$f" in 1251b362b15af34006e6a11974088a46d42b903418eJohann third_party/*) continue;; 1261b362b15af34006e6a11974088a46d42b903418eJohann nestegg/*) continue;; 1271b362b15af34006e6a11974088a46d42b903418eJohann esac 1281b362b15af34006e6a11974088a46d42b903418eJohann vpx_style "$f" 1291b362b15af34006e6a11974088a46d42b903418eJohanndone 1301b362b15af34006e6a11974088a46d42b903418eJohanngit diff --no-color --no-ext-diff > "${MODIFIED_DIFF}" 1311b362b15af34006e6a11974088a46d42b903418eJohann 1321b362b15af34006e6a11974088a46d42b903418eJohann# Intersect the two diffs 1331b362b15af34006e6a11974088a46d42b903418eJohann"${dirname_self}"/intersect-diffs.py \ 1341b362b15af34006e6a11974088a46d42b903418eJohann "${ORIG_DIFF}" "${MODIFIED_DIFF}" > "${FINAL_DIFF}" 1351b362b15af34006e6a11974088a46d42b903418eJohannINTERSECT_RESULT=$? 1361b362b15af34006e6a11974088a46d42b903418eJohanngit reset --hard >/dev/null 1371b362b15af34006e6a11974088a46d42b903418eJohann 1381b362b15af34006e6a11974088a46d42b903418eJohann# Fixup the commit message 1391b362b15af34006e6a11974088a46d42b903418eJohanndiff_msg 1401b362b15af34006e6a11974088a46d42b903418eJohann 1411b362b15af34006e6a11974088a46d42b903418eJohann# Handle options 1421b362b15af34006e6a11974088a46d42b903418eJohannif [ -n "$1" ]; then 1431b362b15af34006e6a11974088a46d42b903418eJohann case "$1" in 1441b362b15af34006e6a11974088a46d42b903418eJohann -h|--help) usage;; 1451b362b15af34006e6a11974088a46d42b903418eJohann -n|--dry-run) cat "${FINAL_DIFF}"; show_commit_msg_diff;; 1461b362b15af34006e6a11974088a46d42b903418eJohann --commit) apply "${FINAL_DIFF}"; commit;; 1471b362b15af34006e6a11974088a46d42b903418eJohann --amend) apply "${FINAL_DIFF}"; amend;; 1481b362b15af34006e6a11974088a46d42b903418eJohann --msg-only) amend;; 1491b362b15af34006e6a11974088a46d42b903418eJohann *) usage;; 1501b362b15af34006e6a11974088a46d42b903418eJohann esac 1511b362b15af34006e6a11974088a46d42b903418eJohannelse 1521b362b15af34006e6a11974088a46d42b903418eJohann apply "${FINAL_DIFF}" 1531b362b15af34006e6a11974088a46d42b903418eJohann if ! git diff --quiet; then 1541b362b15af34006e6a11974088a46d42b903418eJohann log "Formatting changes applied, verify and commit." 1551b362b15af34006e6a11974088a46d42b903418eJohann log "See also: http://www.webmproject.org/code/contribute/conventions/" 1561b362b15af34006e6a11974088a46d42b903418eJohann git diff --stat 1571b362b15af34006e6a11974088a46d42b903418eJohann fi 1581b362b15af34006e6a11974088a46d42b903418eJohannfi 1591b362b15af34006e6a11974088a46d42b903418eJohann 1601b362b15af34006e6a11974088a46d42b903418eJohannrm -f ${CLEAN_FILES} 161