#!/bin/sh # vim: set ts=4: set -eu . "$(dirname "$0")"/common.sh # Prints names of repositories (top-level directories), in defined order, # that has been changed/created in the specified revisions. changed_repos() { local commit_ish="$1" local repo; for repo in main community testing non-free unmaintained; do git diff-tree --exit-code "$commit_ish" -- $repo >/dev/null \ || echo "$repo" done } # Prints names of repo's subdirs (i.e. abuilds) that contains APKBUILDs which # has been changed/created in the specified revisions. The abuild names are # printed in a build order. changed_abuilds() { local repo="$1" local commit_ish="$2" # Get names of repo's subdirectories with modified APKBUILD, # but ignore deleted ones. local aports="$(git diff-tree -r --relative="$repo" --name-only --diff-filter=ACMR \ "$commit_ish" -- '*APKBUILD' | xargs -I% dirname % | xargs)" # Sort abuilds by build order. ap builddirs -d "$(pwd)/$repo" $aports 2>/dev/null | xargs -I% basename % } # Replaces /etc/apk/repositories with repositories at $MIRROR_URI that are on # the same or higher level than the given repo (main > community > testing) # and after that runs `apk update`. # # $1: the target repository; main, community, or testing set_repositories_for() { local target_repo="$1" local repos='' local repo; for repo in main community testing; do repos="$repos $MIRROR_URI/$repo" [ "$repo" = "$target_repo" ] && break done sudo sh -c "printf '%s\n' $repos > /etc/apk/repositories" sudo apk update } cd "$CLONE_DIR" # Workarounds for oddities of TRAVIS_COMMIT_RANGE that: # - may be empty when pushing single commit, # - uses triple-dot range instead of double-dot that we need, # - contains SHA of old (unreachable) commit when rebasing. commit_range="$(echo "${TRAVIS_COMMIT_RANGE:-}" | sed -E 's/\.{3}/../')" if ! git rev-parse "$commit_range" >/dev/null 2>&1; then commit_range="$(git rev-parse HEAD^1)..HEAD" fi failed_pkgs='' successful_pkgs='' title "Building abuilds that has been modified/added between $commit_range\n" echo 'Diffstat:' git --no-pager diff --color --stat "$commit_range" for repo in $(changed_repos "$commit_range"); do set_repositories_for "$repo" for pkgname in $(changed_abuilds "$repo" "$commit_range"); do qname="$repo/$pkgname" fold_start "$pkgname" "Building package $qname" cd $qname if abuild -r; then checkapk || : successful_pkgs="$successful_pkgs $qname" else failed_pkgs="$failed_pkgs $qname" fi cd - >/dev/null fold_end "$pkgname" done done printf '\n----\n' if [ -n "$successful_pkgs" ]; then print -s1 -c2 "Successfully build packages:$successful_pkgs\n" fi if [ -n "$failed_pkgs" ]; then die "Failed to build packages:$failed_pkgs" elif [ -z "$successful_pkgs" ]; then print -s1 -c3 'No packages found to be built.' fi