Branch :
#!/bin/sh
set -e -o pipefail
# shpkg
: ${SHPKG_DIR:=~/shpkg}
. "${SHPKG_DIR}/etc/shpkg/profile"
. "${SHPKG_DIR}/share/shpkg/shpkg.subr"
verbose 2 shpkg_config
verbose 2 shpkg_lock shpkg_ci_mux.lock
# Configuration
: ${SHPKG_CI_DIR:=${SHPKG_DIR}/ci}
shpkg_ci_remote () {
if [ "x$2" == "x--clean" ]; then
verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2"
rm -rf "${SHPKG_CI_DIR}"
elif [ "x$2" != "x--upgrade" ]; then
verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2"
else
verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2" |
grep '^shpkg_ci_changed_file ' |
cut -d ' ' -f 2 |
while read F; do
D="${SHPKG_CI_DIR}/$(dirname "$F")"
mkdir -p "$D"
verbose 1 rsync "$1":shpkg/ci/"$F" "$D/"
done
fi
}
shpkg_ci_status2png () {
for F in "${SHPKG_CI_DIR}/status"/*.status; do
STATUS="$(cat "$F")"
I="${SHPKG_CI_DIR}/log/$(basename "$F" .status).png"
if ! [ -f "$I" ] ||
[ "$F" -nt "$I" ]; then
verbose 1 cp "${SHPKG_DIR}/share/shpkg/img/status_${STATUS}.64.png" "$I"
fi
done
}
usage () {
echo "Usage: $0 [OPTION] PKG REMOTE1 REMOTE2 ..."
echo "Options :"
echo " --no-remote Do not run remote commands, only mux files."
echo " --upgrade Upgrade."
echo " --clean Remove CI files."
exit $1
}
main () {
if [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then
usage 0
fi
SHPKG_REPO="$1"
shift
if [ "x${SHPKG_REPO}" != "x--no-remote" ]; then
for SHPKG_CI_MUX_HOST; do
verbose 2 shpkg_ci_remote "${SHPKG_CI_MUX_HOST}" "${SHPKG_REPO}" &
done
wait
if [ "x${SHPKG_REPO}" == "x--upgrade" ]; then
verbose 2 shpkg_upgrade
exit
fi
if [ "x${SHPKG_REPO}" == "x--clean" ]; then
exit
fi
fi
( cd "${SHPKG_CI_DIR}/status" &&
for I in $(ls */*/*.status | cut -d / -f 3 | sort -u); do
{
if grep -q running */*/"$I"; then
echo running
elif grep -q ko */*/"$I"; then
echo ko
else
echo ok
fi
} > "${SHPKG_CI_DIR}/status/$I"
done; )
( cd "${SHPKG_CI_DIR}/log" &&
for I in $(ls */*/*.log | cut -d / -f 3 | sort -u); do
TITLE="$I"
STATUS="$(cat "${SHPKG_CI_DIR}/status/$(basename "$I" .log).status" || echo unknown)"
IMG="$(basename "$I" .log).png"
{
cat <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>${TITLE}</title>
<link rel="stylesheet" href="/_assets/app.css">
<script defer type="text/javascript" src="/_assets/app.js"></script>
<link rel="icon" type="image/png" sizes="64x64" href="${IMG}">
</head>
<body>
<div class="ci-header">
<a href="./"><i class="fas fa-asterisk"></i> All logs</a>
</div>
<p>
<h1>
<img src="${IMG}" class="status-${STATUS}"/>
${TITLE}
</h1>
<ul class="list-group">
EOF
for F in */*/"$I"; do
F_STATUS="$(cat "${SHPKG_CI_DIR}/status/$(echo "$F" | sed -e 's/[.]log$/.status/')" || echo unknown)"
F_IMG="$(echo "$F" | sed -e 's/[.]log$/.png/')"
cat <<EOF
<li class="list-group-item">
<a href="$F.html">
<img src="${F_IMG}" class="status-${F_STATUS}"/>
$F.html
</a>
</li>
EOF
done
cat <<EOF
</ul>
</p>
</body>
</html>
EOF
} > "${SHPKG_CI_DIR}/log/$I.html"
done; )
verbose 2 shpkg_ci_status2png
}
shpkg_log shpkg_ci_mux main "$@"