123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #!/usr/bin/env bash
- set -o errexit -o pipefail
- DIR=$(dirname "${0}")
- MAIN_DIR=$(readlink -f "${DIR}/..")
- if [ -L "${MAIN_DIR}/.git/config" ]; then
- # Support git-new-workdir
- GIT_DIR="$(dirname "$(realpath "${MAIN_DIR}/.git/config")")"
- else
- # Support git-worktree
- GIT_DIR="$(cd "${MAIN_DIR}" && git rev-parse --no-flags --git-common-dir)"
- fi
- if test -z "${IMAGE}" ; then
- # shellcheck disable=SC2016
- IMAGE=$(grep ^image: "${MAIN_DIR}/.gitlab-ci.yml" | \
- sed -e 's,^image: ,,g' | sed -e 's,\$CI_REGISTRY,registry.gitlab.com,g')
- fi
- declare -a docker_opts=(
- -i
- --rm
- --user "$(id -u):$(id -g)"
- --workdir "$(pwd)"
- --security-opt label=disable
- --network host
- )
- declare -a mountpoints=(
- "${MAIN_DIR}"
- "$(pwd)"
- )
- # curl lists (and recognises and uses) other types of *_proxy variables,
- # but only those make sense for Buildroot:
- for env in all_proxy http_proxy https_proxy ftp_proxy no_proxy; do
- if [ "${!env}" ]; then
- docker_opts+=( --env "${env}" )
- # The lower-case variant takes precedence on the upper-case one
- # (dixit curl)
- continue
- fi
- # http_proxy is only lower-case (dixit curl)
- if [ "${env}" = http_proxy ]; then
- continue
- fi
- # All the others also exist in the upper-case variant
- env="${env^^}"
- if [ "${!env}" ]; then
- docker_opts+=( --env "${env}" )
- fi
- done
- # Empty GIT_DIR means that we are not in a workdir, *and* git is too old
- # to know about worktrees, so we're not in a worktree either. So it means
- # we're in the main git working copy, and thus we don't need to mount the
- # .git directory.
- if [ "${GIT_DIR}" ]; then
- # GIT_DIR in the main working copy (when git supports worktrees) will
- # be just '.git', but 'docker run' needs an absolute path. If it is
- # not absolute, GIT_DIR is relative to MAIN_DIR. If it's an absolute
- # path already (in a wordir), then that's a noop.
- GIT_DIR="$(cd "${MAIN_DIR}"; readlink -e "${GIT_DIR}")"
- mountpoints+=( "${GIT_DIR}" )
- # 'repo' stores .git/objects separately.
- if [ -L "${GIT_DIR}/objects" ]; then
- # GITDIR is already an absolute path, but for symmetry
- # with the above, keep the same cd+readlink construct.
- OBJECTS_DIR="$(cd "${MAIN_DIR}"; readlink -e "${GIT_DIR}/objects")"
- mountpoints+=( "${OBJECTS_DIR}" )
- fi
- fi
- if [ "${BR2_DL_DIR}" ]; then
- mountpoints+=( "${BR2_DL_DIR}" )
- docker_opts+=( --env BR2_DL_DIR )
- fi
- # shellcheck disable=SC2013 # can't use while-read because of the assignment
- for dir in $(printf '%s\n' "${mountpoints[@]}" |LC_ALL=C sort -u); do
- docker_opts+=( --mount "type=bind,src=${dir},dst=${dir}" )
- done
- if tty -s; then
- docker_opts+=( -t )
- fi
- exec docker run "${docker_opts[@]}" "${IMAGE}" "${@}"
|