diff --git a/.github/actions/publish-vps-mirror/action.yml b/.github/actions/publish-vps-mirror/action.yml index 87ca8e6f..424a3fdb 100644 --- a/.github/actions/publish-vps-mirror/action.yml +++ b/.github/actions/publish-vps-mirror/action.yml @@ -115,7 +115,12 @@ runs: ) remote="${MIRROR_SSH_USER}@${MIRROR_SSH_HOST}" payload_bytes="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["payloadBytes"])' "${stage_dir}/deployment.json")" - available_bytes="$(ssh "${ssh_options[@]}" "${remote}" "df -PB1 --output=avail '${mirror_root}' | tail -n 1 | tr -d ' '")" + available_kib="$(ssh "${ssh_options[@]}" "${remote}" "LC_ALL=C df -Pk '${mirror_root}' | awk 'NR == 2 { print \$4 }'")" + [[ "${available_kib}" =~ ^[0-9]+$ ]] || { + echo "Mirror origin returned an invalid free space value: ${available_kib:-}" >&2 + exit 1 + } + available_bytes="$((available_kib * 1024))" required_bytes="$((payload_bytes + 2000000000))" if (( available_bytes < required_bytes )); then echo "Mirror origin has insufficient free space: available=${available_bytes} required=${required_bytes}" >&2 diff --git a/tools/prepare-vps-release-payload.test.py b/tools/prepare-vps-release-payload.test.py index 69c9419d..aac3f7c5 100644 --- a/tools/prepare-vps-release-payload.test.py +++ b/tools/prepare-vps-release-payload.test.py @@ -12,6 +12,7 @@ from pathlib import Path SCRIPT = Path(__file__).with_name("prepare-vps-release-payload.py") +PUBLISH_ACTION = SCRIPT.parents[1] / ".github/actions/publish-vps-mirror/action.yml" def sha256(value: bytes) -> str: @@ -153,6 +154,14 @@ class PrepareVPSReleasePayloadTest(unittest.TestCase): self.assertNotEqual(result.returncode, 0) self.assertIn("invalid app asset name", result.stderr) + def test_publish_action_reads_remote_capacity_with_posix_df(self) -> None: + source = PUBLISH_ACTION.read_text(encoding="utf-8") + + self.assertIn("df -Pk '${mirror_root}'", source) + self.assertNotIn("--output=avail", source) + self.assertIn("available_kib", source) + self.assertIn("available_kib * 1024", source) + if __name__ == "__main__": unittest.main()