Skip to content

fix(task): correctly resolve task name for _default files with extensions#8646

Merged
jdx merged 4 commits intojdx:mainfrom
youta1119:fix/task-default-extension-strip
Mar 19, 2026
Merged

fix(task): correctly resolve task name for _default files with extensions#8646
jdx merged 4 commits intojdx:mainfrom
youta1119:fix/task-default-extension-strip

Conversation

@youta1119
Copy link
Copy Markdown
Contributor

Mise strips extensions from file task names, but _default files with extensions
were not recognized correctly (e.g., test/_default.sh was loaded as
test:_default instead of test).

🤖 Generated with Claude Code

…ions

_default files with extensions were not recognized correctly
(e.g., `test/_default.sh` was loaded as `test:_default` instead of `test`).

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a bug in how mise resolves task names for _default files that include file extensions. The fix ensures that the extension is correctly stripped, allowing _default files to be properly identified and their parent directory to be used as the task name. This improves the accuracy and consistency of task resolution within the system.

Highlights

  • Task Name Resolution: Corrected an issue where _default files with extensions were not properly recognized, leading to incorrect task names. For example, test/_default.sh will now correctly resolve to test instead of test:_default.
  • Code Logic Update: Modified the name_from_path function in src/task/mod.rs to strip file extensions from _default file names before determining the task name.
  • Improved Test Coverage: Added new end-to-end and unit tests to validate the correct resolution of _default tasks, including scenarios with and without file extensions.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Mar 18, 2026

Greptile Summary

This PR fixes a bug where _default files with extensions (e.g., test/_default.sh) were not resolved to the parent task name — they appeared as test:_default instead of test.

  • Root cause: The previous check name.strip_suffix(":_default") only matched a literal :_default suffix, so any file like _default.sh or _default.py passed through unchanged.
  • Fix: The new logic uses rsplit_once(':') to split the colon-joined name into its parent path and last segment, then calls the existing strip_extension() helper to normalize the last segment before comparing it to "_default". This correctly handles all extension variants.
  • Tests: Five new unit test cases are added to test_name_from_path covering no-extension, .sh, and .js variants at single and double nesting depth. The e2e test test_task_default is extended to create and run a foo/_default.sh task.
  • The fix is consistent with how the rest of name_from_path operates and does not change behavior for any previously working paths.

Confidence Score: 5/5

  • This PR is safe to merge — the fix is minimal, well-targeted, and thoroughly tested.
  • The change is a small, focused correction to a single helper function. The new logic correctly handles both the pre-existing no-extension case (regression tested) and the new extension variants. Unit tests cover three extensions and two nesting depths; the e2e test validates end-to-end behavior. No unrelated code paths are touched.
  • No files require special attention.

Important Files Changed

Filename Overview
src/task/mod.rs Core logic fix: replaces strip_suffix(":_default") with rsplit_once(':') + strip_extension() to handle _default files with arbitrary extensions. New unit tests cover .sh, .js, and no-extension variants at multiple nesting depths.
e2e/tasks/test_task_default E2E test extended to create a foo/_default.sh task and verify it registers as foo, not foo:_default, and can be invoked as mise tasks run foo.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[path: foo/_default.sh] --> B[strip_prefix + join components with ':']
    B --> C["name = 'foo:_default.sh'"]
    C --> D{"rsplit_once(':')"}
    D -->|Some| E["parent='foo', last='_default.sh'"]
    E --> F{"strip_extension(last) == '_default'?"}
    F -->|Yes| G["return Ok('foo')"]
    F -->|No| H["return Ok(name)"]
    D -->|None| H
    I["OLD: name.strip_suffix(':_default')"] -->|Only matched no-extension| J["return 'foo' for 'foo:_default'"]
    I -->|Missed| K["'foo:_default.sh' returned unchanged ❌"]
Loading

Last reviewed commit: "[autofix.ci] apply a..."

Comment thread src/task/mod.rs Outdated
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request correctly addresses the issue where _default task files with extensions were not properly recognized. The name_from_path function has been updated to correctly strip file extensions before checking for the _default suffix, ensuring that tasks like foo:_default.sh are resolved to foo. The added test cases in e2e/tasks/test_task_default and src/task/mod.rs adequately cover the new behavior, including various scenarios with and without file extensions. The changes are well-implemented and improve the robustness of task name resolution.

@jdx jdx merged commit 1cdec1d into jdx:main Mar 19, 2026
32 of 34 checks passed
jdx pushed a commit that referenced this pull request Mar 21, 2026
### 🐛 Bug Fixes

- **(config)** resolve trust hash collision for same-name directories by
@tdragon in [#8628](#8628)
- **(docs)** fix width of tools table by @himkt in
[#8625](#8625)
- **(docs)** prevent homepage hero atmosphere overflow by @nygmaaa in
[#8642](#8642)
- **(doctor)** detect PATH ordering issues when mise is activated by
@jdx in [#8585](#8585)
- **(git)** use origin as remote name by @bentinata in
[#8626](#8626)
- **(installer)** normalize current version before comparison by @tak848
in [#8649](#8649)
- **(lockfile)** Resolve symlink when updating lockfiles by @chancez in
[#8589](#8589)
- **(python)** verify checksums for precompiled binary downloads by
@malept in [#8593](#8593)
- **(rust)** resolve relative CARGO_HOME/RUSTUP_HOME to absolute paths
by @simonepri in [#8604](#8604)
- **(task)** correctly resolve task name for _default files with
extensions by @youta1119 in
[#8646](#8646)
- **(tasks)** global file tasks not properly marked as such by @roele in
[#8618](#8618)
- **(tasks)** handle broken pipe in table print and task completion
output by @vmaleze in [#8608](#8608)
- use dark/light logo variants in README for GitHub dark mode by @jdx in
[#8656](#8656)
- failing rebuild of runtime symlinks for shared tools by @roele in
[#8647](#8647)
- add spaces around current element operator in flutter version_expr by
@roele in [#8616](#8616)
- complete task arguments correctly by @KevSlashNull in
[#8601](#8601)

### 📚 Documentation

- switch body font to DM Sans and darken dark mode background by @jdx in
[6e3ad34](6e3ad34)
- use Cormorant Garamond for headers and Roc Grotesk for body text by
@jdx in
[010812a](010812a)
- resolve chaotic heading hierarchy in task-arguments.md by @muzimuzhi
in [#8644](#8644)

### 🧪 Testing

- fix test_java and mark as slow by @roele in
[#8634](#8634)

### 📦️ Dependency Updates

- update docker/dockerfile:1 docker digest to 4a43a54 by @renovate[bot]
in [#8657](#8657)
- update ghcr.io/jdx/mise:alpine docker digest to 2584470 by
@renovate[bot] in [#8658](#8658)

### 📦 Registry

- add viteplus (npm:vite-plus) by @risu729 in
[#8594](#8594)
- remove backend.options for podman by @roele in
[#8633](#8633)
- add pi.dev coding agent by @dector in
[#8635](#8635)
- add ormolu ([github:tweag/ormolu](https://github.com/tweag/ormolu)) by
@3w36zj6 in [#8617](#8617)
- use version_expr for dart and sort versions by @roele in
[#8631](#8631)

### New Contributors

- @bentinata made their first contribution in
[#8626](#8626)
- @tdragon made their first contribution in
[#8628](#8628)
- @nygmaaa made their first contribution in
[#8642](#8642)
- @youta1119 made their first contribution in
[#8646](#8646)
- @chancez made their first contribution in
[#8589](#8589)
- @dector made their first contribution in
[#8635](#8635)
- @tak848 made their first contribution in
[#8649](#8649)

## 📦 Aqua Registry Updates

#### New Packages (5)

- [`acsandmann/rift`](https://github.com/acsandmann/rift)
-
[`alltuner/mise-completions-sync`](https://github.com/alltuner/mise-completions-sync)
- [`berbicanes/apiark`](https://github.com/berbicanes/apiark)
-
[`gitlab.com/graphviz/graphviz`](https://github.com/gitlab.com/graphviz/graphviz)
-
[`jorgelbg/pinentry-touchid`](https://github.com/jorgelbg/pinentry-touchid)

#### Updated Packages (7)

- [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli)
- [`aquaproj/registry-tool`](https://github.com/aquaproj/registry-tool)
- [`go-swagger/go-swagger`](https://github.com/go-swagger/go-swagger)
-
[`gopinath-langote/1build`](https://github.com/gopinath-langote/1build)
- [`sassman/t-rec-rs`](https://github.com/sassman/t-rec-rs)
- [`sharkdp/fd`](https://github.com/sharkdp/fd)
- [`temporalio/cli`](https://github.com/temporalio/cli)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants