1*4882a593Smuzhiyun#!/bin/bash -e 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun[ -z "$DEBUG" ] || set -x 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun[ -d .git ] || exit 1 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunPATCH_DIR="${1:-$PWD}" 8*4882a593SmuzhiyunPROJECT="${2:-${PWD#$SDK_DIR/}}" 9*4882a593SmuzhiyunBASE_COMMIT=$(git log --pretty="%H" -1 "${3:-HEAD}" --) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunecho "[$PROJECT] Base commit: $(git log --oneline $BASE_COMMIT -1)" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun# Clean 14*4882a593Smuzhiyunrm -rf "$PATCH_DIR" 15*4882a593Smuzhiyunmkdir -p "$PATCH_DIR" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# Saving header of apply script 18*4882a593Smuzhiyuncat << EOF > "$PATCH_DIR/apply-patches.sh" 19*4882a593Smuzhiyun#!/bin/bash -e 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun[ -z "\$DEBUG" ] || set -x 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunPATCH_DIR="\$(dirname "\$(realpath "\$0")")" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyuncd "\$PATCH_DIR/$(realpath "$PWD" --relative-to="$PATCH_DIR")" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunecho "[$PROJECT] Applying patches from \$PATCH_DIR" 28*4882a593Smuzhiyun 29*4882a593Smuzhiyungit add . 30*4882a593Smuzhiyunif git diff HEAD -- | grep -q ""; then 31*4882a593Smuzhiyun git stash >/dev/null || git reset --hard 32*4882a593Smuzhiyunfi 33*4882a593Smuzhiyun 34*4882a593SmuzhiyunEOF 35*4882a593Smuzhiyunchmod a+x "$PATCH_DIR/apply-patches.sh" 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun# Check files 38*4882a593Smuzhiyungit reset &>/dev/null 39*4882a593Smuzhiyunif git status -s | grep -q ""; then 40*4882a593Smuzhiyun if [ "$RK_SAVE_COMMITTED" ]; then 41*4882a593Smuzhiyun echo "[$PROJECT] Uncommitted changes ignored:" 42*4882a593Smuzhiyun git status -s 43*4882a593Smuzhiyun elif [ "$RK_SAVE_TRACKED" ]; then 44*4882a593Smuzhiyun if git status -s | grep -q "^?? "; then 45*4882a593Smuzhiyun echo "[$PROJECT] Untracked file changes ignored:" 46*4882a593Smuzhiyun git status -s | grep "^?? " 47*4882a593Smuzhiyun fi 48*4882a593Smuzhiyun git add -u 49*4882a593Smuzhiyun else 50*4882a593Smuzhiyun git add -A 51*4882a593Smuzhiyun fi 52*4882a593Smuzhiyunfi 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun# Nothing to save 55*4882a593Smuzhiyunif ! git diff $BASE_COMMIT ${RK_SAVE_COMMITTED:+HEAD --} | grep -q ""; then 56*4882a593Smuzhiyun git reset &>/dev/null 57*4882a593Smuzhiyun echo "[$PROJECT] No patch to save" 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun # Perform a clean checkout 60*4882a593Smuzhiyun echo "git checkout $BASE_COMMIT" >> "$PATCH_DIR/apply-patches.sh" 61*4882a593Smuzhiyun exit 0 62*4882a593Smuzhiyunfi 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunecho "[$PROJECT] Saving patches into $PATCH_DIR" 65*4882a593Smuzhiyunecho "[$PROJECT] Patches:" 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun# Saving commits 68*4882a593SmuzhiyunMERGE_BASE=$(git merge-base HEAD $BASE_COMMIT || true) 69*4882a593Smuzhiyunif [ -n "$MERGE_BASE" ]; then 70*4882a593Smuzhiyun git diff $MERGE_BASE HEAD -- | grep -q "" && 71*4882a593Smuzhiyun git format-patch $MERGE_BASE..HEAD -o "$PATCH_DIR" 72*4882a593Smuzhiyunelse 73*4882a593Smuzhiyun # Orphan tree 74*4882a593Smuzhiyun git format-patch -$(git log --oneline | wc -l) -o "$PATCH_DIR" 75*4882a593Smuzhiyunfi 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun# Saving uncommited changes 78*4882a593Smuzhiyunif [ -z "$RK_SAVE_COMMITTED" ] && git status -s | grep -q ""; then 79*4882a593Smuzhiyun echo "$PATCH_DIR/local.diff" 80*4882a593Smuzhiyun git diff --binary HEAD -- > "$PATCH_DIR/local.diff" 81*4882a593Smuzhiyunfi 82*4882a593Smuzhiyungit reset &>/dev/null 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun# Update apply script 85*4882a593Smuzhiyuncat << EOF >> "$PATCH_DIR/apply-patches.sh" 86*4882a593Smuzhiyunif [ -n "$MERGE_BASE" ]; then 87*4882a593Smuzhiyun echo "Base commit: $(git log --oneline $MERGE_BASE -1)" 88*4882a593Smuzhiyun git checkout $MERGE_BASE 89*4882a593Smuzhiyunelse 90*4882a593Smuzhiyun git checkout HEAD^ &>/dev/null || true 91*4882a593Smuzhiyun git branch -D orphan &>/dev/null || true 92*4882a593Smuzhiyun git checkout --orphan orphan >/dev/null 93*4882a593Smuzhiyun git add -f . 94*4882a593Smuzhiyun git reset --hard 95*4882a593Smuzhiyunfi 96*4882a593Smuzhiyun 97*4882a593Smuzhiyunfor f in \$(find "\$PATCH_DIR" -name "*.patch" | sort); do 98*4882a593Smuzhiyun git am "\$f" 99*4882a593Smuzhiyundone 100*4882a593Smuzhiyun 101*4882a593Smuzhiyunif [ -e "\$PATCH_DIR/local.diff" ]; then 102*4882a593Smuzhiyun echo "Applying: \$PATCH_DIR/local.diff" 103*4882a593Smuzhiyun git apply "\$PATCH_DIR/local.diff" 104*4882a593Smuzhiyunfi 105*4882a593SmuzhiyunEOF 106