From 00ddefa6b0a97793d02afafcc3d40907d390305c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 21:10:48 +0000 Subject: [PATCH 01/15] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.13.1 → v0.13.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.1...v0.13.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0f8640d69..bf4a19341 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: - id: check-toml - id: check-added-large-files - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.1 + rev: v0.13.2 hooks: - id: ruff-check args: [ --fix ] From eccc071aab324a97b7079231e61946eaa8eb3eb7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:39:24 +0000 Subject: [PATCH 02/15] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.13.2 → v0.13.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.2...v0.13.3) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bf4a19341..c501a7c41 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: - id: check-toml - id: check-added-large-files - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.2 + rev: v0.13.3 hooks: - id: ruff-check args: [ --fix ] From 1eb822c7b434e3fde117f3ad8e0537b27a10260f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 00:06:07 +0000 Subject: [PATCH 03/15] chore(deps): bump astral-sh/setup-uv from 6 to 7 Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6 to 7. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/v6...v7) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 40474ca74..d7f754a08 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -58,7 +58,7 @@ jobs: sudo apt update sudo apt install -y --no-install-recommends graphviz - name: Install the latest version of uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v7 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6 with: @@ -89,7 +89,7 @@ jobs: with: persist-credentials: false - name: Install the latest version of uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v7 - name: Install tox run: uv tool install tox --with=tox-uv - name: Show tox config From 2cedf76e334d452df43969998e2c81f99287bef8 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Fri, 17 Oct 2025 13:13:14 -0400 Subject: [PATCH 04/15] Bump tedana version. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6d01c945f..a27ab211f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "requests >= 2.27", "sdcflows >= 2.15.0", "smriprep >= 0.19.2", - "tedana >= 25.0.0", + "tedana >= 25.1.0", "templateflow >= 24.2.2", "transforms3d >= 0.4.2", "toml >= 0.10", From dc650953836b035c4ee9f6551ee916a8e85b066f Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Fri, 17 Oct 2025 13:16:08 -0400 Subject: [PATCH 05/15] Ignore non-steady-state volumes in T2* estimation. --- fmriprep/interfaces/multiecho.py | 8 ++++++++ fmriprep/workflows/bold/fit.py | 5 ++++- fmriprep/workflows/bold/t2s.py | 10 ++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/fmriprep/interfaces/multiecho.py b/fmriprep/interfaces/multiecho.py index 3c4196be9..d40be48e7 100644 --- a/fmriprep/interfaces/multiecho.py +++ b/fmriprep/interfaces/multiecho.py @@ -68,6 +68,11 @@ class T2SMapInputSpec(CommandLineInputSpec): 'monoexponential model is fit to the raw data.' ), ) + n_exclude = traits.Int( + argstr='--exclude %s', + position=5, + desc='Number of volumes from the beginning of the run to exclude from T2*/S0 estimation.', + ) class T2SMapOutputSpec(TraitedSpec): @@ -103,6 +108,9 @@ class T2SMap(CommandLine): def _format_arg(self, name, trait_spec, value): if name == 'echo_times': value = [te * 1000 for te in value] + if name == 'n_exclude': + # Convert to a range + value = f'0:{value}' return super()._format_arg(name, trait_spec, value) def _list_outputs(self): diff --git a/fmriprep/workflows/bold/fit.py b/fmriprep/workflows/bold/fit.py index 0586cde92..1d8e2b937 100644 --- a/fmriprep/workflows/bold/fit.py +++ b/fmriprep/workflows/bold/fit.py @@ -981,7 +981,10 @@ def init_bold_native_wf( # Do NOT set motion_xfm on outputnode # This prevents downstream resamplers from double-dipping workflow.connect([ - (inputnode, bold_t2s_wf, [('bold_mask', 'inputnode.bold_mask')]), + (inputnode, bold_t2s_wf, [ + ('bold_mask', 'inputnode.bold_mask'), + ('dummy_scans', 'inputnode.skip_vols'), + ]), (boldref_bold, join_echos, [('out_file', 'bold_files')]), (join_echos, bold_t2s_wf, [('bold_files', 'inputnode.bold_file')]), (join_echos, outputnode, [('bold_files', 'bold_echos')]), diff --git a/fmriprep/workflows/bold/t2s.py b/fmriprep/workflows/bold/t2s.py index 910d0c05e..780545c63 100644 --- a/fmriprep/workflows/bold/t2s.py +++ b/fmriprep/workflows/bold/t2s.py @@ -107,7 +107,10 @@ def init_bold_t2s_wf( The optimally combined time series was carried forward as the *preprocessed BOLD*. """ - inputnode = pe.Node(niu.IdentityInterface(fields=['bold_file', 'bold_mask']), name='inputnode') + inputnode = pe.Node( + niu.IdentityInterface(fields=['bold_file', 'bold_mask', 'skip_vols']), + name='inputnode', + ) outputnode = pe.Node(niu.IdentityInterface(fields=['bold', 't2star_map']), name='outputnode') @@ -122,7 +125,10 @@ def init_bold_t2s_wf( ) workflow.connect([ (inputnode, dilate_mask, [('bold_mask', 'in_mask')]), - (inputnode, t2smap_node, [('bold_file', 'in_files')]), + (inputnode, t2smap_node, [ + ('bold_file', 'in_files'), + ('skip_vols', 'n_exclude'), + ]), (dilate_mask, t2smap_node, [('out_mask', 'mask_file')]), (t2smap_node, outputnode, [('optimal_comb', 'bold'), ('t2star_map', 't2star_map')]), From dde664c7e36f42bfc53c6ab5cc0b40f8f282ab58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 00:10:21 +0000 Subject: [PATCH 06/15] chore(deps): bump prefix-dev/setup-pixi from 0.9.1 to 0.9.2 Bumps [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) from 0.9.1 to 0.9.2. - [Release notes](https://github.com/prefix-dev/setup-pixi/releases) - [Commits](https://github.com/prefix-dev/setup-pixi/compare/v0.9.1...v0.9.2) --- updated-dependencies: - dependency-name: prefix-dev/setup-pixi dependency-version: 0.9.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 38deab61e..d46d25a50 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 200 fetch-tags: true ref: ${{ github.ref }} - - uses: prefix-dev/setup-pixi@v0.9.1 + - uses: prefix-dev/setup-pixi@v0.9.2 with: pixi-version: v0.55.0 run-install: false From fdc3e14c475635ae563e167b485f6ac8b9aacf62 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Mon, 27 Oct 2025 13:23:09 -0400 Subject: [PATCH 07/15] chore(ci): Minimize uv cache --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d7f754a08..5595a074c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,9 @@ jobs: run: tox c - name: Run tox run: tox -v --exit-and-dump-after 1200 + - name: Minimize uv cache + run: uv cache prune --ci + if: ${{ always() }} - uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} @@ -96,3 +99,6 @@ jobs: run: tox c -e ${{ matrix.check }} - name: Run check run: tox -e ${{ matrix.check }} + - name: Minimize uv cache + run: uv cache prune --ci + if: ${{ always() }} From 615b7bacf1a8a67816fcaf6f0ba319efcea31c8b Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Mon, 27 Oct 2025 13:39:28 -0400 Subject: [PATCH 08/15] fix: Import LinAlgError from a stable location --- fmriprep/interfaces/patches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fmriprep/interfaces/patches.py b/fmriprep/interfaces/patches.py index ae602c99e..19b1191a9 100644 --- a/fmriprep/interfaces/patches.py +++ b/fmriprep/interfaces/patches.py @@ -33,7 +33,7 @@ import nipype.interfaces.io as nio from nipype.algorithms import confounds as nac from nipype.interfaces.base import File, traits -from numpy.linalg.linalg import LinAlgError +from numpy.linalg import LinAlgError class RobustACompCor(nac.ACompCor): From fc5140528e31c53ffde4eb5f872dc273af732604 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 28 Oct 2025 06:56:39 -0400 Subject: [PATCH 09/15] [DATALAD RUNCMD] pixi lock === Do not change lines below === { "chain": [], "cmd": "pixi lock", "exit": 0, "extra_inputs": [], "inputs": [ "pyproject.toml", "pixi.lock" ], "outputs": [ "pixi.lock" ], "pwd": "." } ^^^ Do not change lines above ^^^ --- pixi.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pixi.lock b/pixi.lock index 57be29962..682672b29 100644 --- a/pixi.lock +++ b/pixi.lock @@ -336,7 +336,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/0e/3d155e264d2ed2778484006ef04647bc63f55b3e2d12e6a4f787747b5900/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/79/0367ebd8a2edfdc46332b90bce1fd183e25078ed1b0d446c6bf42ea7ba7a/svgutils-0.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/7d/593a5639a6ec09688b7a5ce1a356fdf3e1aa232bb6cacc6fe4e3a697868f/tedana-25.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/85/1f86720e4fa7ddd4528f8bf2607617edd8a1ba600664c7947a66d0109f49/tedana-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/17/de29d90a6811d9b4b27d9dd6d5d9da9aa03ea0706430603766a57ef756df/templateflow-25.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl @@ -721,7 +721,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/0e/3d155e264d2ed2778484006ef04647bc63f55b3e2d12e6a4f787747b5900/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/79/0367ebd8a2edfdc46332b90bce1fd183e25078ed1b0d446c6bf42ea7ba7a/svgutils-0.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/7d/593a5639a6ec09688b7a5ce1a356fdf3e1aa232bb6cacc6fe4e3a697868f/tedana-25.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/85/1f86720e4fa7ddd4528f8bf2607617edd8a1ba600664c7947a66d0109f49/tedana-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/17/de29d90a6811d9b4b27d9dd6d5d9da9aa03ea0706430603766a57ef756df/templateflow-25.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl @@ -1083,7 +1083,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/0e/3d155e264d2ed2778484006ef04647bc63f55b3e2d12e6a4f787747b5900/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/79/0367ebd8a2edfdc46332b90bce1fd183e25078ed1b0d446c6bf42ea7ba7a/svgutils-0.3.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/7d/593a5639a6ec09688b7a5ce1a356fdf3e1aa232bb6cacc6fe4e3a697868f/tedana-25.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/85/1f86720e4fa7ddd4528f8bf2607617edd8a1ba600664c7947a66d0109f49/tedana-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/17/de29d90a6811d9b4b27d9dd6d5d9da9aa03ea0706430603766a57ef756df/templateflow-25.0.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl @@ -2135,8 +2135,8 @@ packages: requires_python: '>=3.9' - pypi: ./ name: fmriprep - version: 25.3.0.dev5+g8720e1331 - sha256: d28c31a592813a8c5bcc0eb1c87fbe0b48a74921fd21a6e204a83c4f8b3213f3 + version: 25.3.0.dev11+gdc6509538 + sha256: eb5e8869ff7f7c3c3454e11c4248ea8fe432f10ad9e70d2cc2240e0c29e2209a requires_dist: - acres>=0.2.0 - apscheduler>=3.10 @@ -2156,7 +2156,7 @@ packages: - requests>=2.27 - sdcflows>=2.15.0 - smriprep>=0.19.2 - - tedana>=25.0.0 + - tedana>=25.1.0 - templateflow>=24.2.2 - toml>=0.10 - transforms3d>=0.4.2 @@ -2206,8 +2206,8 @@ packages: editable: true - pypi: ./ name: fmriprep - version: 25.3.0.dev5+g8720e1331 - sha256: d28c31a592813a8c5bcc0eb1c87fbe0b48a74921fd21a6e204a83c4f8b3213f3 + version: 25.3.0.dev11+gdc6509538 + sha256: eb5e8869ff7f7c3c3454e11c4248ea8fe432f10ad9e70d2cc2240e0c29e2209a requires_dist: - acres>=0.2.0 - apscheduler>=3.10 @@ -2227,7 +2227,7 @@ packages: - requests>=2.27 - sdcflows>=2.15.0 - smriprep>=0.19.2 - - tedana>=25.0.0 + - tedana>=25.1.0 - templateflow>=24.2.2 - toml>=0.10 - transforms3d>=0.4.2 @@ -6440,10 +6440,10 @@ packages: purls: [] size: 177271 timestamp: 1755775913224 -- pypi: https://files.pythonhosted.org/packages/12/7d/593a5639a6ec09688b7a5ce1a356fdf3e1aa232bb6cacc6fe4e3a697868f/tedana-25.0.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/bc/85/1f86720e4fa7ddd4528f8bf2607617edd8a1ba600664c7947a66d0109f49/tedana-25.1.0-py3-none-any.whl name: tedana - version: 25.0.1 - sha256: 8d6e9e6f315f1ede67c655ac21424197e3ad557b8d3aec1937f6ec365042c311 + version: 25.1.0 + sha256: a0a8fb501f25b12559c98e8e55b0db0e164431fed311b614eff36d96e8b66964 requires_dist: - bokeh>=1.0.0,<=3.6.3 - mapca>=0.0.4,<=0.0.5 @@ -6451,7 +6451,7 @@ packages: - nibabel>=2.5.1,<=5.3.2 - nilearn>=0.10.3,<=0.11.1 - numpy>=1.16,<=2.2.4 - - pandas>=2.0,<=2.2.3 + - pandas>=2.0,<=2.3.3 - pybtex - pybtex-apa-style - robustica<=0.1.4,>=0.1.4 From 3aa2fccd2b69c41c825bf2199b10fb6cee370689 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Tue, 28 Oct 2025 09:08:54 -0400 Subject: [PATCH 10/15] Apply suggestions from code review Co-authored-by: Chris Markiewicz --- fmriprep/interfaces/multiecho.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fmriprep/interfaces/multiecho.py b/fmriprep/interfaces/multiecho.py index d40be48e7..66558caa0 100644 --- a/fmriprep/interfaces/multiecho.py +++ b/fmriprep/interfaces/multiecho.py @@ -69,7 +69,7 @@ class T2SMapInputSpec(CommandLineInputSpec): ), ) n_exclude = traits.Int( - argstr='--exclude %s', + argstr='--exclude 0:%d', position=5, desc='Number of volumes from the beginning of the run to exclude from T2*/S0 estimation.', ) @@ -108,9 +108,6 @@ class T2SMap(CommandLine): def _format_arg(self, name, trait_spec, value): if name == 'echo_times': value = [te * 1000 for te in value] - if name == 'n_exclude': - # Convert to a range - value = f'0:{value}' return super()._format_arg(name, trait_spec, value) def _list_outputs(self): From e7ce550f836f47c247c37f4029e9510360550685 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 28 Oct 2025 15:53:44 -0400 Subject: [PATCH 11/15] chore(ci): Add workflow to update pixi lock on PRs --- .github/workflows/docker.yml | 17 ---------- .github/workflows/pixi-lock.yml | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/pixi-lock.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d46d25a50..4b93b5421 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -18,23 +18,6 @@ env: FORCE_COLOR: true jobs: - check-pixi: - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v5 - with: - fetch-depth: 200 - fetch-tags: true - ref: ${{ github.ref }} - - uses: prefix-dev/setup-pixi@v0.9.2 - with: - pixi-version: v0.55.0 - run-install: false - - run: pixi lock --check - build-container: runs-on: ubuntu-latest permissions: diff --git a/.github/workflows/pixi-lock.yml b/.github/workflows/pixi-lock.yml new file mode 100644 index 000000000..768185347 --- /dev/null +++ b/.github/workflows/pixi-lock.yml @@ -0,0 +1,56 @@ +on: + pull_request_target: + paths: + - pyproject.toml + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + check-lockfile: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout pull request + uses: actions/checkout@v5 + with: + ref: ${{ github.event.pull_request.head.sha }} + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 + - name: Find submitting repository + id: get-source-repo + uses: actions/github-script@v8 + env: + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.repository }} + PULL: ${{ github.event.number }} + with: + script: | + const { data } = await github.rest.pulls.get({ + owner: process.env.OWNER, + repo: process.env.REPO.split('/')[1], + pull_number: process.env.PULL, + }); + core.setOutput('remote', data.head.repo.html_url) + core.setOutput('branch', data.head.ref) + - name: Set git identity + run: | + git config --global user.name "nipreps[bot]" + git config --global user.email "bot@nipreps.org" + - uses: prefix-dev/setup-pixi@v0.9.2 + with: + pixi-version: v0.58.0 + run-install: false + - name: Install the latest version of uv + uses: astral-sh/setup-uv@v7 + - name: Update lockfile + run: | + uvx datalad run -i pixi.lock -i pyproject.toml -o pixi.lock -- pixi lock + - name: Push updated lockfile, if needed + run: | + git push $REMOTE HEAD:$BRANCH + env: + REMOTE: ${{ steps.get-source-repo.outputs.remote }} + BRANCH: ${{ steps.get-source-repo.outputs.branch }} From d7e5307eaf92919f4d9c06cdd6fe50b81d72b79e Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 28 Oct 2025 18:06:12 -0400 Subject: [PATCH 12/15] chore(ci): Always run, commit only dependency updates --- .github/workflows/pixi-lock.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pixi-lock.yml b/.github/workflows/pixi-lock.yml index 768185347..a9f5dbd44 100644 --- a/.github/workflows/pixi-lock.yml +++ b/.github/workflows/pixi-lock.yml @@ -1,7 +1,5 @@ on: - pull_request_target: - paths: - - pyproject.toml + pull_request_target concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -46,8 +44,9 @@ jobs: - name: Install the latest version of uv uses: astral-sh/setup-uv@v7 - name: Update lockfile - run: | - uvx datalad run -i pixi.lock -i pyproject.toml -o pixi.lock -- pixi lock + run: > + uvx datalad run -i pixi.lock -i pyproject.toml -o pixi.lock -- + bash -c '! pixi lock --check || git checkout .' - name: Push updated lockfile, if needed run: | git push $REMOTE HEAD:$BRANCH From d0047f0940e2c246caa7c1b302c8d5a116f7c39d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 00:10:15 +0000 Subject: [PATCH 13/15] chore(deps): bump prefix-dev/setup-pixi from 0.9.2 to 0.9.3 Bumps [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) from 0.9.2 to 0.9.3. - [Release notes](https://github.com/prefix-dev/setup-pixi/releases) - [Commits](https://github.com/prefix-dev/setup-pixi/compare/v0.9.2...v0.9.3) --- updated-dependencies: - dependency-name: prefix-dev/setup-pixi dependency-version: 0.9.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/pixi-lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pixi-lock.yml b/.github/workflows/pixi-lock.yml index a9f5dbd44..9e51e857b 100644 --- a/.github/workflows/pixi-lock.yml +++ b/.github/workflows/pixi-lock.yml @@ -37,7 +37,7 @@ jobs: run: | git config --global user.name "nipreps[bot]" git config --global user.email "bot@nipreps.org" - - uses: prefix-dev/setup-pixi@v0.9.2 + - uses: prefix-dev/setup-pixi@v0.9.3 with: pixi-version: v0.58.0 run-install: false From 61094d435f1f2de60dd291384e0cce55820aebd7 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Mon, 24 Nov 2025 15:22:32 -0500 Subject: [PATCH 14/15] Raise error if two-echo data are provided. --- fmriprep/workflows/base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fmriprep/workflows/base.py b/fmriprep/workflows/base.py index ab5a461fc..4ff2a3713 100644 --- a/fmriprep/workflows/base.py +++ b/fmriprep/workflows/base.py @@ -834,6 +834,16 @@ def init_single_subject_wf( fieldmap_id = estimator_map.get(bold_file) jacobian = False + if len(bold_series) == 2: + # This should only be reached if two-echo data are provided and echo-idx is not. + # Raise an error in this case, until we figure out how to support two-echo data. + bold_series_str = '\n\t'.join(bold_series) + raise RuntimeError( + 'This BOLD series contains two echoes, which fMRIPrep does not support:\n' + f'\t{bold_series_str}\n' + 'Please set "--echo-idx" to process one echo at a time.' + ) + if fieldmap_id: if 'fmap-jacobian' in config.workflow.force: jacobian = True From 8ddb0ee3c64c117efa82463273372b2e04bda9c7 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Mon, 24 Nov 2025 15:22:32 -0500 Subject: [PATCH 15/15] Raise error if two-echo data are provided. --- fmriprep/workflows/base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fmriprep/workflows/base.py b/fmriprep/workflows/base.py index ab5a461fc..4ff2a3713 100644 --- a/fmriprep/workflows/base.py +++ b/fmriprep/workflows/base.py @@ -834,6 +834,16 @@ def init_single_subject_wf( fieldmap_id = estimator_map.get(bold_file) jacobian = False + if len(bold_series) == 2: + # This should only be reached if two-echo data are provided and echo-idx is not. + # Raise an error in this case, until we figure out how to support two-echo data. + bold_series_str = '\n\t'.join(bold_series) + raise RuntimeError( + 'This BOLD series contains two echoes, which fMRIPrep does not support:\n' + f'\t{bold_series_str}\n' + 'Please set "--echo-idx" to process one echo at a time.' + ) + if fieldmap_id: if 'fmap-jacobian' in config.workflow.force: jacobian = True