From bfd4c49c3515ac6a1faf083ee2dbe29efb351ad4 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Thu, 8 Oct 2026 20:05:10 +1000 Subject: [PATCH] vinca-gha: disable git auto-maintenance before Setup pixi pixi clones git dependencies into its cache, which setup-pixi saves. git's background auto-maintenance can leave commit-graph-chain.lock in such a clone; every later run restoring that cache then fails in "Setup pixi" with "hardlink different from source at ...commit-graph-chain.lock" (seen on RoboStack/ros-jazzy's linux-aarch64 build branch). A git config step before Setup pixi also covers the build script. Co-Authored-By: Claude Opus 5.5 --- vinca/generate_gha.py | 13 +++++++++++++ vinca/test_generate_gha.py | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/vinca/generate_gha.py b/vinca/generate_gha.py index 4dc60c7..be243a6 100644 --- a/vinca/generate_gha.py +++ b/vinca/generate_gha.py @@ -192,6 +192,17 @@ def normalize_version(version: str) -> str: return version +# pixi clones git dependencies (e.g. vinca) into its cache, which setup-pixi saves. +# git's background auto-maintenance can leave a lock file in such a clone ("hardlink +# different from source at .../commit-graph-chain.lock"), which then breaks every +# later run restoring that cache. This step runs before Setup pixi, so it also covers +# the build script. +DISABLE_GIT_MAINTENANCE_STEP: dict[str, Any] = { + "name": "Disable git auto-maintenance", + "run": "git config --global maintenance.auto false && git config --global gc.auto 0", +} + + def get_setup_pixi_step( setup_pixi_version: str = DEFAULT_SETUP_PIXI_VERSION, pixi_version: str = DEFAULT_PIXI_VERSION, @@ -247,6 +258,7 @@ def build_unix_pipeline( "name": "Checkout code", "uses": "actions/checkout@v7", }, + DISABLE_GIT_MAINTENANCE_STEP, get_setup_pixi_step(setup_pixi_version, pixi_version), { "name": f"Build {' '.join([pkg for pkg in batch])}", @@ -371,6 +383,7 @@ def build_win_pipeline( steps = [ {"name": "Checkout code", "uses": "actions/checkout@v7"}, + DISABLE_GIT_MAINTENANCE_STEP, get_setup_pixi_step(setup_pixi_version, pixi_version), { "uses": "egor-tensin/cleanup-path@v5", diff --git a/vinca/test_generate_gha.py b/vinca/test_generate_gha.py index 4745084..08b1c0d 100644 --- a/vinca/test_generate_gha.py +++ b/vinca/test_generate_gha.py @@ -50,7 +50,10 @@ def test_unix_pipeline_sets_up_pixi(tmp_path): ) workflow = pytest.importorskip("yaml").safe_load(outfile.read_text()) - setup_step = workflow["jobs"]["stage_0_job_0"]["steps"][1] + steps = workflow["jobs"]["stage_0_job_0"]["steps"] + assert steps[1]["name"] == "Disable git auto-maintenance" + assert "maintenance.auto false" in steps[1]["run"] + setup_step = steps[2] assert setup_step == { "name": "Setup pixi", "uses": "prefix-dev/setup-pixi@v0",