From 586df6f3fe66d75ab268aab0b046dc697f4feb67 Mon Sep 17 00:00:00 2001 From: BiSheng Date: Tue, 18 Aug 2026 15:47:32 +0000 Subject: [PATCH] feat: mirror OHOS kotlinx-coroutines-test 1.8.0-KBA-002 Task #141 follow-up to task #93. Adds the frozen 45-file closure for org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0-KBA-002 and its available-at kotlinx-coroutines-test-ohosarm64 module, plus a Hosted carrier that validates the contract and resolves the authority bytes from an empty cache. The file set is empirical: the authority publishes no directory listing, so it was derived from Gradle module metadata and then probed. Neither coordinate ships a .spdx.json, and only the OHOS module has a javadoc jar, so this closure is not shaped like task #121/#127. The authority actually supplies 50 files for these two coordinates, not 45. The difference is the root -kotlin-tooling-metadata.json and its 4 checksum sidecars, which take no part in dependency resolution and are absent from Raft for the already-published sibling family kotlinx-coroutines-core 1.8.0-KBA-002 and atomicfu 0.23.2-KBA-001. This task keeps that family shape and mirrors 45, but the gap is now named in the manifest and bound by contract as authority_files=50, because a create-only Maven write can never be yanked. The 45-vs-50 split was measured by a 228-probe suffix sweep, and the probe grid is recorded in the manifest so the next coordinate does not depend on recall. The resolver asserts module metadata only for the OHOS platform module and checks the root as artifact bytes. Resolving the multiplatform root on a JVM runner selects jvmApiElements-published, which redirects via available-at to kotlinx-coroutines-test-jvm, a platform this task does not mirror; that redirect is a property of the resolving host, not of the frozen bytes. The run prints that the mirrored root resolves for OHOS targets only. atomicfu 0.23.2-KBA-001 and kotlinx-coroutines-core 1.8.0-KBA-002 are already public. kotlin-stdlib 2.0.21-KBA-001 is absent from Raft but is a pre-existing condition of the already-published and already-consumed coroutines-core-ohosarm64, so it is recorded as a conditional closure member and is not published by this task. This commit publishes nothing. Plan is ALL_ABSENT 45/45, 0 conflict. Signed-off-by: BiSheng --- .../task141-coroutines-test-mirror.yml | 113 +++++++++++++++++ .../task141-coroutines-test-manifest.tsv | 63 ++++++++++ tools/raft-artifacts/mirror_maven_manifest.py | 21 ++++ .../build.gradle | 59 +++++++++ .../settings.gradle | 22 ++++ .../test_mirror_maven_manifest.py | 118 ++++++++++++++++++ 6 files changed, 396 insertions(+) create mode 100644 .github/workflows/task141-coroutines-test-mirror.yml create mode 100644 publish/predecessors/task141-coroutines-test-manifest.tsv create mode 100644 tools/raft-artifacts/task141-coroutines-test-resolver/build.gradle create mode 100644 tools/raft-artifacts/task141-coroutines-test-resolver/settings.gradle diff --git a/.github/workflows/task141-coroutines-test-mirror.yml b/.github/workflows/task141-coroutines-test-mirror.yml new file mode 100644 index 000000000..af74b8984 --- /dev/null +++ b/.github/workflows/task141-coroutines-test-mirror.yml @@ -0,0 +1,113 @@ +name: Task141 OHOS Coroutines-Test Maven Mirror + +on: + pull_request: + paths: + - .github/workflows/task141-coroutines-test-mirror.yml + - publish/predecessors/task141-coroutines-test-manifest.tsv + - tools/raft-artifacts/mirror_maven_manifest.py + - tools/raft-artifacts/test_mirror_maven_manifest.py + - tools/raft-artifacts/task141-coroutines-test-resolver/** + workflow_dispatch: + inputs: + expected_sha: + description: Exact 40-character landed source SHA to verify and publish + required: true + type: string + publish: + description: Publish only missing exact bytes after validation + required: true + default: false + type: boolean + +permissions: + contents: read + +concurrency: + group: task141-coroutines-test-${{ github.event.pull_request.head.sha || inputs.expected_sha || github.sha }} + cancel-in-progress: false + +env: + MANIFEST: publish/predecessors/task141-coroutines-test-manifest.tsv + TARGET_SHA: ${{ github.event.pull_request.head.sha || inputs.expected_sha || github.sha }} + RESOLVER: tools/raft-artifacts/task141-coroutines-test-resolver + +jobs: + source-contract: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v5 + with: + ref: ${{ env.TARGET_SHA }} + fetch-depth: 2 + persist-credentials: false + - name: Bind the exact signed source + run: | + set -euo pipefail + [[ "$TARGET_SHA" =~ ^[0-9a-f]{40}$ ]] + test "$(git rev-parse HEAD)" = "$TARGET_SHA" + test -z "$(git status --porcelain=v1 --untracked-files=all)" + git diff --check HEAD^ + test "$(git log -1 --format=%B | grep -Ec '^Signed-off-by: .+ <[^>]+>$')" -eq 1 + - name: Verify every immutable manifest contract and the fresh Raft plan + run: | + set -euo pipefail + python3 tools/raft-artifacts/test_mirror_maven_manifest.py + python3 tools/raft-artifacts/mirror_maven_manifest.py \ + --manifest "$MANIFEST" \ + --mode plan + + tencent-authority-resolve: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v5 + with: + ref: ${{ env.TARGET_SHA }} + fetch-depth: 2 + persist-credentials: false + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + - name: Resolve the frozen root jar and OHOS klib from an empty cache + run: | + set -euo pipefail + test "$(git rev-parse HEAD)" = "$TARGET_SHA" + cache_dir="$(mktemp -d)" + trap 'rm -rf "$cache_dir"' EXIT + GRADLE_USER_HOME="$cache_dir" ./gradlew \ + --no-daemon \ + --refresh-dependencies \ + -p "$RESOLVER" \ + resolveTask141Authority + + publish: + if: github.event_name == 'workflow_dispatch' && inputs.publish + needs: + - source-contract + - tencent-authority-resolve + runs-on: ubuntu-latest + timeout-minutes: 20 + environment: raft-artifacts-production + steps: + - uses: actions/checkout@v5 + with: + ref: ${{ env.TARGET_SHA }} + fetch-depth: 2 + persist-credentials: false + - name: Bind the exact landed source + run: | + set -euo pipefail + test "$(git rev-parse HEAD)" = "$TARGET_SHA" + test "$(git ls-remote "https://github.com/${GITHUB_REPOSITORY}.git" refs/heads/staging3 | cut -f1)" = "$TARGET_SHA" + - name: Publish with missing-only immutable Maven PUT semantics + env: + RAFT_ARTIFACTS_PUBLISH_TOKEN: ${{ secrets.RAFT_ARTIFACTS_PUBLISH_TOKEN }} + run: | + set -euo pipefail + test -n "$RAFT_ARTIFACTS_PUBLISH_TOKEN" + python3 tools/raft-artifacts/mirror_maven_manifest.py \ + --manifest "$MANIFEST" \ + --mode publish diff --git a/publish/predecessors/task141-coroutines-test-manifest.tsv b/publish/predecessors/task141-coroutines-test-manifest.tsv new file mode 100644 index 000000000..bd2315413 --- /dev/null +++ b/publish/predecessors/task141-coroutines-test-manifest.tsv @@ -0,0 +1,63 @@ +# schema=1 +# task=141 +# selected_by=KuiklyUI staging3@3dbfd5adc69b871b0bc72277f150d49e6842e6e7 +# selection=OHOS kotlinx-coroutines-test root plus available-at ohosarm64 only +# predecessor_gavs=2 +# files=45 +# total_bytes=201738 +# deterministic_set_sha256=57c45a26d73f97b28e8a81c7b7c7a95e79e6c8663461409c67143ead73977675 +# inventory_packet_sha256=c22ae909916db9e2d2732124710a08aff0cb36a79c08c24b210f30788af6f565 +# closure_already_public=atomicfu 0.23.2-KBA-001 and kotlinx-coroutines-core 1.8.0-KBA-002 with their ohosarm64 modules +# conditional_closure=kotlin-stdlib 2.0.21-KBA-001 is absent from Raft but is a pre-existing condition of the already-published kotlinx-coroutines-core-ohosarm64 1.8.0-KBA-002 and is not published by this task +# authority_files=50 +# excluded=every non-OHOS available-at platform module of the same root; and the root -kotlin-tooling-metadata.json plus its 4 checksum sidecars, which the authority does supply but which take no part in dependency resolution and are absent from Raft for the already-published sibling family kotlinx-coroutines-core 1.8.0-KBA-002 and atomicfu 0.23.2-KBA-001 +# authority_superset=the authority supplies 50 files for these two coordinates; this manifest deliberately freezes 45 and the 5-file difference is the tooling metadata named above, measured by a 228-probe suffix sweep rather than assumed +# probe_grid=jar klib pom module aar zip json spdx.json sbom.json cyclonedx.json -sources.jar -javadoc.jar -all.jar -common-sources.jar -samplessources.jar -tests.jar -metadata.jar -kotlin-tooling-metadata.json -tooling-metadata.json .asc .sigstore .intoto.jsonl each crossed with md5/sha1/sha256/sha512 sidecars +# authority_listing=the authority answers a directory URL with HTTP 200 and a not-browseable notice, never 404; any check that treats absent listing as 404 is reading the wrong signal +# provenance=canonical Tencent Maven bytes; exact source-to-publication run is not publicly auditable +groupId artifactId version path size sha256 authority +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar 261 f1cca90dcc5a0c4c95049ca680966ed7c1a5037679ec8978a9767cdb77f59847 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.md5 32 c778ed47eb41f794965fd502760d01648bb2b18626e232ed14f7ec6ec80b8bda https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha1 40 115c567234e4df822421a546d9cd4c6e8214ae28816d687259c10291556c7976 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha256 64 b822a648520a2459f0ce31ef5233a7628c61c1c9544c648d32406db337e30dd7 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha512 128 0b10fe1699f6a0c32fda1bb518742cb1a88b036c2336447586df0bdfd8f5d9b9 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-javadoc.jar.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar 25452 2a7bd0ddc38d588db0038634534680fc61880025f9cbd88925f90945b274d78b https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.md5 32 ebf8db4d8e61985432aac05cc11850c4fdfe10af68dd64741b05f8f9ebf1aebb https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha1 40 d822a9ef0c3b605ea3209d96da7e2102b1d98df33a57014b76be8e3983ba0bdb https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha256 64 285bdb1c0bee5e1f7d486fa0b3eaaefdf46d86222cfe02d0329d769d4bc3cbcb https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha512 128 f1cfe0431fd172c520beac66d4a4009c7f161ded5999a50c3b4fa7b412fac678 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002-sources.jar.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib 78170 ce0cf5e6683d55254ed89c733d05ca65581f024d6475f4f1f36b66017b8c75fb https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.md5 32 46c77144894bd6581b5350c44d0eb646dde8443615c0cf452ed9721b3cdef885 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha1 40 a557e1803566d56ee9f783c3eecc8535d86d68f85d4ff6c94e38747a36f755af https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha256 64 12fea473b0cb19b6d08b741915e944cab934826514e89155f32ca8ff4c0a5c2f https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha512 128 bbbc8b5ec3e8a5f3dff2962eea3eec35616f9d6cc6191c8f6c4a192cf74569d5 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.klib.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module 2959 f0889ac34f99b14b071181197ed5e05fb3102dcf18aa5a5e04145c770d9b4094 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.md5 32 f926cba726cfda7aa243dddbeda3dfed76171a28d9facf1dcbfa22d282d4be48 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha1 40 f18e234808c12b4010a24b24b0d58c86bc83b3b84bfd218b1b2743b241cb8c90 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha256 64 d5a4c044fe6899b0a1453ccfde8659866b1a902bdb7bc874beb456d44447c277 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha512 128 cc18fb07795596c0b7461b468e8227430eb73de26135c98b7e00a33b02d738ea https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.module.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom 2164 2b5d39c0d4575daab431fb3a217f8c22394e52d8aec712e28f0423ea75c36132 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.md5 32 8f7602b31b112de186a8325ad40ffd7c28a14db4fcb8529c363b5c15d8f904b0 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha1 40 2fba1f38ac7dee714ccd9c5ee3982510351d4d18e15ad46a2262814d21605234 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha256 64 19ab218dc7eb9dd43a1758548446ba1f50ef2723004e331b3813fdd118d4e464 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test-ohosarm64 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha512 128 4584de233298f638b6d6d471972ba60f5ca127714e3ce2137897535ed0e5ef9b https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test-ohosarm64/1.8.0-KBA-002/kotlinx-coroutines-test-ohosarm64-1.8.0-KBA-002.pom.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar 25452 c0a496fc17c99a9c9fb4f88b149330e083e975707d7c13b48ce7159acaf9154b https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.md5 32 022055495968f37160a1f2fe50c2aec6acff609f60d65884fac8b39b0012a849 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha1 40 99a7a88847b8451ec98f6c11c06406789444ab1187a850036f5b468d715dedd4 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha256 64 d0b31a5068062e4aab808ebffef92309e17aafabb6db9c197c39806bb331a689 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha512 128 088eed0aa482eafdf15da6eee6d2cb0eca023af80a98d258a8a1470aebe802fe https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002-sources.jar.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar 14799 41faf619ea9466712501851e6ba4f0328be2673415c5c136054955f0d70a045b https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.md5 32 d754a669b8bbcf295a288e23c23cd60d18b693277f2da600d9629f51d3ba3fa4 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha1 40 121c63df243889d57378234fadae24dc7af84991d08295f0a85ef1105438aa16 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha256 64 4a46d2ddca1f731d5005c681e32bf98b8bc926bc23615a8ff828090027afebb7 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha512 128 d2f8f24b70402aa63c15282188f44f1ac3898fdf1e4a26c12f9b2b54781d485e https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.jar.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module 48024 19eb69b41f45389036f8984654ed8326cfe7f37cb8622bda4330fcfa9fa092d3 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.md5 32 16705aee2d1a55a38ec247ffca84bc0799c4c98e6f2db695fd9e74407b42978d https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha1 40 a092f97eaefda8bff7e0a9a1a45f79f5299c95c0bf80dbc56d1648160349a055 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha256 64 f04b9f094121a5c74c0a3555c9a871d05a3ad90c3fec31c9363bee6253676f27 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha512 128 c50f18f1dd50bc9f3307f895dcba8fdd36b41acdc8655a0a399a2555f9649fa7 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.module.sha512 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom 2081 32520a725f5471ada914d26a70783c0728a0241c71ff2b8bd45c2a9840937167 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.md5 32 8715aea066c7e43d4b38fd2d27483db41751a5c90e63eed7d4721baf44735873 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.md5 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha1 40 b0e45f9cfa44b170492485d4b8a9984b075f3001e9b7e89129d95dcb58646fbf https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha1 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha256 64 86af1183db9ce9aab50debf180aa24f0b60cbc538ea515c72504dd4153aaff8f https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha256 +org.jetbrains.kotlinx kotlinx-coroutines-test 1.8.0-KBA-002 org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha512 128 8e8fad4d3b1468a153195604987da8f440ea3603336bf11b8b58923672a97565 https://mirrors.tencent.com/repository/maven-tencent/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.8.0-KBA-002/kotlinx-coroutines-test-1.8.0-KBA-002.pom.sha512 diff --git a/tools/raft-artifacts/mirror_maven_manifest.py b/tools/raft-artifacts/mirror_maven_manifest.py index 43ca1c354..122bbb1ba 100644 --- a/tools/raft-artifacts/mirror_maven_manifest.py +++ b/tools/raft-artifacts/mirror_maven_manifest.py @@ -43,6 +43,10 @@ ("org.jetbrains.kotlin", "kotlin-stdlib-common", "2.0.21-KBA-010"), ("org.jetbrains.kotlin", "kotlin-stdlib", "2.0.21-KBA-010"), } +TASK141_EXPECTED_GAVS = { + ("org.jetbrains.kotlinx", "kotlinx-coroutines-test", "1.8.0-KBA-002"), + ("org.jetbrains.kotlinx", "kotlinx-coroutines-test-ohosarm64", "1.8.0-KBA-002"), +} MANIFEST_CONTRACTS = { "121": { "files": 31, @@ -67,6 +71,23 @@ "deterministic_set_sha256": "3a789c3fc63d7ae70966c793f0cc07f483b0cfaa3dc860428937dc1a96c2c906", }, }, + "141": { + "files": 45, + "gavs": TASK141_EXPECTED_GAVS, + "total_bytes": 201738, + "set_sha256": "57c45a26d73f97b28e8a81c7b7c7a95e79e6c8663461409c67143ead73977675", + "metadata": { + "inventory_packet_sha256": "c22ae909916db9e2d2732124710a08aff0cb36a79c08c24b210f30788af6f565", + "files": "45", + # The authority supplies 50 files for these two coordinates. Binding + # the superset count here keeps the 45-vs-50 gap machine-enforced, + # so the exclusion cannot silently drift back into prose. + "authority_files": "50", + "predecessor_gavs": "2", + "total_bytes": "201738", + "deterministic_set_sha256": "57c45a26d73f97b28e8a81c7b7c7a95e79e6c8663461409c67143ead73977675", + }, + }, } AUTHORITY_ORIGIN = "mirrors.tencent.com" AUTHORITY_PREFIX = "/repository/maven-tencent/" diff --git a/tools/raft-artifacts/task141-coroutines-test-resolver/build.gradle b/tools/raft-artifacts/task141-coroutines-test-resolver/build.gradle new file mode 100644 index 000000000..0b091ef65 --- /dev/null +++ b/tools/raft-artifacts/task141-coroutines-test-resolver/build.gradle @@ -0,0 +1,59 @@ +import org.gradle.api.artifacts.component.ModuleComponentIdentifier + +def version = "1.8.0-KBA-002" +def rootGav = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${version}" +def ohosGav = "org.jetbrains.kotlinx:kotlinx-coroutines-test-ohosarm64:${version}" + +// Only the OHOS platform module is asserted through module metadata. Resolving +// the multiplatform root on a JVM host selects jvmApiElements-published, which +// redirects via available-at to kotlinx-coroutines-test-jvm — a platform this +// task deliberately does not mirror. That redirect is a property of the host, +// not of the frozen bytes, so the root is checked as artifact bytes instead. +def ohosMetadataClosure = configurations.create("task141OhosMetadataClosure") { + canBeConsumed = false + canBeResolved = true +} +def artifactClosure = configurations.create("task141ArtifactClosure") { + canBeConsumed = false + canBeResolved = true +} + +dependencies { + add(ohosMetadataClosure.name, ohosGav) { transitive = false } + // Artifact-only notation keeps this check on the frozen authority bytes and + // off Kotlin/Native variant matching, which needs the OHOS toolchain. Real + // OHOS variant selection is proven separately by the Mobile compileTest. + add(artifactClosure.name, "${rootGav}@jar") { transitive = false } + add(artifactClosure.name, "${ohosGav}@klib") { transitive = false } +} + +tasks.register("resolveTask141Authority") { + doLast { + def actualComponents = ohosMetadataClosure.incoming.resolutionResult.allComponents + .collect { it.id } + .findAll { it instanceof ModuleComponentIdentifier } + .collect { "${it.group}:${it.module}:${it.version}" } + .toSet() + assert actualComponents == [ohosGav].toSet(): + "unexpected task #141 OHOS metadata closure: ${actualComponents.sort()}" + + def expectedArtifacts = [ + ("kotlinx-coroutines-test-${version}.jar".toString()): + "41faf619ea9466712501851e6ba4f0328be2673415c5c136054955f0d70a045b", + ("kotlinx-coroutines-test-ohosarm64-${version}.klib".toString()): + "ce0cf5e6683d55254ed89c733d05ca65581f024d6475f4f1f36b66017b8c75fb", + ] + def actualArtifacts = artifactClosure.resolve().collectEntries { file -> + def digest = java.security.MessageDigest.getInstance("SHA-256") + .digest(file.bytes) + .encodeHex() + .toString() + [(file.name): digest] + } + assert actualArtifacts == expectedArtifacts: + "unexpected task #141 authority artifacts: ${actualArtifacts}" + println "TASK141_TENCENT_AUTHORITY_RESOLVE_PASS ohos_components=1 artifacts=2" + println "TASK141_DISCLOSURE mirrored root resolves for OHOS targets only; " + + "non-OHOS available-at platforms are not mirrored by task #141" + } +} diff --git a/tools/raft-artifacts/task141-coroutines-test-resolver/settings.gradle b/tools/raft-artifacts/task141-coroutines-test-resolver/settings.gradle new file mode 100644 index 000000000..1fb169387 --- /dev/null +++ b/tools/raft-artifacts/task141-coroutines-test-resolver/settings.gradle @@ -0,0 +1,22 @@ +import org.gradle.api.initialization.resolve.RepositoriesMode + +pluginManagement { + repositories.clear() +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + maven { + name = "TencentAuthority" + url = uri("https://mirrors.tencent.com/repository/maven-tencent") + metadataSources { + gradleMetadata() + mavenPom() + artifact() + } + } + } +} + +rootProject.name = "task141-coroutines-test-authority-resolver" diff --git a/tools/raft-artifacts/test_mirror_maven_manifest.py b/tools/raft-artifacts/test_mirror_maven_manifest.py index f7d1f2891..b679be738 100644 --- a/tools/raft-artifacts/test_mirror_maven_manifest.py +++ b/tools/raft-artifacts/test_mirror_maven_manifest.py @@ -18,6 +18,7 @@ REPOSITORY = SCRIPT.parents[2] TASK121_MANIFEST = REPOSITORY / "publish/predecessors/task121-current-kba-manifest.tsv" TASK127_MANIFEST = REPOSITORY / "publish/predecessors/task127-kba010-manifest.tsv" +TASK141_MANIFEST = REPOSITORY / "publish/predecessors/task141-coroutines-test-manifest.tsv" SPEC = importlib.util.spec_from_file_location("mirror_maven_manifest", SCRIPT) assert SPEC and SPEC.loader mirror = importlib.util.module_from_spec(SPEC) @@ -70,6 +71,123 @@ def test_task127_repository_manifest_is_the_exact_frozen_closure(self) -> None: ): self.assertNotIn(excluded, paths) + def test_task141_repository_manifest_is_the_exact_frozen_closure(self) -> None: + metadata, entries = mirror.load_manifest(TASK141_MANIFEST) + + self.assertEqual(metadata["task"], "141") + self.assertEqual(len(entries), 45) + self.assertEqual(sum(item.size for item in entries), 201738) + actual_gavs = {(item.group_id, item.artifact_id, item.version) for item in entries} + self.assertEqual(actual_gavs, mirror.TASK141_EXPECTED_GAVS) + + primaries = [ + item + for item in entries + if not item.path.endswith((".md5", ".sha1", ".sha256", ".sha512")) + ] + self.assertEqual(len(primaries), 9) + self.assertEqual(len(entries) - len(primaries), 36) + + paths = "\n".join(item.path for item in entries) + # Only the OHOS platform module is mirrored; every other available-at + # platform of the same root stays out of this task. + for excluded in ( + "-jvm/", + "-js/", + "-wasm-js/", + "-iosarm64/", + "-iossimulatorarm64/", + "-iosx64/", + "-linuxx64/", + "-linuxarm64/", + "-macosarm64/", + "-macosx64/", + "-mingwx64/", + "-tvosarm64/", + "-watchosarm64/", + "-androidnativearm64/", + ): + self.assertNotIn(excluded, paths) + # The conditional closure member is recorded but never published here. + self.assertNotIn("kotlin-stdlib", paths) + self.assertNotIn("2.0.21-KBA-001", paths) + + def test_task141_declares_the_authority_superset_it_does_not_mirror(self) -> None: + metadata, entries = mirror.load_manifest(TASK141_MANIFEST) + + # The authority supplies 50 files for these coordinates; this task + # freezes 45. The 5-file difference must stay named in the record, + # because a create-only Maven write can never be yanked. + self.assertEqual(metadata["authority_files"], "50") + self.assertEqual(len(entries), 45) + self.assertIn("kotlin-tooling-metadata.json", metadata["excluded"]) + self.assertIn("checksum sidecars", metadata["excluded"]) + self.assertIn("50", metadata["authority_superset"]) + # The exclusion claim rests on the sibling family, so keep that stated. + self.assertIn("kotlinx-coroutines-core", metadata["excluded"]) + self.assertIn("atomicfu", metadata["excluded"]) + # No tooling-metadata path may appear among the mirrored rows. + for item in entries: + self.assertNotIn("kotlin-tooling-metadata", item.path) + + def test_task141_authority_superset_count_is_fail_closed(self) -> None: + manifest = self._mutated_task141( + "# authority_files=50", + "# authority_files=45", + ) + with self.assertRaisesRegex(mirror.MirrorError, "metadata mismatch"): + mirror.load_manifest(manifest) + + def _mutated_task141(self, old: str, new: str) -> Path: + temporary = tempfile.NamedTemporaryFile( + mode="w", encoding="utf-8", suffix=".tsv", delete=False + ) + self.addCleanup(Path(temporary.name).unlink, missing_ok=True) + source = TASK141_MANIFEST.read_text(encoding="utf-8") + self.assertIn(old, source) + temporary.write(source.replace(old, new, 1)) + temporary.close() + return Path(temporary.name) + + def test_task141_inventory_packet_binding_is_fail_closed(self) -> None: + manifest = self._mutated_task141( + "# inventory_packet_sha256=" + "c22ae909916db9e2d2732124710a08aff0cb36a79c08c24b210f30788af6f565", + "# inventory_packet_sha256=" + "0" * 64, + ) + with self.assertRaisesRegex(mirror.MirrorError, "metadata mismatch"): + mirror.load_manifest(manifest) + + def test_task141_klib_digest_mutation_is_fail_closed(self) -> None: + _, entries = mirror.load_manifest(TASK141_MANIFEST) + klib = next(item for item in entries if item.path.endswith(".klib")) + manifest = self._mutated_task141(klib.sha256, "0" * 64) + with self.assertRaisesRegex(mirror.MirrorError, "exact frozen closure"): + mirror.load_manifest(manifest) + + def test_task141_authority_origin_mutation_is_fail_closed(self) -> None: + manifest = self._mutated_task141( + "https://mirrors.tencent.com/repository/maven-tencent/", + "https://repo1.maven.org/maven2/", + ) + with self.assertRaisesRegex(mirror.MirrorError, "authority does not bind"): + mirror.load_manifest(manifest) + + def test_task141_dropping_one_file_is_fail_closed(self) -> None: + lines = TASK141_MANIFEST.read_text(encoding="utf-8").splitlines() + data_index = next( + index for index, line in enumerate(lines) if not line.startswith("#") + ) + del lines[data_index + 1] + with tempfile.NamedTemporaryFile( + mode="w", encoding="utf-8", suffix=".tsv", delete=False + ) as temporary: + temporary.write("\n".join(lines) + "\n") + path = Path(temporary.name) + self.addCleanup(path.unlink, missing_ok=True) + with self.assertRaisesRegex(mirror.MirrorError, "exact frozen closure"): + mirror.load_manifest(path) + def _mutated_task127(self, old: str, new: str) -> Path: temporary = tempfile.NamedTemporaryFile( mode="w", encoding="utf-8", suffix=".tsv", delete=False