debian-packages/script/build.sh

197 lines
6.1 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
function msg_info {
(( QUIET )) && return
local mesg="$1" ; shift
printf "INFO: $mesg\n" "$@"
}
function msg_warn {
(( QUIET )) && return
local mesg="$1" ; shift
printf "WARN: $mesg\n" "$@"
}
function usage {
echo "$_PROGRAM_NAME:"
echo " --package <dir-name> Add a dir to build, can be used multi times"
echo " --package-dir <dir> All dir in this directory is a package,"
echo " can use multi times"
echo " --makedeb-path <path> Specify the path of makedeb"
echo " --no-upload Don't upload built packages to webdav"
echo " --webdav-url https://webdav_host/path/dir"
echo " Upload built file to a webdav server"
echo " --webdav-user <username> Username of webdav server (if required)"
echo " --webdav-pass <password> Password of webdav server (if required)"
echo ' --package-exists-hook "/path/to/hook --args {}"'
echo " This program will run the hook to check"
echo " if specific file already built, the {} will"
echo " be replaced with the final package name,"
echo " exit with 0 means package exists"
}
function upload_to_webdav {
local file="$1"
local webdav_path="$2"
local webdav_user="$3"
local webdav_pass="$4"
if [[ -z "$webdav_user" || -z "$webdav_pass" ]] ; then
curl --show-error --silent \
--upload-file "$file" "${webdav_path}/$file"
else
curl --show-error --silent --user "${webdav_user}:${webdav_pass}" \
--upload-file "$file" "${webdav_path}/$file"
fi
}
function run_hook {
local exe_str="$1"
local place_holder="$2"
local package_name="$3"
local log_exe_str="${4-}"
local final_exe_str="${exe_str/$place_holder/$package_name}"
if [[ -n "${log_exe_str}" ]] ; then
msg_info "Running: $final_exe_str"
fi
$final_exe_str
}
shopt -s nullglob
set -o functrace
set -o nounset
set -o errexit
set -o errtrace
_DELIMITER="================================================================"
_PROGRAM_NAME="$0"
_PACKGES_TO_BUILD=()
MAKEDEB_PATH=""
UPLOAD_TO_WEBDAV=1
WEBDAV_URL=""
WEBDAV_USER=""
WEBDAV_PASS=""
PACKAGE_DIR=()
PACKAGE_EXISTS_HOOK=""
QUIET=0
while (( "$#" >= 1 )); do
case "$1" in
--package) _PACKGES_TO_BUILD+=("$2") ; shift ;;
--package-dir) PACKAGE_DIR+=("$2") ; shift ;;
--makedeb-path) MAKEDEB_PATH="$2" ; shift ;;
--no-upload) UPLOAD_TO_WEBDAV=0 ;;
--webdav-url) WEBDAV_URL="$2" ; shift ;;
--webdav-user) WEBDAV_USER="$2" ; shift ;;
--webdav-pass) WEBDAV_PASS="$2" ; shift ;;
--package-exists-hook)
PACKAGE_EXISTS_HOOK="$2"
# strip white space, see https://stackoverflow.com/a/3352015
PACKAGE_EXISTS_HOOK="${PACKAGE_EXISTS_HOOK#"${PACKAGE_EXISTS_HOOK%%[![:space:]]*}"}"
PACKAGE_EXISTS_HOOK="${PACKAGE_EXISTS_HOOK%"${PACKAGE_EXISTS_HOOK##*[![:space:]]}"}"
shift ;;
--)
shift
MAKEDEB_ARGS=("$@")
while (( "$#" > 1 )) ; do # leave one arg for shift command at the end of while loop
shift
done
;;
-h|--help) usage ; exit 0 ;;
*) echo "Unkown option $1"
echo "Use $0 --help for help"
exit 1 ;;
esac
shift
done
if [[ -z "${MAKEDEB_PATH}" ]] ; then
MAKEDEB_PATH="${MAKEDEB_PATH:-"$(which makedeb)"}"
else
MAKEDEB_PATH="$(realpath "$MAKEDEB_PATH")"
fi
if [[ -n "${PACKAGE_DIR-}" && "${#PACKAGE_DIR}" -gt 0 ]] ; then
for p in "${PACKAGE_DIR[@]}" ; do
for f in "$p"/* ; do
_PACKGES_TO_BUILD+=("$f")
done
done
fi
for package in "${_PACKGES_TO_BUILD[@]}" ; do
msg_info "Package to be built: $package"
done
if [[ "${#_PACKGES_TO_BUILD[@]}" -eq 0 ]] ; then
msg_info "No package to build, exiting..."
fi
if [[ -n "$PACKAGE_EXISTS_HOOK" ]] ; then
msg_info "hook for checking if package exists: $PACKAGE_EXISTS_HOOK"
fi
for package in "${_PACKGES_TO_BUILD[@]}" ; do
(
msg_info "$_DELIMITER"
msg_info "Start for $package"
cd "$package"
function retrieve_source {
"$MAKEDEB_PATH" --nobuild "${MAKEDEB_ARGS[@]}" && ret=$? || ret=$?
if [[ $ret -ne 0 ]] ; then
msg_warn "Error occurred when running makedeb, skip this package"
exit 4
fi
}
function is_dynamic_pkgver {
"$MAKEDEB_PATH" --is-dynamic-pkgver "${MAKEDEB_ARGS[@]}"
}
package_name=""
source_ready=0
if [[ -n "${PACKAGE_EXISTS_HOOK}" ]] ; then
if is_dynamic_pkgver ; then
retrieve_source
source_ready=1
fi
package_name="$("$MAKEDEB_PATH" --packagelist "${MAKEDEB_ARGS[@]}")"
msg_info "Checking if package $package_name exists..."
run_hook "$PACKAGE_EXISTS_HOOK" "{}" "$package_name" log_exe_str && ret="$?" || ret="$?"
if [[ $ret -eq 0 ]] ; then
msg_info "Package ${package_name} already built, skip"
exit 0
fi
fi
if (( ! source_ready )) ; then
retrieve_source
fi
if [[ -z "$package_name" ]] ; then
package_name="$("$MAKEDEB_PATH" --packagelist "${MAKEDEB_ARGS[@]}")"
fi
msg_info "Start building..."
"$MAKEDEB_PATH" --noextract "${MAKEDEB_ARGS[@]}" && ret=$? || ret=$?
if [[ $ret -ne 0 ]] ; then
msg_warn "Error occurred when running makedeb, skip this package"
exit 4
fi
if [[ -n "${WEBDAV_URL}" ]] && (( UPLOAD_TO_WEBDAV )) ; then
msg_info "Uploading $package_name to $WEBDAV_URL"
upload_to_webdav "$package_name" "$WEBDAV_URL" "$WEBDAV_USER" "$WEBDAV_PASS"
fi
) || true
done