You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.4 KiB
69 lines
1.4 KiB
#!/bin/sh
|
|
|
|
set -eu
|
|
|
|
unset -v progname progdir
|
|
progname="${0##*/}"
|
|
case "${0}" in
|
|
*/*) progdir="${0%/*}";;
|
|
*) progdir=.;;
|
|
esac
|
|
|
|
unset -v tmpdir
|
|
sigs="0 1 2 15" # EXIT HUP INT TERM
|
|
trapfunc() {
|
|
case "${tmpdir-}" in ?*) rm -rf "${tmpdir}";; esac
|
|
trap -- ${sigs}
|
|
case "${1}" in 0|EXIT) ;; *) kill "-${1}" "$$";; esac
|
|
}
|
|
unset -v sig; for sig in ${sigs}; do trap "trapfunc ${sig}" "${sig}"; done
|
|
tmpdir=$(mktemp -d)
|
|
|
|
unset -v jq
|
|
jq=$(which jq) || { echo "${progname}: jq not found" >&2; exit 69; }
|
|
|
|
cd "${progdir}"
|
|
while [ ! -f go.mod ]
|
|
do
|
|
case "$(pwd)" in
|
|
/) echo "${progname}: go.mod not found" >&2; exit 69;;
|
|
esac
|
|
cd ..
|
|
done
|
|
|
|
go mod edit -json | \
|
|
"${jq}" -r '.Require[] | .Path + "@" + .Version' \
|
|
> "${tmpdir}/gomod.txt"
|
|
|
|
ok=true
|
|
unset -v pkg
|
|
for pkg
|
|
do
|
|
unset -v best_path best_version path version
|
|
while IFS=@ read -r path version
|
|
do
|
|
# Is requested package at or under this path? Skip if not.
|
|
case "${pkg}" in
|
|
"${path}"|"${path}"/*) ;;
|
|
*) continue;;
|
|
esac
|
|
: ${best_path="${path}"}
|
|
: ${best_version="${version}"}
|
|
# Is this path more specific than the current best?
|
|
case "${path}" in
|
|
"${best_path}"/*)
|
|
best_path="${path}"
|
|
best_version="${version}"
|
|
esac
|
|
done < "${tmpdir}/gomod.txt"
|
|
case "${best_path-}" in
|
|
"")
|
|
echo "${progname}: no module provides package ${pkg}" >&2
|
|
ok=false
|
|
continue
|
|
;;
|
|
esac
|
|
echo "${progname}: ${pkg} is provided by ${best_path}@${best_version}"
|
|
go get "${pkg}@${best_version}"
|
|
done
|
|
"${ok}" && exit 0 || exit 1
|
|
|