pentoo-overlay/scripts/ego_vendor_generator.sh
2022-01-03 12:53:20 +08:00

194 lines
4.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# alternative:
# go mod vendor && grep "# g" ./vendor/modules.txt | sort >
# EGO_VENDOR=(
# )
# inherit golang-vcs-snapshot
# SRC_URI="https://github.com/XXX/archive/v${PV}.tar.gz -> ${P}.tar.gz
# ${EGO_VENDOR_URI}"
TARGET="${1:-go.sum}"
MODULES=()
WHITELIST=(
"github.com"
"bitbucket.org"
)
function in_whitelist() {
local module="${1}"
local state=0
for w in ${WHITELIST[@]}; do
[[ "${module}" == ${w}/* ]] && state=1
done
if [ ${state} -eq 0 ]; then
return 1
fi
}
function parse_gosum() {
local gosum_file="${1}"
local _prefix raw
IFS=$'\n'
for raw in $(cat "${gosum_file}" \
| awk '{pn[FNR]=$1; pv[$1]=$2}
END {
for ( n in pn ) {
if ( pn[n] != f ) {
printf("%s %s\n", pn[n], pv[pn[n]])
f=pn[n]
}
}
}' \
| sed -E "s/[[:space:]](v?([0-9]{1,}\.)?+[0-9]{1,}((\-r|_rc|_beta|_alpha)[0-9]{1,}?)?)[-+\/]/ \1 \2/")
do
module="$(echo ${raw} | cut -d' ' -f1)"
version="$(echo ${raw} | cut -d' ' -f2)"
revision="$(echo ${raw} | cut -d' ' -f3 | sed -E "s/^([a-z0-9.]{1,}-)([a-z0-9]{1,7}).*/\2/")"
if ! in_whitelist "${module}"; then
_prefix="(checkme) "
else
_prefix=""
fi
if ! [[ -z "${module}" ]]; then
[[ "${version}" == *0.0.0 ]] \
&& MODULES+=( "${_prefix}${module} ${revision}" ) \
|| MODULES+=( "${_prefix}${module} ${version}" )
fi
done
}
function parse_gopkglock() {
local pkglock_file="${1}"
local _prefix raw
IFS=$':'
for raw in $(cat "${pkglock_file}" \
| tr -d "[:blank:]\"" \
| awk -F'=' '$1~/^name$/{printf(":%s ",$2)};$1~/^revision$|^version$/{printf("%s ",$2)}')
do
module="$(echo ${raw} | cut -d' ' -f1)"
version="$(echo ${raw} | cut -d' ' -f3)"
revision="$(echo ${raw} | cut -d' ' -f2 | cut -c1-7)"
if ! in_whitelist "${module}"; then
_prefix="(checkme) "
else
_prefix=""
fi
if ! [[ -z "${module}" ]]; then
[[ -z "${version}" ]] \
&& MODULES+=( "${_prefix}${module} ${revision}" ) \
|| MODULES+=( "${_prefix}${module} ${version}" )
fi
done
}
function parse_gopkgtoml() {
local pkgtoml_file="${1}"
local _prefix raw
IFS=$':'
for raw in $(cat "${pkgtoml_file}" \
| tr -d "[:blank:]\"" \
| awk -F'=' '$1~/^name$/{printf(":%s ",$2)};$1~/^revision$|^version$/{printf("%s ",$2)}')
do
module="$(echo ${raw} | cut -d' ' -f1)"
version="$(echo ${raw} | cut -d' ' -f2)"
revision="$(echo ${raw} | cut -d' ' -f3)"
if ! in_whitelist "${module}"; then
_prefix="(checkme) "
else
_prefix=""
fi
if ! [[ -z "${module}" ]]; then
[[ -z "${version}" ]] \
&& MODULES+=( "${_prefix}${module} ${revision}" ) \
|| MODULES+=( "${_prefix}${module} ${version}" )
fi
done
}
function parse_gomod() {
local gomod_file="${1}"
local _prefix raw
IFS=$'\n'
for raw in $(cat "${gomod_file}" \
| awk -v'm=0' '
m==0&&$1" "$2" "$3~/^require \"?(.*) (.*)\"?/&&$1" "$2!~/^require \($/ { m=1 }
m==0&&$1" "$2~/^require \($/ { strl=FNR; m=2 }
m==2&&$1~/^\)$/ { endl=FNR }
m==1&&$1~/^require$/&&$2!="" { pn[FNR]=$2; pv[$2]=$3 }
m==2 { pn[FNR]=$1; pv[$1]=$2 }
END {
switch (m) {
case 1:
for (n in pn)
printf("%s %s\n", pn[n], pv[pn[n]])
break
case 2:
for (n in pn) {
if (n > strl) {
printf("%s %s\n", pn[n], pv[pn[n]])
if (n < endl) break
}
}
break
}
}' \
| sed -E "s/^[[:blank:]]\"?//;s/[[:space:]](v?([0-9]{1,}\.)?+[0-9]{1,}((\-r|_rc|_beta|_alpha)[0-9]{1,}?)?)[-+\/]/ \1 \2/")
do
module="$(echo ${raw} | cut -d' ' -f1)"
version="$(echo ${raw} | cut -d' ' -f2)"
revision="$(echo ${raw} | cut -d' ' -f3 | sed -E "s/^([a-z0-9.]{1,}-)([a-z0-9]{1,7}).*/\2/")"
if ! in_whitelist "${module}"; then
_prefix="(checkme) "
else
_prefix=""
fi
if ! [[ -z "${module}" ]]; then
[[ "${version}" == *0.0.0 ]] \
&& MODULES+=( "${_prefix}${module} ${revision}" ) \
|| MODULES+=( "${_prefix}${module} ${version}" )
fi
done
}
#function parse_golist() {
# :
#}
#
#function merge() {
# #sort -k1 -k2 -V -r
# :
#}
if ! [ -f "${TARGET}" ]; then
echo "${TARGET} — is not found!"
exit 1
fi
case "$(basename "${TARGET}")" in
*.sum) parse_gosum "${TARGET}";;
*.lock) parse_gopkglock "${TARGET}";;
*.toml) parse_gopkgtoml "${TARGET}";;
# *.list) parse_golist "${TARGET}";;
*.mod) parse_gomod "${TARGET}";;
esac
echo -e "EGO_VENDOR=("
for mod in ${MODULES[@]}; do
echo -e "\t\"${mod}\""
done
echo -e ")"