1 | #!/usr/bin/env bash
|
2 | #
|
3 | # Fast forward a green branch to master.
|
4 | #
|
5 | # Usage:
|
6 | # soil/maybe-merge.sh <function name>
|
7 |
|
8 | set -o nounset
|
9 | set -o pipefail
|
10 | set -o errexit
|
11 |
|
12 | source soil/common.sh
|
13 |
|
14 | fast-forward() {
|
15 | # Generate a token in "Settings" -> Developer Settings
|
16 | # https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
|
17 | # Should be a secret in Github Actions
|
18 | local github_token=$1
|
19 |
|
20 | local commit_hash=${2:-}
|
21 | local to_branch=${3:-'master'}
|
22 |
|
23 | # local testing
|
24 | if test -z "$github_token"; then
|
25 | # set by YAML
|
26 | github_token=${SOIL_GITHUB_API_TOKEN:-}
|
27 |
|
28 | # Local testing
|
29 | if test -z "$github_token"; then
|
30 | github_token=$(cat token.txt)
|
31 | fi
|
32 | fi
|
33 | if test -z "$commit_hash"; then
|
34 | # $GITHUB_SHA is the commit, set by Github Actions
|
35 | commit_hash=${GITHUB_SHA:-}
|
36 |
|
37 | # Local testing
|
38 | if test -z "$commit_hash"; then
|
39 | commit_hash='ae02c9d6e8ba8e19399de556292a1d93faa220d3'
|
40 | fi
|
41 | fi
|
42 |
|
43 | # Adapted from
|
44 | # https://stackoverflow.com/questions/55800253/how-can-i-do-a-fast-forward-merge-using-the-github-api
|
45 | #
|
46 | # https://docs.github.com/en/rest/git/refs#update-a-reference
|
47 |
|
48 | local response=_tmp/soil/gh-fast-forward.json
|
49 |
|
50 | echo
|
51 | echo "Trying to fast-forward branch $to_branch to commit $commit_hash"
|
52 | echo
|
53 |
|
54 | curl \
|
55 | -o $response \
|
56 | -X PATCH \
|
57 | -H "Content-Type: application/json" \
|
58 | -H "Accept: application/vnd.github.v3+json" \
|
59 | -H "Authorization: token ${github_token}" \
|
60 | https://api.github.com/repos/oilshell/oil/git/refs/heads/$to_branch \
|
61 | -d '{"sha": "'$commit_hash'", "force": false }'
|
62 |
|
63 | local error
|
64 | error=$(cat $response | jq '.message')
|
65 |
|
66 | local ret
|
67 | if test "$error" = 'null'; then
|
68 | echo "Success:"
|
69 | ret=0
|
70 | else
|
71 | echo 'ERROR fast forwarding:'
|
72 | ret=1
|
73 | fi
|
74 |
|
75 | cat $response
|
76 | return $ret
|
77 | }
|
78 |
|
79 | test-fast-forward() {
|
80 | fast-forward '' '' dev-andy-3
|
81 | }
|
82 |
|
83 | all-status-zero() {
|
84 | ### Do all files contain status 0?
|
85 |
|
86 | for path in "$@"; do
|
87 | # There may be a newline on the end, which 'read' stops at.
|
88 | read -r status unused_job_id < $path
|
89 |
|
90 | if test "$status" != '0'; then
|
91 | echo "$path = $status"
|
92 | return 1
|
93 | fi
|
94 | done
|
95 |
|
96 | return 0
|
97 | }
|
98 |
|
99 | soil-run() {
|
100 | local github_token=${1:-} # SOIL_GITHUB_API_TOKEN
|
101 | local run_id=${2:-} # $GITHUB_RUN_ID
|
102 | local commit_hash=${3:-} # GITHUB_SHA
|
103 | local to_branch=${4:-} # defaults to master
|
104 |
|
105 | if test -z "$run_id"; then
|
106 | # GITHUB_RUN_ID is set by Github Actions
|
107 | run_id=${GITHUB_RUN_ID:-}
|
108 |
|
109 | # local testing
|
110 | if test -z "$run_id"; then
|
111 | run_id='2526880241'
|
112 | fi
|
113 | fi
|
114 |
|
115 | local branch=$(git rev-parse --abbrev-ref HEAD)
|
116 | echo "Should we auto-merge branch $branch to master?"
|
117 |
|
118 | if test "$branch" != 'soil-staging'; then
|
119 | echo 'No, only soil-staging is merged to master'
|
120 | return
|
121 | fi
|
122 |
|
123 | local dir=_tmp/status-api
|
124 | rm -f -v $dir/*
|
125 | mkdir -p $dir
|
126 |
|
127 | # These tiny files are written by each Soil task
|
128 | local url_base="http://$SOIL_HOST/status-api/github/$run_id"
|
129 |
|
130 | #local jobs='dummy pea other-tests' # minimal set of jobs to wait for
|
131 | local jobs=$(soil/worker.sh list-jobs)
|
132 |
|
133 | local -a args=()
|
134 | for job in $jobs; do # relies on word splitting
|
135 |
|
136 | # output each URL in a different file
|
137 | args=( "${args[@]}" -o $dir/$job $url_base/$job )
|
138 | done
|
139 |
|
140 | curl -v ${args[@]}
|
141 |
|
142 | if all-status-zero $dir/*; then
|
143 | fast-forward "$github_token" "$commit_hash" "$to_branch"
|
144 | fi
|
145 | }
|
146 |
|
147 | test-soil-run() {
|
148 | # test with non-master branch
|
149 | # other params have testing defaults
|
150 | soil-run '' '' '' '' dev-andy-3
|
151 | }
|
152 |
|
153 | "$@"
|