From b214c54c077e303cd122815e5aeae8d58a5fe948 Mon Sep 17 00:00:00 2001 From: Andrew Leech Date: Thu, 16 Oct 2025 12:31:29 +1100 Subject: [PATCH] docker: Add git worktree support. --- docker/Dockerfile | 8 +++----- docker/Makefile | 37 +++++++++++++++++++++++++++++++++++-- docker/build.sh | 5 +++-- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 77601c530..ff79b52a1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,10 +29,8 @@ ENV MAKE_URL="https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz" RUN wget --no-check-certificate --user-agent="Mozilla/5.0" -O - ${MAKE_URL} | tar --strip-components=1 -xz -C /workspace/make RUN cd /workspace/make && ./configure && make -j$(nproc) -# Set up directories -WORKDIR /workspace - -COPY . . - +# Permissive git permissions inside container +ENV HOME=/tmp RUN git config --global --add safe.directory '*' + ENV PATH="/workspace/gcc/bin:/workspace/llvm/bin:/workspace/cmake/bin:/workspace/make:$PATH" diff --git a/docker/Makefile b/docker/Makefile index 6497d2217..3b4452532 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -3,6 +3,27 @@ DOCKER_TAG = latest CONTAINER_NAME = firmware-container DOCKERFILE_PATH = Dockerfile +# Detect repository structure +REPO_ROOT := $(shell git rev-parse --show-toplevel) +GIT_DIR := $(shell realpath $$(git rev-parse --git-dir)) +GIT_COMMON_DIR := $(shell realpath $$(git rev-parse --git-common-dir)) + +# Detect worktree: git-dir != git-common-dir +IS_WORKTREE := $(shell [ "$(GIT_DIR)" != "$(GIT_COMMON_DIR)" ] && echo "yes" || echo "no") + +# Working directory inside container +WORKDIR = $(REPO_ROOT) + +# Volume mounts: always mount repo at actual path +ifeq ($(IS_WORKTREE),yes) + # For worktrees, also mount the main repo (for .git references) + MAIN_REPO_PATH := $(shell dirname $(GIT_COMMON_DIR)) + VOLUME_MOUNTS = -v $(MAIN_REPO_PATH)/.git:$(MAIN_REPO_PATH)/.git \ + -v $(REPO_ROOT):$(WORKDIR) +else + VOLUME_MOUNTS = -v $(REPO_ROOT):$(WORKDIR) +endif + # Build the Docker image build-image: docker build \ @@ -15,7 +36,8 @@ build-firmware: build-image -e TARGET=$(TARGET) \ -e HOST_UID=$(shell id -u) \ -e HOST_GID=$(shell id -g) \ - -v $(PWD)/build:/workspace/build \ + -w $(WORKDIR) \ + $(VOLUME_MOUNTS) \ --name $(CONTAINER_NAME) \ $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) docker/build.sh @@ -23,7 +45,18 @@ build-firmware: build-image shell: docker run --rm -it \ -e shell="true" \ - -v $(PWD)/build:/workspace/build \ + -w $(WORKDIR) \ + $(VOLUME_MOUNTS) \ $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) bash +# Debug target to show detected paths +debug-paths: + @echo "IS_WORKTREE: $(IS_WORKTREE)" + @echo "REPO_ROOT: $(REPO_ROOT)" + @echo "GIT_DIR: $(GIT_DIR)" + @echo "GIT_COMMON_DIR: $(GIT_COMMON_DIR)" + @echo "MAIN_REPO_PATH: $(MAIN_REPO_PATH)" + @echo "WORKDIR: $(WORKDIR)" + @echo "VOLUME_MOUNTS: $(VOLUME_MOUNTS)" + .DEFAULT_GOAL := build-firmware diff --git a/docker/build.sh b/docker/build.sh index afb425da6..d52090f5d 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -1,7 +1,8 @@ #!/bin/bash set -e -x -BUILD_DIR=/workspace/build/${TARGET} +OPENMV="$(pwd)" +BUILD_DIR=${OPENMV}/build/${TARGET} # Update submodules. git submodule update --init --depth=1 @@ -13,4 +14,4 @@ make -j$(nproc) -C lib/micropython/mpy-cross make -j$(nproc) BUILD=${BUILD_DIR} TARGET=${TARGET} LLVM_PATH=/workspace/llvm/bin # Fix permissions. -chown -R ${HOST_UID:-1000}:${HOST_GID:-1000} /workspace/build +chown -R ${HOST_UID:-1000}:${HOST_GID:-1000} ${OPENMV}/build