OILS / soil / maybe-merge.sh View on Github | oilshell.org

153 lines, 92 significant
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
8set -o nounset
9set -o pipefail
10set -o errexit
11
12source soil/common.sh
13
14fast-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
79test-fast-forward() {
80 fast-forward '' '' dev-andy-3
81}
82
83all-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
99soil-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
147test-soil-run() {
148 # test with non-master branch
149 # other params have testing defaults
150 soil-run '' '' '' '' dev-andy-3
151}
152
153"$@"