compmodels-patch 2026.9.29.183230__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- compmodels_patch/__init__.py +10 -0
- compmodels_patch/__main__.py +3 -0
- compmodels_patch/bundle/BASE_STAMP +1 -0
- compmodels_patch/bundle/CHANGED.txt +236 -0
- compmodels_patch/bundle/PATCH_STAMP +1 -0
- compmodels_patch/bundle/compmodels-track2-patch-20260929T183230Z.tar.gz +0 -0
- compmodels_patch/cli.py +167 -0
- compmodels_patch-2026.9.29.183230.dist-info/METADATA +12 -0
- compmodels_patch-2026.9.29.183230.dist-info/RECORD +12 -0
- compmodels_patch-2026.9.29.183230.dist-info/WHEEL +5 -0
- compmodels_patch-2026.9.29.183230.dist-info/entry_points.txt +2 -0
- compmodels_patch-2026.9.29.183230.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""The pip route for a patch bundle (platform/portable/README.md "Updating: patch bundles" -> "Through PyPI").
|
|
2
|
+
|
|
3
|
+
The platform container reaches nothing but PyPI, so export_patch.sh wraps the patch tarball into this package
|
|
4
|
+
(``compmodels_patch/bundle/``) and publish_patch.sh uploads the wheel by hand. Inside the container:
|
|
5
|
+
|
|
6
|
+
pip install --no-cache-dir compmodels-patch==<version> && compmodels-patch apply
|
|
7
|
+
|
|
8
|
+
``apply`` extracts the tarball into the workspace and runs the bundle's own patch.sh (the same guards, backup and
|
|
9
|
+
console restart as the tarball route). Nothing else of the platform code lives here.
|
|
10
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
20260929T003841Z
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
M code/competition_models/README.md
|
|
2
|
+
A code/competition_models/configs-harness/track1.yaml
|
|
3
|
+
A code/competition_models/configs-harness/track3.yaml
|
|
4
|
+
A code/competition_models/configs-harness/track4.yaml
|
|
5
|
+
A code/competition_models/configs-harness/track5.yaml
|
|
6
|
+
A code/competition_models/configs-harness/track6.yaml
|
|
7
|
+
A code/competition_models/configs-harness/track7.yaml
|
|
8
|
+
A code/competition_models/configs-harness/track8.yaml
|
|
9
|
+
A code/competition_models/configs/track1.yaml
|
|
10
|
+
A code/competition_models/configs/track3.yaml
|
|
11
|
+
A code/competition_models/configs/track4.yaml
|
|
12
|
+
A code/competition_models/configs/track5.yaml
|
|
13
|
+
A code/competition_models/configs/track6.yaml
|
|
14
|
+
A code/competition_models/configs/track7.yaml
|
|
15
|
+
A code/competition_models/configs/track8.yaml
|
|
16
|
+
M code/competition_models/docs/04-output-contract.md
|
|
17
|
+
M code/competition_models/docs/06-platform-workflow.md
|
|
18
|
+
M code/competition_models/docs/07-open-questions.md
|
|
19
|
+
M code/competition_models/docs/08-build-order.md
|
|
20
|
+
M code/competition_models/docs/09-howto.md
|
|
21
|
+
M code/competition_models/docs/10-training-on-platform-data.md
|
|
22
|
+
M code/competition_models/docs/13-pretrained-model-inventory.md
|
|
23
|
+
M code/competition_models/docs/15-console-track-page.md
|
|
24
|
+
M code/competition_models/docs/17-track2-single-shot-training-plan.md
|
|
25
|
+
M code/competition_models/docs/18-track2-safety-pipeline.md
|
|
26
|
+
A code/competition_models/docs/19-track5-single-shot-training-plan.md
|
|
27
|
+
A code/competition_models/docs/20-track4-single-shot-training-plan.md
|
|
28
|
+
A code/competition_models/docs/21-track2-platform-runbook.md
|
|
29
|
+
A code/competition_models/docs/22-safety-all-tracks.md
|
|
30
|
+
A code/competition_models/docs/23-evaluation-rehearsal.md
|
|
31
|
+
A code/competition_models/docs/24-track8-single-shot-training-plan.md
|
|
32
|
+
A code/competition_models/docs/25-track7-single-shot-training-plan.md
|
|
33
|
+
M code/competition_models/docs/tracks/track1-ct-lung.md
|
|
34
|
+
M code/competition_models/docs/tracks/track3-cta-aneurysm.md
|
|
35
|
+
M code/competition_models/docs/tracks/track4-mri-glioma.md
|
|
36
|
+
M code/competition_models/docs/tracks/track5-mri-prostate.md
|
|
37
|
+
M code/competition_models/docs/tracks/track6-mammography.md
|
|
38
|
+
M code/competition_models/docs/tracks/track7-thyroid-ultrasound.md
|
|
39
|
+
M code/competition_models/docs/tracks/track8-chest-xray.md
|
|
40
|
+
A code/competition_models/mockdata/make_rehearsal.py
|
|
41
|
+
A code/competition_models/mockdata/make_t4_rehearsal.py
|
|
42
|
+
A code/competition_models/mockdata/make_t5_rehearsal.py
|
|
43
|
+
A code/competition_models/mockdata/make_t7_rehearsal.py
|
|
44
|
+
A code/competition_models/mockdata/make_t8_rehearsal.py
|
|
45
|
+
A code/competition_models/mockdata/rehearsal_specials.py
|
|
46
|
+
M code/competition_models/platform/Dockerfile.harness
|
|
47
|
+
M code/competition_models/platform/Dockerfile.train
|
|
48
|
+
M code/competition_models/platform/README.md
|
|
49
|
+
M code/competition_models/platform/console_start.sh
|
|
50
|
+
M code/competition_models/platform/h100/export_patch.sh
|
|
51
|
+
M code/competition_models/platform/h100/export_portable_bundle.sh
|
|
52
|
+
M code/competition_models/platform/h100/export_weights_bundle.sh
|
|
53
|
+
A code/competition_models/platform/h100/publish_patch.sh
|
|
54
|
+
M code/competition_models/platform/h100/run_console_h100.sh
|
|
55
|
+
A code/competition_models/platform/h100/run_finetune_track5_h100.sh
|
|
56
|
+
A code/competition_models/platform/h100/run_finetune_track7_h100.sh
|
|
57
|
+
A code/competition_models/platform/h100/run_finetune_track8_h100.sh
|
|
58
|
+
A code/competition_models/platform/h100/run_post_track5_h100.sh
|
|
59
|
+
A code/competition_models/platform/h100/run_post_track7_h100.sh
|
|
60
|
+
A code/competition_models/platform/h100/run_post_track8_h100.sh
|
|
61
|
+
M code/competition_models/platform/h100/run_prepare_track2_h100.sh
|
|
62
|
+
A code/competition_models/platform/h100/run_prepare_track4_h100.sh
|
|
63
|
+
A code/competition_models/platform/h100/run_prepare_track5_h100.sh
|
|
64
|
+
A code/competition_models/platform/h100/run_prepare_track7_h100.sh
|
|
65
|
+
A code/competition_models/platform/h100/run_prepare_track8_h100.sh
|
|
66
|
+
A code/competition_models/platform/h100/run_pretrain_track5_h100.sh
|
|
67
|
+
A code/competition_models/platform/h100/run_pretrain_track7_h100.sh
|
|
68
|
+
A code/competition_models/platform/h100/run_pretrain_track8_h100.sh
|
|
69
|
+
A code/competition_models/platform/h100/run_rehearsal_data_track4_h100.sh
|
|
70
|
+
A code/competition_models/platform/h100/run_rehearsal_data_track7_h100.sh
|
|
71
|
+
A code/competition_models/platform/h100/run_rehearsal_h100.sh
|
|
72
|
+
A code/competition_models/platform/h100/run_safety_h100.sh
|
|
73
|
+
A code/competition_models/platform/h100/run_safety_rehearsal_h100.sh
|
|
74
|
+
A code/competition_models/platform/h100/run_safety_track5_h100.sh
|
|
75
|
+
A code/competition_models/platform/h100/run_train_track4_h100.sh
|
|
76
|
+
A code/competition_models/platform/h100/t5dev.sh
|
|
77
|
+
A code/competition_models/platform/h100/t7dev.sh
|
|
78
|
+
A code/competition_models/platform/h100/t8dev.sh
|
|
79
|
+
M code/competition_models/platform/h100/weights_mounts.sh
|
|
80
|
+
M code/competition_models/platform/portable/README.md
|
|
81
|
+
A code/competition_models/platform/portable/compmodels_patch/__init__.py
|
|
82
|
+
A code/competition_models/platform/portable/compmodels_patch/__main__.py
|
|
83
|
+
A code/competition_models/platform/portable/compmodels_patch/cli.py
|
|
84
|
+
M code/competition_models/platform/portable/env.sh
|
|
85
|
+
M code/competition_models/platform/portable/install.sh
|
|
86
|
+
M code/competition_models/platform/portable/start.sh
|
|
87
|
+
A code/competition_models/platform/survey_public_models.py
|
|
88
|
+
M code/competition_models/pyproject.toml
|
|
89
|
+
M code/competition_models/src/compmodels/baselines/track4.py
|
|
90
|
+
M code/competition_models/src/compmodels/baselines/track5.py
|
|
91
|
+
M code/competition_models/src/compmodels/baselines/track7.py
|
|
92
|
+
M code/competition_models/src/compmodels/baselines/track8.py
|
|
93
|
+
M code/competition_models/src/compmodels/data/series_loader.py
|
|
94
|
+
A code/competition_models/src/compmodels/data/track4_table.py
|
|
95
|
+
A code/competition_models/src/compmodels/data/track5_table.py
|
|
96
|
+
A code/competition_models/src/compmodels/data/track7_table.py
|
|
97
|
+
A code/competition_models/src/compmodels/data/track8_table.py
|
|
98
|
+
M code/competition_models/src/compmodels/harness/anatomy_case.py
|
|
99
|
+
M code/competition_models/src/compmodels/harness/heads.py
|
|
100
|
+
M code/competition_models/src/compmodels/metrics/clinical/track4.py
|
|
101
|
+
M code/competition_models/src/compmodels/metrics/clinical/track5.py
|
|
102
|
+
M code/competition_models/src/compmodels/metrics/clinical/track7.py
|
|
103
|
+
M code/competition_models/src/compmodels/paths.py
|
|
104
|
+
A code/competition_models/src/compmodels/platform/rehearsal.py
|
|
105
|
+
M code/competition_models/src/compmodels/predict.py
|
|
106
|
+
A code/competition_models/src/compmodels/safety/anatomy_likelihood.py
|
|
107
|
+
A code/competition_models/src/compmodels/safety/brain.py
|
|
108
|
+
A code/competition_models/src/compmodels/safety/ct.py
|
|
109
|
+
M code/competition_models/src/compmodels/safety/fit.py
|
|
110
|
+
A code/competition_models/src/compmodels/safety/fit_profile.py
|
|
111
|
+
A code/competition_models/src/compmodels/safety/mr.py
|
|
112
|
+
A code/competition_models/src/compmodels/safety/planar.py
|
|
113
|
+
A code/competition_models/src/compmodels/safety/prepass.py
|
|
114
|
+
A code/competition_models/src/compmodels/safety/profiles.py
|
|
115
|
+
M code/competition_models/src/compmodels/schema/track7.py
|
|
116
|
+
M code/competition_models/src/compmodels/scoring/__main__.py
|
|
117
|
+
M code/competition_models/src/compmodels/scoring/split.py
|
|
118
|
+
M code/competition_models/src/compmodels/scoring/truth.py
|
|
119
|
+
A code/competition_models/src/compmodels/scoring/truth4.py
|
|
120
|
+
A code/competition_models/src/compmodels/scoring/truth_track5.py
|
|
121
|
+
A code/competition_models/src/compmodels/scoring/truth_track7.py
|
|
122
|
+
A code/competition_models/src/compmodels/scoring/truth_track8.py
|
|
123
|
+
A code/competition_models/src/compmodels/training/_t7prof.py
|
|
124
|
+
A code/competition_models/src/compmodels/training/anatomy_mr.py
|
|
125
|
+
M code/competition_models/src/compmodels/training/competition_data.py
|
|
126
|
+
M code/competition_models/src/compmodels/training/phases.py
|
|
127
|
+
M code/competition_models/src/compmodels/training/register.py
|
|
128
|
+
A code/competition_models/src/compmodels/training/safety_pipeline.py
|
|
129
|
+
A code/competition_models/src/compmodels/training/safety_summary.py
|
|
130
|
+
A code/competition_models/src/compmodels/training/sequences.py
|
|
131
|
+
M code/competition_models/src/compmodels/training/spacing.py
|
|
132
|
+
M code/competition_models/src/compmodels/training/track2_platform.py
|
|
133
|
+
M code/competition_models/src/compmodels/training/track2_prepare.py
|
|
134
|
+
M code/competition_models/src/compmodels/training/track2_safety.py
|
|
135
|
+
A code/competition_models/src/compmodels/training/track4_export.py
|
|
136
|
+
A code/competition_models/src/compmodels/training/track4_features.py
|
|
137
|
+
A code/competition_models/src/compmodels/training/track4_heads.py
|
|
138
|
+
A code/competition_models/src/compmodels/training/track4_platform.py
|
|
139
|
+
A code/competition_models/src/compmodels/training/track4_post.py
|
|
140
|
+
A code/competition_models/src/compmodels/training/track4_prepare.py
|
|
141
|
+
A code/competition_models/src/compmodels/training/track4_register.py
|
|
142
|
+
A code/competition_models/src/compmodels/training/track4_sequences.py
|
|
143
|
+
A code/competition_models/src/compmodels/training/track4_weights.py
|
|
144
|
+
A code/competition_models/src/compmodels/training/track5_bone.py
|
|
145
|
+
A code/competition_models/src/compmodels/training/track5_export.py
|
|
146
|
+
A code/competition_models/src/compmodels/training/track5_geometry.py
|
|
147
|
+
A code/competition_models/src/compmodels/training/track5_headb.py
|
|
148
|
+
A code/competition_models/src/compmodels/training/track5_heads.py
|
|
149
|
+
A code/competition_models/src/compmodels/training/track5_labels.py
|
|
150
|
+
A code/competition_models/src/compmodels/training/track5_oof.py
|
|
151
|
+
A code/competition_models/src/compmodels/training/track5_platform.py
|
|
152
|
+
A code/competition_models/src/compmodels/training/track5_post.py
|
|
153
|
+
A code/competition_models/src/compmodels/training/track5_predict.py
|
|
154
|
+
A code/competition_models/src/compmodels/training/track5_prepare.py
|
|
155
|
+
A code/competition_models/src/compmodels/training/track5_pretrain.py
|
|
156
|
+
A code/competition_models/src/compmodels/training/track5_trainer.py
|
|
157
|
+
A code/competition_models/src/compmodels/training/track7_cine.py
|
|
158
|
+
A code/competition_models/src/compmodels/training/track7_export.py
|
|
159
|
+
A code/competition_models/src/compmodels/training/track7_features.py
|
|
160
|
+
A code/competition_models/src/compmodels/training/track7_headb.py
|
|
161
|
+
A code/competition_models/src/compmodels/training/track7_heads.py
|
|
162
|
+
A code/competition_models/src/compmodels/training/track7_labels.py
|
|
163
|
+
A code/competition_models/src/compmodels/training/track7_oof.py
|
|
164
|
+
A code/competition_models/src/compmodels/training/track7_platform.py
|
|
165
|
+
A code/competition_models/src/compmodels/training/track7_post.py
|
|
166
|
+
A code/competition_models/src/compmodels/training/track7_predict.py
|
|
167
|
+
A code/competition_models/src/compmodels/training/track7_prepare.py
|
|
168
|
+
A code/competition_models/src/compmodels/training/track7_pretrain.py
|
|
169
|
+
A code/competition_models/src/compmodels/training/track7_seg.py
|
|
170
|
+
A code/competition_models/src/compmodels/training/track8_detector.py
|
|
171
|
+
A code/competition_models/src/compmodels/training/track8_export.py
|
|
172
|
+
A code/competition_models/src/compmodels/training/track8_features.py
|
|
173
|
+
A code/competition_models/src/compmodels/training/track8_heads.py
|
|
174
|
+
A code/competition_models/src/compmodels/training/track8_labels.py
|
|
175
|
+
A code/competition_models/src/compmodels/training/track8_oof.py
|
|
176
|
+
A code/competition_models/src/compmodels/training/track8_platform.py
|
|
177
|
+
A code/competition_models/src/compmodels/training/track8_post.py
|
|
178
|
+
A code/competition_models/src/compmodels/training/track8_predict.py
|
|
179
|
+
A code/competition_models/src/compmodels/training/track8_prepare.py
|
|
180
|
+
A code/competition_models/src/compmodels/training/track8_pretrain.py
|
|
181
|
+
M console/apps/server/src/competition/browse.ts
|
|
182
|
+
M console/apps/server/src/competition/extractArchive.ts
|
|
183
|
+
A console/apps/server/src/competition/fixtures/track4_prepare_report.json
|
|
184
|
+
M console/apps/server/src/competition/harness.ts
|
|
185
|
+
M console/apps/server/src/competition/jobProcess.ts
|
|
186
|
+
M console/apps/server/src/competition/jobs.ts
|
|
187
|
+
M console/apps/server/src/competition/localJobs.ts
|
|
188
|
+
M console/apps/server/src/competition/modelPaths.ts
|
|
189
|
+
M console/apps/server/src/competition/outputs.ts
|
|
190
|
+
M console/apps/server/src/competition/pipeline.ts
|
|
191
|
+
M console/apps/server/src/competition/prepare.ts
|
|
192
|
+
A console/apps/server/src/competition/prepared.ts
|
|
193
|
+
M console/apps/server/src/competition/probeProgress.ts
|
|
194
|
+
M console/apps/server/src/competition/probeReport.ts
|
|
195
|
+
M console/apps/server/src/competition/progress.ts
|
|
196
|
+
A console/apps/server/src/competition/rehearsals.ts
|
|
197
|
+
M console/apps/server/src/competition/safety.ts
|
|
198
|
+
M console/apps/server/src/competition/scores.ts
|
|
199
|
+
M console/apps/server/src/competition/specialCases.ts
|
|
200
|
+
A console/apps/server/src/competition/trackDriverPipeline.ts
|
|
201
|
+
M console/apps/server/src/competition/training.ts
|
|
202
|
+
M console/apps/server/src/routes/competition.ts
|
|
203
|
+
A console/apps/server/src/routes/competitionPrepared.ts
|
|
204
|
+
M console/apps/server/src/routes/competitionViewer.ts
|
|
205
|
+
A console/apps/web/dist/assets/Texture-BDBiyj7t.js
|
|
206
|
+
D console/apps/web/dist/assets/Texture-CenTc2Bu.js
|
|
207
|
+
A console/apps/web/dist/assets/imageRetrievalPoolManager-C-uhZnDB.js
|
|
208
|
+
D console/apps/web/dist/assets/imageRetrievalPoolManager-CmISnr5d.js
|
|
209
|
+
D console/apps/web/dist/assets/index-9gf4Kb5W.js
|
|
210
|
+
D console/apps/web/dist/assets/index-B2OHvcio.css
|
|
211
|
+
D console/apps/web/dist/assets/index-B8gysun8.js
|
|
212
|
+
D console/apps/web/dist/assets/index-BMej_LUd.js
|
|
213
|
+
A console/apps/web/dist/assets/index-BvooWC8_.js
|
|
214
|
+
D console/apps/web/dist/assets/index-BznelDSM.js
|
|
215
|
+
A console/apps/web/dist/assets/index-CA2Bnay2.js
|
|
216
|
+
A console/apps/web/dist/assets/index-CR9Lt3gX.js
|
|
217
|
+
D console/apps/web/dist/assets/index-Co51RzS_.js
|
|
218
|
+
A console/apps/web/dist/assets/index-DGZ2rzpT.css
|
|
219
|
+
A console/apps/web/dist/assets/index-DO7mCZzg.js
|
|
220
|
+
D console/apps/web/dist/assets/index-GTZbUmPy.js
|
|
221
|
+
D console/apps/web/dist/assets/index-PrsPYhBy.js
|
|
222
|
+
A console/apps/web/dist/assets/index-ShI32SvU.js
|
|
223
|
+
A console/apps/web/dist/assets/index-boZNwP3m.js
|
|
224
|
+
A console/apps/web/dist/assets/index-iVKjLIhr.js
|
|
225
|
+
M console/apps/web/dist/index.html
|
|
226
|
+
M console/docs/API.md
|
|
227
|
+
M console/notebooks/.mie/context.json
|
|
228
|
+
M console/packages/shared/src/competition.ts
|
|
229
|
+
M console/packages/shared/src/competitionPrepare.ts
|
|
230
|
+
A console/packages/shared/src/competitionPrepared.ts
|
|
231
|
+
A console/packages/shared/src/competitionRehearsal.ts
|
|
232
|
+
M console/packages/shared/src/competitionSafety.ts
|
|
233
|
+
A console/packages/shared/src/competitionTrackDrivers.ts
|
|
234
|
+
A console/packages/shared/src/competitionTrackJobs.ts
|
|
235
|
+
M console/packages/shared/src/index.ts
|
|
236
|
+
M start.sh
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
20260929T183230Z
|
|
Binary file
|
compmodels_patch/cli.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""``compmodels-patch`` (also ``python -m compmodels_patch``): info | extract | apply | rollback.
|
|
2
|
+
|
|
3
|
+
The wheel carries, under ``compmodels_patch/bundle/``: ``compmodels-track2-patch-<stamp>.tar.gz`` (the very tarball
|
|
4
|
+
export_patch.sh makes), ``PATCH_STAMP``, ``BASE_STAMP`` and ``CHANGED.txt`` (copies, so ``info`` needs no extraction).
|
|
5
|
+
The workspace defaults to $COMP_WORKSPACE, else /2026aicompetition/workspace, else the current directory.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
import tarfile
|
|
15
|
+
from importlib import resources
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
DEFAULT_WORKSPACE = "/2026aicompetition/workspace"
|
|
19
|
+
STAMP_RE = re.compile(r"^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def stamp_to_version(stamp: str) -> str:
|
|
23
|
+
"""UTC bundle stamp -> PEP 440 version that sorts like the stamp: 20260929T093040Z -> 2026.9.29.93040."""
|
|
24
|
+
m = STAMP_RE.match(stamp.strip())
|
|
25
|
+
if not m:
|
|
26
|
+
raise ValueError(f"not a bundle stamp: {stamp!r}")
|
|
27
|
+
y, mo, d, hh, mm, ss = m.groups()
|
|
28
|
+
return f"{int(y)}.{int(mo)}.{int(d)}.{int(hh + mm + ss)}"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def version_to_stamp(version: str) -> str:
|
|
32
|
+
"""Inverse of stamp_to_version: 2026.9.29.93040 -> 20260929T093040Z."""
|
|
33
|
+
parts = version.strip().split(".")
|
|
34
|
+
if len(parts) != 4 or not all(p.isdigit() for p in parts):
|
|
35
|
+
raise ValueError(f"not a patch version: {version!r}")
|
|
36
|
+
y, mo, d, t = (int(p) for p in parts)
|
|
37
|
+
return f"{y:04d}{mo:02d}{d:02d}T{t:06d}Z"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def bundle_dir(root: Path | None = None) -> Path:
|
|
41
|
+
if root is not None:
|
|
42
|
+
return root
|
|
43
|
+
return Path(str(resources.files(__package__) / "bundle"))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def read(root: Path, name: str, default: str = "") -> str:
|
|
47
|
+
p = root / name
|
|
48
|
+
return p.read_text().strip() if p.exists() else default
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def tarball(root: Path) -> Path:
|
|
52
|
+
tars = sorted(root.glob("*.tar.gz"))
|
|
53
|
+
if len(tars) != 1:
|
|
54
|
+
raise SystemExit(f"[compmodels-patch] expected one tarball in {root}, found {len(tars)}")
|
|
55
|
+
return tars[0]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def workspace(arg: str | None) -> Path:
|
|
59
|
+
if arg:
|
|
60
|
+
return Path(arg)
|
|
61
|
+
env = os.environ.get("COMP_WORKSPACE")
|
|
62
|
+
if env:
|
|
63
|
+
return Path(env)
|
|
64
|
+
return Path(DEFAULT_WORKSPACE) if Path(DEFAULT_WORKSPACE).is_dir() else Path.cwd()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def say(*a: object) -> None:
|
|
68
|
+
print("[compmodels-patch]", *a, flush=True)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def cmd_info(args: argparse.Namespace, root: Path) -> int:
|
|
72
|
+
stamp, base = read(root, "PATCH_STAMP", "unknown"), read(root, "BASE_STAMP", "unknown")
|
|
73
|
+
tar = tarball(root)
|
|
74
|
+
changed = [l for l in read(root, "CHANGED.txt").splitlines() if l.strip()]
|
|
75
|
+
print(f"patch {stamp} (version {stamp_to_version(stamp) if STAMP_RE.match(stamp) else '?'}) made against full bundle {base}")
|
|
76
|
+
print(f"tarball {tar.name}: {tar.stat().st_size} bytes")
|
|
77
|
+
n = {k: sum(1 for l in changed if l.startswith(k + " ")) for k in "AMD"}
|
|
78
|
+
print(f"CHANGED.txt: {len(changed)} files ({n['A']} added, {n['M']} modified, {n['D']} removed)")
|
|
79
|
+
if args.changed:
|
|
80
|
+
for l in changed:
|
|
81
|
+
print(" ", l)
|
|
82
|
+
else:
|
|
83
|
+
for l in changed[:20]:
|
|
84
|
+
print(" ", l)
|
|
85
|
+
if len(changed) > 20:
|
|
86
|
+
print(f" ... ({len(changed) - 20} more: compmodels-patch info --changed)")
|
|
87
|
+
return 0
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def extract(root: Path, into: Path) -> Path:
|
|
91
|
+
stamp = read(root, "PATCH_STAMP", "unknown")
|
|
92
|
+
tar = tarball(root)
|
|
93
|
+
into.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
with tarfile.open(tar) as t:
|
|
95
|
+
top = {m.name.split("/", 1)[0] for m in t.getmembers()}
|
|
96
|
+
if len(top) != 1 or any(".." in m.name or m.name.startswith("/") for m in t.getmembers()):
|
|
97
|
+
raise SystemExit(f"[compmodels-patch] refusing {tar.name}: not a single-folder bundle")
|
|
98
|
+
(folder,) = top
|
|
99
|
+
if hasattr(tarfile, "data_filter"):
|
|
100
|
+
t.extractall(into, filter="data")
|
|
101
|
+
else: # Python < 3.12
|
|
102
|
+
t.extractall(into)
|
|
103
|
+
out = into / folder
|
|
104
|
+
if not (out / "patch.sh").exists():
|
|
105
|
+
raise SystemExit(f"[compmodels-patch] {out} has no patch.sh: not a patch bundle")
|
|
106
|
+
say(f"extracted patch {stamp} -> {out}")
|
|
107
|
+
return out
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def cmd_extract(args: argparse.Namespace, root: Path) -> int:
|
|
111
|
+
print(extract(root, workspace(args.into)))
|
|
112
|
+
return 0
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def cmd_apply(args: argparse.Namespace, root: Path) -> int:
|
|
116
|
+
folder = extract(root, workspace(args.into))
|
|
117
|
+
cmd = ["bash", str(folder / "patch.sh")] + (["--force"] if args.force else []) + (["--no-restart"] if args.no_restart else [])
|
|
118
|
+
say("running", " ".join(cmd))
|
|
119
|
+
return subprocess.call(cmd)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def cmd_rollback(args: argparse.Namespace, root: Path) -> int:
|
|
123
|
+
code = Path(os.environ.get("COMP_CODE_DIR", "/opt/compmodels"))
|
|
124
|
+
script = code / "platform" / "portable" / "patch.sh"
|
|
125
|
+
if not script.exists():
|
|
126
|
+
script = extract(root, workspace(args.into)) / "patch.sh"
|
|
127
|
+
cmd = ["bash", str(script), "--rollback"] + (["--force"] if args.force else []) + (["--no-restart"] if args.no_restart else [])
|
|
128
|
+
say("running", " ".join(cmd))
|
|
129
|
+
return subprocess.call(cmd)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
133
|
+
p = argparse.ArgumentParser(prog="compmodels-patch", description=__doc__.split("\n\n")[0])
|
|
134
|
+
p.add_argument("--bundle-dir", help=argparse.SUPPRESS) # tests: a directory instead of the packaged bundle/
|
|
135
|
+
sub = p.add_subparsers(dest="cmd", required=True)
|
|
136
|
+
s = sub.add_parser("info", help="stamp, base bundle, size and CHANGED.txt of the packaged patch")
|
|
137
|
+
s.add_argument("--changed", action="store_true", help="list every changed file")
|
|
138
|
+
s.set_defaults(fn=cmd_info)
|
|
139
|
+
for name, fn, h in (
|
|
140
|
+
("extract", cmd_extract, "extract the tarball into the workspace (prints the folder), nothing applied"),
|
|
141
|
+
("apply", cmd_apply, "extract and run the bundle's patch.sh (guards, backup, console restart as usual)"),
|
|
142
|
+
("rollback", cmd_rollback, "run patch.sh --rollback (the installed one, else the bundle's)"),
|
|
143
|
+
):
|
|
144
|
+
s = sub.add_parser(name, help=h)
|
|
145
|
+
s.add_argument("--into", help=f"workspace directory (default $COMP_WORKSPACE, else {DEFAULT_WORKSPACE}, else .)")
|
|
146
|
+
if name != "extract":
|
|
147
|
+
s.add_argument("--force", action="store_true", help="passed to patch.sh")
|
|
148
|
+
s.add_argument("--no-restart", action="store_true", help="passed to patch.sh")
|
|
149
|
+
s.set_defaults(fn=fn)
|
|
150
|
+
return p
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def main(argv: list[str] | None = None) -> int:
|
|
154
|
+
args = build_parser().parse_args(argv)
|
|
155
|
+
root = bundle_dir(Path(args.bundle_dir) if args.bundle_dir else None)
|
|
156
|
+
if not root.is_dir():
|
|
157
|
+
say(f"no bundle directory {root}: this wheel was not built by export_patch.sh")
|
|
158
|
+
return 2
|
|
159
|
+
try:
|
|
160
|
+
return int(args.fn(args, root) or 0)
|
|
161
|
+
except BrokenPipeError: # `compmodels-patch info | head`
|
|
162
|
+
os.dup2(os.open(os.devnull, os.O_WRONLY), sys.stdout.fileno())
|
|
163
|
+
return 0
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
if __name__ == "__main__":
|
|
167
|
+
sys.exit(main())
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: compmodels-patch
|
|
3
|
+
Version: 2026.9.29.183230
|
|
4
|
+
Summary: compmodels platform patch 20260929T183230Z against bundle 20260929T003841Z: pip install, then compmodels-patch apply
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
|
|
8
|
+
# compmodels-patch 2026.9.29.183230
|
|
9
|
+
|
|
10
|
+
Patch 20260929T183230Z of the compmodels platform bundle, made against the full bundle 20260929T003841Z (236 changed files). Inside the
|
|
11
|
+
platform container: `compmodels-patch info` lists the changed files, `compmodels-patch apply` extracts the bundle
|
|
12
|
+
into the workspace and runs its patch.sh, `compmodels-patch rollback` undoes the newest patch.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
compmodels_patch/__init__.py,sha256=awtnBGqeb8xyOP6FiOzlMdVIZhY3Vixa0TRZ2IG_Jwg,613
|
|
2
|
+
compmodels_patch/__main__.py,sha256=k1ocEWawweo1qCJWNFAAvyxz3tcY13dzvCenHszij30,48
|
|
3
|
+
compmodels_patch/cli.py,sha256=W_4kOPPvUwOBw5YGK5AiEWFMSSukgxznEysI69F5JU4,6843
|
|
4
|
+
compmodels_patch/bundle/BASE_STAMP,sha256=bUz2VAx5sWHIycDIBrwBG-UlEXgI3lEpFNpsMvEJJCI,17
|
|
5
|
+
compmodels_patch/bundle/CHANGED.txt,sha256=at4hjMQuLUQAOI-0riG2rvoHFx6laFU9TnERHeallbI,13885
|
|
6
|
+
compmodels_patch/bundle/PATCH_STAMP,sha256=DbwrkRXS5oXawTL849NOjGmvP0_eGiJtPmmEZdlzKKo,17
|
|
7
|
+
compmodels_patch/bundle/compmodels-track2-patch-20260929T183230Z.tar.gz,sha256=rkWEPlGXHEQJ_zNs06-dZuGN75_EAD1SgA1rXROKL6Y,13643367
|
|
8
|
+
compmodels_patch-2026.9.29.183230.dist-info/METADATA,sha256=iZu-iJEcTZLwrRmd35djG2IpW--SZyBfCl6XP3jPwVY,644
|
|
9
|
+
compmodels_patch-2026.9.29.183230.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
|
|
10
|
+
compmodels_patch-2026.9.29.183230.dist-info/entry_points.txt,sha256=3gHE36rxSEJfi15c2GE3L6_vDXc_RhPr4TWCaO9Nlco,63
|
|
11
|
+
compmodels_patch-2026.9.29.183230.dist-info/top_level.txt,sha256=Jq7wctPwDYMQcRywMQqixv0UFxXdvdZAfmnkOOAFzKw,17
|
|
12
|
+
compmodels_patch-2026.9.29.183230.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
compmodels_patch
|