summaryrefslogtreecommitdiffstats
path: root/src/tools/cherry-pick.sh
blob: 90539a96389b05f71de34e07370a09af0295a7db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

print_error() {
  echo "Error: \`$1\` is not a valid commit. To debug, run:"
  echo
  echo "    git rev-parse --verify $1"
  echo
}

full_sha() {
  git rev-parse \
    --verify \
    --quiet \
    "$1^{object}" || print_error $1
}

commit_message_with_backport_note() {
  message=$(git log --format=%B -n 1 $1)
  echo $message | awk "NR==1{print; print \"\n(backport-of: $1)\"} NR!=1"
}

cherry_pick_commit() {
  sha=$(full_sha $1)
  git cherry-pick $sha > /dev/null
  git commit \
    --amend \
    --file <(commit_message_with_backport_note $sha)
}

for arg ; do
  cherry_pick_commit $arg
done