@@ -227,4 +227,108 @@ grep -q "^GIT_TERMINAL_PROMPT=0 git -C ${omz_dir} pull --ff-only$" "$CALL_LOG"
227227grep -q " ^GIT_TERMINAL_PROMPT=0 git -C ${omz_dir} /custom/plugins/zsh-autosuggestions pull --ff-only$" " $CALL_LOG "
228228grep -q " ^GIT_TERMINAL_PROMPT=0 git -C ${omz_dir} /custom/themes/powerlevel10k pull --ff-only$" " $CALL_LOG "
229229
230+ echo " Test: self-update accepts checksum paths (dist/updates)"
231+ self_update_home=" ${tmp_dir} /home-self-update"
232+ mkdir -p " $self_update_home "
233+
234+ self_update_bin=" ${tmp_dir} /self-update-bin"
235+ mkdir -p " $self_update_bin "
236+
237+ self_update_fixtures=" ${tmp_dir} /self-update-fixtures"
238+ mkdir -p " $self_update_fixtures "
239+
240+ self_update_old=" ${self_update_bin} /updates"
241+ self_update_new=" ${self_update_fixtures} /updates.new"
242+
243+ mk_versioned_copy () {
244+ local src=" $1 "
245+ local dest=" $2 "
246+ local ver=" $3 "
247+ local tmp=" ${dest} .tmp"
248+
249+ awk -v ver=" $ver " '
250+ BEGIN { done = 0 }
251+ {
252+ if (done == 0 && $0 ~ /^UPDATES_VERSION="/) {
253+ print "UPDATES_VERSION=\"" ver "\""
254+ done = 1
255+ next
256+ }
257+ print
258+ }
259+ ' " $src " > " $tmp "
260+ mv " $tmp " " $dest "
261+ chmod +x " $dest "
262+ }
263+
264+ mk_versioned_copy " $SCRIPT " " $self_update_old " " 0.0.1"
265+ mk_versioned_copy " $SCRIPT " " $self_update_new " " 0.0.2"
266+
267+ sha256_file () {
268+ local f=" $1 "
269+ if command -v sha256sum > /dev/null 2>&1 ; then
270+ sha256sum " $f " | awk ' {print $1}'
271+ return 0
272+ fi
273+ if command -v shasum > /dev/null 2>&1 ; then
274+ shasum -a 256 " $f " | awk ' {print $1}'
275+ return 0
276+ fi
277+ echo " No sha256 tool available (sha256sum/shasum)" >&2
278+ return 1
279+ }
280+
281+ sha=" $( sha256_file " $self_update_new " ) "
282+ printf ' %s dist/updates\n' " $sha " > " ${self_update_fixtures} /SHA256SUMS"
283+
284+ export SELF_UPDATE_FIXTURES=" $self_update_fixtures "
285+ # shellcheck disable=SC2016
286+ write_stub curl '
287+ out=""
288+ url=""
289+ while [ $# -gt 0 ]; do
290+ case "$1" in
291+ -o)
292+ out="${2:-}"
293+ shift 2
294+ ;;
295+ http*://*)
296+ url="$1"
297+ shift
298+ ;;
299+ *)
300+ shift
301+ ;;
302+ esac
303+ done
304+
305+ case "$url" in
306+ */releases/latest)
307+ echo "{\"tag_name\":\"v0.0.2\"}"
308+ ;;
309+ */updates)
310+ cp "${SELF_UPDATE_FIXTURES}/updates.new" "$out"
311+ ;;
312+ */SHA256SUMS)
313+ cp "${SELF_UPDATE_FIXTURES}/SHA256SUMS" "$out"
314+ ;;
315+ *)
316+ echo "curl stub: unexpected url: $url" >&2
317+ exit 1
318+ ;;
319+ esac
320+ '
321+
322+ # Ensure self-update isn't skipped due to our git stub always succeeding.
323+ write_stub git ' exit 1'
324+
325+ out=" $( UPDATES_SELF_UPDATE=1 CI=" " UPDATES_SELF_UPDATE_REPO=fake/repo HOME=" $self_update_home " " $self_update_old " --only brew --no-emoji --no-color 2>&1 ) "
326+ echo " $out " | grep -q ' updates: self-update available (0.0.1 -> 0.0.2)'
327+ echo " $out " | grep -q ' updates: updated to 0.0.2; restarting'
328+
329+ if [ " $( " $self_update_old " --version) " != " 0.0.2" ]; then
330+ echo " Expected self-update to replace the installed script" >&2
331+ exit 1
332+ fi
333+
230334echo " All tests passed."
0 commit comments