Skip to content

Instantly share code, notes, and snippets.

@ernstki
Last active January 14, 2025 13:30
Show Gist options
  • Save ernstki/7dbb17c42911708660dc3c4eee3c1002 to your computer and use it in GitHub Desktop.
Save ernstki/7dbb17c42911708660dc3c4eee3c1002 to your computer and use it in GitHub Desktop.
Test multiple versions of Package X against multiple versions of Package Y
##
## Test multiple versions of delta[1] against multiple versions of bat[2]
## and stop when there's a failure
##
## Tested with GNU Make 4.x on Linux; YMMV with macOS or BSD
##
## Author: Kevin Ernst <ernstki -at- mail.uc.edu>
## Source: https://gist.github.com/ernstki/7dbb17c42911708660dc3c4eee3c1002
## License: released to the public domain
##
## [1]: https://github.com/dandavison/delta
## [2]: https://github.com/sharkdp/bat
##
JQ = jq -r
CURL = curl -sf
WGET = wget --continue --quiet
API = https://api.github.com
SHELL = bash
ARCH = x86_64-unknown-linux-musl
MAKEFLAGS = --no-print-directory
RESET := $(shell tput sgr0)
HEAD := $(shell tput sgr 0 1; tput bold)
DIM := $(shell tput dim)
PASS := $(shell tput setaf 2)OK$(RESET)
FAIL := $(shell tput setaf 1)FAIL$(RESET)
test: delta.versions
@while read deltaver; do \
echo -e "\n$(HEAD)delta $$deltaver$(RESET)" >&2; \
if ! $(MAKE) --question deltas/$$deltaver/delta; then \
$(MAKE) deltas/$$deltaver/delta || exit 1; \
fi; \
$(MAKE) test-bat DELTAVER=$$deltaver; \
done < $<
test-bat: bat.versions
@while read batver; do \
if ! $(MAKE) --question bats/$$batver/bat; then \
$(MAKE) bats/$$batver/bat || exit 1; \
fi; \
$(MAKE) results/$(DELTAVER)/$$batver || exit 1; \
done < $<
results/%:
@IFS=/ read deltaver batver <<<"$*"; \
mkdir -p results/$$deltaver || exit 1; \
printf " with %-24s" "$$( bats/$$batver/bat --version )" >&2; \
bats/$$batver/bat cache --clear &>/dev/null || exit; \
bats/$$batver/bat cache --build &>/dev/null || exit; \
if $$( deltas/$$deltaver/delta --version &>/dev/null ); then \
echo $(PASS) | tee $@; \
bats/$$batver/bat cache --clear &>/dev/null; \
else \
echo $(FAIL) | tee $@; \
bats/$$batver/bat cache --clear &>/dev/null; \
exit 1; \
fi; \
bat.versions: bat.releases.json
@$(JQ) '.[].name' $< > $@
bat.releases.json:
@$(CURL) $(API)/repos/sharkdp/bat/releases > $@
bats/%/bat: bats/bat-%-$(ARCH).tar.gz
@mkdir -p bats/$*
@tar xf $< -C bats/$* --wildcards --strip-components=1 --touch "*/bat"
bats/bat-%-$(ARCH).tar.gz:
@tarball=$$( $(tarball_for) $* bat.releases.json); \
echo "$(DIM)» downloading release tarball for bat $*…$(RESET)" >&2; \
$(WGET) --directory-prefix=bats $$tarball
delta.versions: delta.releases.json
@$(JQ) '.[].name' $< > $@
delta.releases.json:
@$(CURL) $(API)/repos/dandavison/delta/releases > $@
deltas/%/delta: deltas/delta-%-$(ARCH).tar.gz
@mkdir -p deltas/$*
@tar xf $< -C deltas/$* --wildcards --strip-components=1 --touch "*/delta"
deltas/delta-%-$(ARCH).tar.gz:
@tarball=$$( $(tarball_for) $* delta.releases.json); \
echo "$(DIM)» downloading release tarball for delta $*…$(RESET)" >&2; \
$(WGET) --directory-prefix=deltas $$tarball
# don't delete tarballs, even if interrupted
# why not .SECONDARY? see https://stackoverflow.com/a/27092184
.PRECIOUS: bats/bat-%-$(ARCH).tar.gz deltas/delta-%-$(ARCH).tar.gz
clean:
-bats/$$(head -1 bat.versions)/bat cache --clear >/dev/null
-rm -rf bats/v*
-rm -rf deltas/[0-9]*
-rm -rf results
reallyclean: clean
-rm -rf bats deltas {bat,delta}.versions {bat,delta}.releases.json
define tarball_for
$(JQ) '.[] | select(.name==$$release) | .assets[] \
| .browser_download_url | select(test(".*$(ARCH).tar.gz"))' \
--arg release
endef
# vim: sw=4 ts=4
##
## Test a single version of delta[1] against multiple versions of bat[2]
## and stop when there's a failure
##
## Tested with GNU Make 4.x on Linux; YMMV on macOS or BSD
##
## Author: Kevin Ernst <ernstki -at- mail.uc.edu>
## Source: https://gist.github.com/ernstki/7dbb17c42911708660dc3c4eee3c1002
## License: released to the public domain
##
## [1]: https://github.com/dandavison/delta
## [2]: https://github.com/sharkdp/bat
##
JQ = jq -r
CURL = curl -sf
API = https://api.github.com
ARCH = x86_64-unknown-linux-gnu
MAKEFLAGS = --no-print-directory
RESET := $(shell tput sgr0)
HEAD := $(shell tput sgr 0 1; tput bold)
DIM := $(shell tput dim)
PASS := $(shell tput setaf 2)OK$(RESET)
FAIL := $(shell tput setaf 1)FAIL$(RESET)
test: versions
@echo >&2; \
echo "$(HEAD)Testing $$(delta --version) against…$(RESET)" >&2
@while read release; do \
if ! $(MAKE) --question bats/$$release/bat; then \
$(MAKE) bats/$$release/bat || exit 1; \
fi; \
printf " %-22s" "$$( bats/$$release/bat --version )" >&2; \
$(MAKE) results/$$release || exit 1; \
done < $<
results/%: bats/%/bat
@mkdir -p results
@bats/$*/bat cache --clear >/dev/null
@bats/$*/bat cache --build >/dev/null
@if delta --version >/dev/null; then \
echo $(PASS) | tee $@; \
else \
echo $(FAIL) | tee $@; \
exit 1; \
fi; \
versions: releases.json
@$(JQ) '.[].name' $< > $@
releases.json:
@$(CURL) $(API)/repos/sharkdp/bat/releases > $@
bats/%/bat: bats/bat-%-$(ARCH).tar.gz
@mkdir -p bats/$*
@tar xf $< -C bats/$* --wildcards --strip-components=1 --touch "*/bat"
define tarball_for
< releases.json \
$(JQ) '.[] | select(.name==$$release) | .assets[] \
| .browser_download_url | select(test(".*$(ARCH).tar.gz"))' \
--arg release
endef
.PRECIOUS: bats/bat-%-$(ARCH).tar.gz
bats/bat-%-$(ARCH).tar.gz:
@echo "$(DIM)» downloading release tarball for $*…$(RESET)" >&2
@wget --continue --quiet --directory-prefix=bats \
$$($(tarball_for) $*)
clean:
-bats/$$(head -1 versions)/bat cache --clear >/dev/null
-rm -rf bats/v*
-rm -rf results/v*
reallyclean: clean
-rm -rf bats versions releases.json
# vim: ft=make sw=4 ts=4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment