Skip to content

Commit 00d41a4

Browse files
authored
Add support for BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC use (#32)
Currently the plugin doesn't support `BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC`, which means that the use of that feature will be ignored due to the plugin's checkout hook being used. This adds support to the plugin where that flag is in use, but falls back to existing function when it isn't.
1 parent 5e807f6 commit 00d41a4

2 files changed

Lines changed: 103 additions & 4 deletions

File tree

hooks/checkout

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,24 @@ fi
9898

9999
FETCH_FLAGS+=(--depth 1 origin)
100100

101-
if [[ ${BUILDKITE_COMMIT} = "HEAD" ]]; then
101+
# Determine if we should use the pull request merge refspec
102+
USE_MERGE_REFSPEC="false"
103+
if [[ "${BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC:-false}" = "true" ]] \
104+
&& [[ -n "${BUILDKITE_PULL_REQUEST:-}" ]] \
105+
&& [[ "${BUILDKITE_PULL_REQUEST}" != "false" ]]; then
106+
USE_MERGE_REFSPEC="true"
107+
FETCH_FLAGS+=("refs/pull/${BUILDKITE_PULL_REQUEST}/merge")
108+
elif [[ ${BUILDKITE_COMMIT} = "HEAD" ]]; then
102109
FETCH_FLAGS+=("${BUILDKITE_BRANCH}")
103110
else
104111
FETCH_FLAGS+=("${BUILDKITE_COMMIT}")
105112
fi
106113

107-
log_info "Fetching ${BUILDKITE_COMMIT} from origin"
114+
if [[ "${USE_MERGE_REFSPEC}" = "true" ]]; then
115+
log_info "Fetching merge ref for PR #${BUILDKITE_PULL_REQUEST} from origin"
116+
else
117+
log_info "Fetching ${BUILDKITE_COMMIT} from origin"
118+
fi
108119
if ! git fetch "${FETCH_FLAGS[@]}"; then
109120
log_error "Failed to fetch ${BUILDKITE_COMMIT} from origin"
110121
exit 1
@@ -117,8 +128,12 @@ if ! git sparse-checkout set ${NO_CONE_PARAM:+--no-cone} "${CHECKOUT_PATHS[@]}";
117128
exit 1
118129
fi
119130

120-
log_info "Checking out ${BUILDKITE_COMMIT}"
121-
if [[ ${BUILDKITE_COMMIT} = "HEAD" ]]; then
131+
if [[ "${USE_MERGE_REFSPEC}" = "true" ]]; then
132+
log_info "Checking out merge ref for PR #${BUILDKITE_PULL_REQUEST}"
133+
else
134+
log_info "Checking out ${BUILDKITE_COMMIT}"
135+
fi
136+
if [[ "${USE_MERGE_REFSPEC}" = "true" ]] || [[ ${BUILDKITE_COMMIT} = "HEAD" ]]; then
122137
if ! git checkout FETCH_HEAD; then
123138
log_error "Failed to checkout FETCH_HEAD"
124139
exit 1

tests/checkout.bats

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,90 @@ setup() {
143143
unstub git
144144
}
145145

146+
@test "Fetches pull request merge refspec when BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC is true" {
147+
export BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC="true"
148+
export BUILDKITE_PULL_REQUEST="123"
149+
export BUILDKITE_COMMIT="HEAD"
150+
151+
stub ssh-keyscan "* : echo 'keyscan'"
152+
stub git "clean * : echo 'git clean'"
153+
stub git "fetch --depth 1 origin refs/pull/123/merge : echo 'git fetch merge refspec'"
154+
stub git "sparse-checkout set * * : echo 'git sparse-checkout'"
155+
stub git "checkout FETCH_HEAD : echo 'checkout fetch_head'"
156+
157+
run "$PWD"/hooks/checkout
158+
159+
assert_success
160+
assert_output --partial 'git fetch merge refspec'
161+
assert_output --partial 'checkout fetch_head'
162+
163+
unstub ssh-keyscan
164+
unstub git
165+
}
166+
167+
@test "Fetches pull request merge refspec with known commit" {
168+
export BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC="true"
169+
export BUILDKITE_PULL_REQUEST="456"
170+
export BUILDKITE_COMMIT="abc123"
171+
172+
stub ssh-keyscan "* : echo 'keyscan'"
173+
stub git "clean * : echo 'git clean'"
174+
stub git "fetch --depth 1 origin refs/pull/456/merge : echo 'git fetch merge refspec'"
175+
stub git "sparse-checkout set * * : echo 'git sparse-checkout'"
176+
stub git "checkout FETCH_HEAD : echo 'checkout fetch_head'"
177+
178+
run "$PWD"/hooks/checkout
179+
180+
assert_success
181+
assert_output --partial 'git fetch merge refspec'
182+
assert_output --partial 'checkout fetch_head'
183+
184+
unstub ssh-keyscan
185+
unstub git
186+
}
187+
188+
@test "Does not use merge refspec when BUILDKITE_PULL_REQUEST is false" {
189+
export BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC="true"
190+
export BUILDKITE_PULL_REQUEST="false"
191+
export BUILDKITE_COMMIT="abc123"
192+
193+
stub ssh-keyscan "* : echo 'keyscan'"
194+
stub git "clean * : echo 'git clean'"
195+
stub git "fetch --depth 1 origin abc123 : echo 'git fetch commit'"
196+
stub git "sparse-checkout set * * : echo 'git sparse-checkout'"
197+
stub git "checkout abc123 : echo 'checkout commit'"
198+
199+
run "$PWD"/hooks/checkout
200+
201+
assert_success
202+
assert_output --partial 'git fetch commit'
203+
assert_output --partial 'checkout commit'
204+
205+
unstub ssh-keyscan
206+
unstub git
207+
}
208+
209+
@test "Does not use merge refspec when flag is not set" {
210+
export BUILDKITE_PULL_REQUEST="123"
211+
export BUILDKITE_COMMIT="abc123"
212+
unset BUILDKITE_PULL_REQUEST_USING_MERGE_REFSPEC
213+
214+
stub ssh-keyscan "* : echo 'keyscan'"
215+
stub git "clean * : echo 'git clean'"
216+
stub git "fetch --depth 1 origin abc123 : echo 'git fetch commit'"
217+
stub git "sparse-checkout set * * : echo 'git sparse-checkout'"
218+
stub git "checkout abc123 : echo 'checkout commit'"
219+
220+
run "$PWD"/hooks/checkout
221+
222+
assert_success
223+
assert_output --partial 'git fetch commit'
224+
assert_output --partial 'checkout commit'
225+
226+
unstub ssh-keyscan
227+
unstub git
228+
}
229+
146230
@test "Clean checkout handles repository without HEAD gracefully" {
147231
export BUILDKITE_PLUGIN_SPARSE_CHECKOUT_CLEAN_CHECKOUT="true"
148232

0 commit comments

Comments
 (0)