github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/script/backport-pr (about) 1 #!/usr/bin/env bash 2 # 3 # Backports a PR into a release branch: 4 # 5 # # backport PR #123 into release-0.5-backport-123 6 # $ git checkout master 7 # $ git pull 8 # $ script/backport-pr 1.1 1023 9 10 relversion="v$1.x" 11 relbranch="release-$1" 12 pr="$2" 13 prbranch="$relbranch-backport-$pr" 14 pullsurl="https://api.github.com/repos/git-lfs/git-lfs/pulls" 15 prurl="https://api.github.com/repos/git-lfs/git-lfs/pulls/$pr" 16 prjson="$(curl -n $pullsurl/$pr 2>/dev/null)" 17 headref="$(echo $prjson | jq -r -e ".head.ref")" 18 [ "$?" -ne 0 ] && { 19 echo "PR #$pr is invalid." 20 exit 1 21 } 22 prtitle="$(echo $prjson | jq -r ".title" | sed "s/\"/'/g")" 23 24 git checkout -q -f $relbranch 25 git clean -q -fdx 26 git pull -q 27 git checkout -q -f -B $prbranch 28 29 commit=`git log -1 --pretty=%H "--grep=Merge pull request #$pr" "--grep=Merge branch '.*$headref'" master` 30 31 echo "Backporting:\n" 32 33 git log -1 $commit 34 35 conflicts="" 36 37 git cherry-pick -x --allow-empty -m1 $commit &> /dev/null || { 38 unmerged=$(git ls-files --unmerged --stage | cut -f 2 -d$'\t' | uniq) 39 conflicts="\n\nConflicting files:" 40 for file in $unmerged; do 41 git add "$file" 42 conflicts="$conflicts\n- $file" 43 done 44 git commit -q --no-edit 45 } 46 47 commitmsg="Backport $headref from #$pr to $relbranch" 48 if [ "$conflicts" ]; then 49 commitmsg="$commitmsg [merge conflicts]" 50 fi 51 52 git commit -q --allow-empty --amend -m "$commitmsg" 53 git push -q -f origin $prbranch 54 git checkout -q -f $relbranch 55 git branch -q -D $prbranch 56 57 curl -in $pullsurl -d "{ 58 \"title\": \"Backport #$pr for $relversion: $prtitle\", 59 \"head\": \"$prbranch\", 60 \"base\": \"$relbranch\", 61 \"body\": \"This backports #$pr.$conflicts\" 62 }" 2>/dev/null