e2aed73d91
All platform independent packages affected by this issue. Results in persistent apt error like: Writing more data than expected (22610650 > 22610408) Hashes of expected file: - SHA256:08abc5cffb9e1967fab487a471bb547f5ae706c48bf8e59d1443b2ad4af9caaf - SHA1:36ded1e207135bdeb8b7301bc03309ebced3cd32 [weak] - Filesize:22610408 [weak]
143 lines
4.1 KiB
Bash
Executable File
143 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
##
|
|
## Determine modified packages and build/upload them.
|
|
##
|
|
|
|
set -e
|
|
|
|
###############################################################################
|
|
##
|
|
## Preparation.
|
|
##
|
|
###############################################################################
|
|
|
|
REPO_DIR=$(realpath "$(dirname "$(realpath "$0")")/../../../")
|
|
cd "$REPO_DIR" || {
|
|
echo "[!] Failed to cd into '$REPO_DIR'."
|
|
exit 1
|
|
}
|
|
|
|
DO_UPLOAD=false
|
|
if [ $# -ge 1 ]; then
|
|
if [ "$1" = "--upload" ]; then
|
|
DO_UPLOAD=true
|
|
fi
|
|
fi
|
|
|
|
###############################################################################
|
|
##
|
|
## Determining changes.
|
|
##
|
|
###############################################################################
|
|
|
|
set +e
|
|
|
|
# Some environment variables are important for correct functionality
|
|
# of this script.
|
|
if [ -z "$CIRRUS_CHANGE_IN_REPO" ]; then
|
|
echo "[!] CIRRUS_CHANGE_IN_REPO is not set."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$CIRRUS_PR" ] && [ -z "$CIRRUS_BASE_SHA" ]; then
|
|
echo "[!] CIRRUS_BASE_SHA is not set."
|
|
exit 1
|
|
fi
|
|
|
|
# Process tag '%ci:no-build' that may be added as line to commit message.
|
|
# Will force CI to exit with status 'passed' without performing build.
|
|
if grep -qiP '^\s*%ci:no-build\s*$' <(git log --format="%B" -n 1 "$CIRRUS_CHANGE_IN_REPO"); then
|
|
echo "[!] Exiting with status 'passed' (tag '%ci:no-build' applied)."
|
|
exit 0
|
|
fi
|
|
|
|
# Process tag '%ci:reset-backlog' that may be added as line to commit message.
|
|
# Will force CI to build changes only for the current commit.
|
|
if grep -qiP '^\s*%ci:reset-backlog\s*$' <(git log --format="%B" -n 1 "$CIRRUS_CHANGE_IN_REPO"); then
|
|
echo "[!] Building only last pushed commit (tag '%ci:reset-backlog' applied)."
|
|
unset CIRRUS_LAST_GREEN_CHANGE
|
|
unset CIRRUS_BASE_SHA
|
|
fi
|
|
|
|
if [ -z "$CIRRUS_PR" ]; then
|
|
if [ -z "$CIRRUS_LAST_GREEN_CHANGE" ]; then
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "$CIRRUS_CHANGE_IN_REPO" 2>/dev/null | grep -P "packages/")
|
|
else
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "${CIRRUS_LAST_GREEN_CHANGE}..${CIRRUS_CHANGE_IN_REPO}" 2>/dev/null | grep -P "packages/")
|
|
fi
|
|
else
|
|
# Pull requests are handled in a bit different way.
|
|
UPDATED_FILES=$(git diff-tree --no-commit-id --name-only -r "${CIRRUS_BASE_SHA}..${CIRRUS_CHANGE_IN_REPO}" 2>/dev/null | grep -P "packages/")
|
|
fi
|
|
|
|
## Determine modified packages.
|
|
existing_dirs=""
|
|
for dir in $(echo "$UPDATED_FILES" | grep -oP "packages/[a-z0-9+._-]+" | sort | uniq); do
|
|
if [ -d "${REPO_DIR}/${dir}" ]; then
|
|
existing_dirs+=" $dir"
|
|
fi
|
|
done
|
|
PACKAGE_DIRS="$existing_dirs"
|
|
unset dir existing_dirs
|
|
|
|
## Get names of modified packages.
|
|
PACKAGE_NAMES=$(echo "$PACKAGE_DIRS" | sed 's/packages\///g')
|
|
if [ -z "$PACKAGE_NAMES" ]; then
|
|
echo "[*] No modified packages found." >&2
|
|
exit 0
|
|
fi
|
|
|
|
|
|
## Some packages should be excluded from auto builds.
|
|
EXCLUDED_PACKAGES="rust texlive"
|
|
|
|
for excluded_pkg in $EXCLUDED_PACKAGES; do
|
|
PACKAGE_NAMES=$(echo "$PACKAGE_NAMES" | sed "s/\<${excluded_pkg}\>//g")
|
|
done
|
|
unset excluded_pkg
|
|
|
|
set -e
|
|
|
|
###############################################################################
|
|
##
|
|
## Building packages.
|
|
##
|
|
###############################################################################
|
|
|
|
if ! $DO_UPLOAD; then
|
|
echo "[*] Building packages: $PACKAGE_NAMES"
|
|
if [ -n "$CIRRUS_PR" ]; then
|
|
echo "[*] Pull request: https://github.com/termux/termux-packages/pull/${CIRRUS_PR}"
|
|
else
|
|
if [ -n "$CIRRUS_LAST_GREEN_CHANGE" ]; then
|
|
echo "[*] Changes: ${CIRRUS_LAST_GREEN_CHANGE}..${CIRRUS_CHANGE_IN_REPO}"
|
|
else
|
|
echo "[*] Changes: ${CIRRUS_CHANGE_IN_REPO}"
|
|
fi
|
|
fi
|
|
|
|
./build-package.sh -a "$TERMUX_ARCH" -I $PACKAGE_NAMES
|
|
else
|
|
# Workaround for concurrent uploads.
|
|
UPLOAD_DELAY=$((30 + RANDOM % 120))
|
|
echo "[!] Using workaround for Bintray issue with concurrent uploads."
|
|
echo "[!] Delaying upload by ${UPLOAD_DELAY} seconds."
|
|
sleep $UPLOAD_DELAY
|
|
unset UPLOAD_DELAY
|
|
|
|
for attempt in 1 2 3; do
|
|
echo "[*] Uploading packages to Bintray:"
|
|
if ./scripts/package_uploader.sh -p "${PWD}/debs" $PACKAGE_NAMES; then
|
|
break
|
|
else
|
|
if [ "$attempt" = "3" ]; then
|
|
echo "[!] Went through 3 attempts of upload, giving up..."
|
|
exit 1
|
|
else
|
|
echo "[!] Failure, retrying in 30 seconds..."
|
|
sleep 30
|
|
fi
|
|
fi
|
|
done
|
|
fi
|