Skip to content

Commit 53b06ef

Browse files
authored
Merge branch 'dev' into 8832-hashvalueerror
2 parents 7f9d906 + 3ee058b commit 53b06ef

12 files changed

Lines changed: 680 additions & 17 deletions

File tree

CONTRIBUTING.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,13 @@ By making a contribution to this project, I certify that:
303303
this project or the open source license(s) involved.
304304
```
305305

306+
> **Tip:** If you need to add a DCO remediation commit (e.g., after a force-push
307+
> or rebase), include `[skip ci]` in the commit message so the remediation
308+
> does not trigger unnecessary CI pipelines:
309+
> ```bash
310+
> git commit -s --allow-empty -m 'DCO Remediation Commit for... [skip ci]'
311+
> ```
312+
306313
#### Utility functions
307314
308315
MONAI provides a set of generic utility functions and frequently used routines.
@@ -358,6 +365,90 @@ Ideally, the new branch should be based on the latest `dev` branch.
358365
1. Reviewer and contributor may have discussions back and forth until all comments addressed.
359366
1. Wait for the pull request to be merged.
360367
368+
## Skipping CI
369+
370+
MONAI's CI pipelines run automatically on every push and pull request.
371+
These pipelines can be resource-intensive, especially the full premerge matrix
372+
which spans multiple OSes, Python versions, and PyTorch versions.
373+
374+
To reduce unnecessary resource consumption and speed up iteration, you can
375+
skip CI on commits that don't need automated validation — for example,
376+
documentation-only changes, README updates, workflow YAML changes, or WIP
377+
commits during development.
378+
379+
### Mechanism
380+
381+
GitHub Actions natively supports skipping `push` and `pull_request` workflows
382+
when the commit message contains any of the following strings:
383+
384+
- `[skip ci]`
385+
- `[ci skip]`
386+
- `[no ci]`
387+
- `[skip actions]`
388+
- `[actions skip]`
389+
390+
These are case-insensitive. `[skip ci]` is the recommended convention for
391+
this repository.
392+
393+
Alternatively, you can add a `skip-checks: true` trailer at the end of the
394+
commit message, preceded by two blank lines:
395+
396+
```
397+
commit message
398+
399+
skip-checks: true
400+
```
401+
402+
### Usage
403+
404+
Add the keyword anywhere in the commit message when committing:
405+
406+
```bash
407+
git commit -s -m 'update docs [skip ci]'
408+
```
409+
410+
If the HEAD commit of a pull request contains the skip instruction,
411+
the entire PR's pull_request-triggered workflows are skipped.
412+
413+
### Which workflows are affected
414+
415+
The skip instruction applies only to workflows triggered by `on: push` or
416+
`on: pull_request` events. All other workflows — those using `issue_comment`,
417+
`repository_dispatch`, `schedule`, or `workflow_dispatch` — use different
418+
event types and are **not** affected by `[skip ci]`.
419+
420+
### Important caveat
421+
422+
If a workflow is skipped via `[skip ci]`, its associated checks remain in
423+
"Pending" state. If your pull request requires those checks to pass before
424+
merging, you will need to push a new commit **without** the skip instruction
425+
to trigger the CI pipelines.
426+
427+
### When to use
428+
429+
Use `[skip ci]` for commits that are safe to skip CI:
430+
431+
- Documentation-only changes (`docs/`, `README.md`, docstrings)
432+
- Workflow configuration changes (`.github/`)
433+
- Repository metadata (`.gitignore`, `CONTRIBUTING.md`, `LICENSE`)
434+
- WIP or draft commits during local development
435+
436+
Do **not** use `[skip ci]` for commits that change:
437+
438+
- Source code in `monai/`
439+
- Test files in `tests/`
440+
- Dependencies (`requirements*.txt`, `setup.cfg`, `setup.py`)
441+
- Anything that could affect correctness or compatibility
442+
443+
### Quick example
444+
445+
```bash
446+
git commit -s -m 'fix typo in README [skip ci]'
447+
```
448+
449+
This commit will be recorded in the repository history but will not
450+
consume CI minutes.
451+
361452
## The code reviewing process
362453
363454
### Reviewing pull requests

docs/source/lazy_resampling.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ so the user must set lazy=True on the transforms that they still wish to execute
253253

254254
.. figure:: ../images/lazy_resampling_none_example.svg
255255

256-
Figure shwoing the effect of using ``lazy=False`` when ``Compose`` is being executed with ``lazy=None``. Note that
256+
Figure showing the effect of using ``lazy=False`` when ``Compose`` is being executed with ``lazy=None``. Note that
257257
the additional resamples that occur due to ``RandRotate90d`` being executed in a non-lazy fashion.
258258

259259

@@ -270,4 +270,4 @@ the following transform is a lazy transform, or is configured to execute lazily.
270270
.. figure:: ../images/lazy_resampling_apply_pending_example.svg
271271

272272
Figure showing the use of :class:`ApplyPendingd<monai.transforms.lazy.dictionary.ApplyPendingd>` to cause
273-
resampling to occur in the midele of a chain of lazy transforms.
273+
resampling to occur in the middle of a chain of lazy transforms.

docs/source/losses.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ Segmentation Losses
7878
.. autoclass:: BarlowTwinsLoss
7979
:members:
8080

81+
`BoundaryLoss`
82+
~~~~~~~~~~~~~~
83+
.. autoclass:: BoundaryLoss
84+
:members:
85+
8186
`HausdorffDTLoss`
8287
~~~~~~~~~~~~~~~~~
8388
.. autoclass:: HausdorffDTLoss

docs/source/modules.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ The workflow and some of MONAI event handlers are shown as below [[Workflow exam
205205

206206
### EnsembleEvaluator
207207

208-
A typical ensemble procoess is implemented as a ready-to-use workflow [[Cross validation and model ensemble tutorial]](https://github.com/Project-MONAI/tutorials/blob/main/modules/cross_validation_models_ensemble.ipynb):
208+
A typical ensemble process is implemented as a ready-to-use workflow [[Cross validation and model ensemble tutorial]](https://github.com/Project-MONAI/tutorials/blob/main/modules/cross_validation_models_ensemble.ipynb):
209209
1. Split all the training dataset into K folds.
210210
2. Train K models with every K-1 folds data.
211211
3. Execute inference on the test data with all the K models.

docs/source/whatsnew_1_5.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
- Support numpy 2.x and Pytorch 2.6
55
- MAISI inference accelerate
6-
- Bundles storage changed to huggingface and correspoinding api updated in core
6+
- Bundles storage changed to huggingface and corresponding api updated in core
77
- Ported remaining generative tutorials and bundles
88
- New tutorials:
99
- [2d_regression/image_restoration.ipynb](https://github.com/Project-MONAI/tutorials/blob/main/2d_regression/image_restoration.ipynb)

monai/apps/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ def download_url(
249249
if urlparse(url).netloc == "drive.google.com":
250250
if not has_gdown:
251251
raise RuntimeError("To download files from Google Drive, please install the gdown dependency.")
252-
if "fuzzy" not in gdown_kwargs:
252+
if "fuzzy" not in gdown_kwargs and not min_version(gdown, "6.0.0"): # "fuzzy" dropped in gdown 6.0.0
253253
gdown_kwargs["fuzzy"] = True # default to true for flexible url
254254
gdown.download(url, f"{tmp_name}", quiet=not progress, **gdown_kwargs)
255255
elif urlparse(url).netloc == "cloud-api.yandex.net":

monai/bundle/scripts.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,6 @@ def download_large_files(bundle_path: str | None = None, large_file_name: str |
20052005
parser.read_config(large_file_path)
20062006
large_files_list = parser.get()["large_files"]
20072007
for lf_data in large_files_list:
2008-
lf_data["fuzzy"] = True
20092008
if "hash_val" in lf_data and lf_data.get("hash_val", "") == "":
20102009
lf_data.pop("hash_val")
20112010
if "hash_type" in lf_data and lf_data.get("hash_type", "") == "":

monai/losses/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .adversarial_loss import PatchAdversarialLoss
1515
from .aucm_loss import AUCMLoss
1616
from .barlow_twins import BarlowTwinsLoss
17+
from .boundary_loss import BoundaryLoss
1718
from .cldice import SoftclDiceLoss, SoftDiceclDiceLoss
1819
from .contrastive import ContrastiveLoss
1920
from .deform import BendingEnergyLoss, DiffusionLoss

0 commit comments

Comments
 (0)