2022-02-14 17:24:12 +01:00
|
|
|
#!/usr/bin/env bash
|
2022-01-23 17:08:46 +01:00
|
|
|
set -o errexit -o pipefail
|
|
|
|
DIR=$(dirname "${0}")
|
|
|
|
MAIN_DIR=$(readlink -f "${DIR}/..")
|
utils/docker-run: fix support for git-worktrees
The docker-run script attempts to support git-new-workdirs and
git-worktrees by resolving the symlink at '$GIT_DIR/config' to get the
true $GIT_DIR. However this does not work for git-worktrees as they do
not use symlinks, instead they change the $GIT_DIR into a regular file
that contains the path to the real $GIT_DIR. To complicate things
further, we actually want the $GIT_COMMON_DIR which is the superset of a
worktree's $GIT_DIR.
git-rev-parse supports the '--git-common-dir' which will resolve the
$GIT_COMMON_DIR for us. However it does not work for git-new-workdirs,
so we still need to detect and handle them.
'--git-common-dir' also appeared only with git 2.10.0, released in 2016,
so it will not be available in older "enterprise-grade" distributions.
In that case, 'git rev-parse --git-common-dir' would return the option
flag '--git-common-dir' as-is, which is incorrect. So, we instruct it to
never return flags.
'--git-common-dir' also returns just '.git' for the main working copy,
but 'docker run' want an absolute path, so we canonicalise it.
Signed-off-by: Brandon Maier <brandon.maier@collins.com>
[yann.morin.1998@free.fr:
- support git versions before --git-common-dir was introduced
- don't mount GIT_DIR if unknown (i.e. not needed)
- fix expanding MAIN_DIR
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2023-07-28 23:32:18 +02:00
|
|
|
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
|
2022-01-23 17:08:46 +01:00
|
|
|
# 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')
|
|
|
|
|
2023-04-15 21:43:41 +02:00
|
|
|
declare -a docker_opts=(
|
|
|
|
-i
|
|
|
|
--rm
|
|
|
|
--user "$(id -u):$(id -g)"
|
|
|
|
--mount "type=bind,src=${MAIN_DIR},dst=${MAIN_DIR}"
|
|
|
|
--workdir "${MAIN_DIR}"
|
|
|
|
)
|
utils/docker-run: fix support for git-worktrees
The docker-run script attempts to support git-new-workdirs and
git-worktrees by resolving the symlink at '$GIT_DIR/config' to get the
true $GIT_DIR. However this does not work for git-worktrees as they do
not use symlinks, instead they change the $GIT_DIR into a regular file
that contains the path to the real $GIT_DIR. To complicate things
further, we actually want the $GIT_COMMON_DIR which is the superset of a
worktree's $GIT_DIR.
git-rev-parse supports the '--git-common-dir' which will resolve the
$GIT_COMMON_DIR for us. However it does not work for git-new-workdirs,
so we still need to detect and handle them.
'--git-common-dir' also appeared only with git 2.10.0, released in 2016,
so it will not be available in older "enterprise-grade" distributions.
In that case, 'git rev-parse --git-common-dir' would return the option
flag '--git-common-dir' as-is, which is incorrect. So, we instruct it to
never return flags.
'--git-common-dir' also returns just '.git' for the main working copy,
but 'docker run' want an absolute path, so we canonicalise it.
Signed-off-by: Brandon Maier <brandon.maier@collins.com>
[yann.morin.1998@free.fr:
- support git versions before --git-common-dir was introduced
- don't mount GIT_DIR if unknown (i.e. not needed)
- fix expanding MAIN_DIR
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2023-07-28 23:32:18 +02:00
|
|
|
|
|
|
|
# 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's an
|
|
|
|
# absolute path already (in a wordir), then that's a noop.
|
|
|
|
GIT_DIR="$(readlink -e "${GIT_DIR}")"
|
|
|
|
docker_opts+=( --mount "type=bind,src=${GIT_DIR},dst=${GIT_DIR}" )
|
|
|
|
fi
|
|
|
|
|
2023-04-15 21:43:41 +02:00
|
|
|
if tty -s; then
|
|
|
|
docker_opts+=( -t )
|
|
|
|
fi
|
|
|
|
|
|
|
|
exec docker run "${docker_opts[@]}" "${IMAGE}" "${@}"
|