Skip to content

fix: when direnv diff is empty, do not try to parse it#8857

Merged
jdx merged 3 commits intojdx:mainfrom
yaleman:direnv-diff-eof
Apr 4, 2026
Merged

fix: when direnv diff is empty, do not try to parse it#8857
jdx merged 3 commits intojdx:mainfrom
yaleman:direnv-diff-eof

Conversation

@yaleman
Copy link
Copy Markdown
Contributor

@yaleman yaleman commented Apr 3, 2026

I kept getting the following error every time mise started with direnv and mise in my .zshrc:

mise WARN  failed to update DIRENV_DIFF: EOF while parsing a value at line 1 column 0 

When the DIRENV_DIFF environment variable was empty, the parser would bail out and it was a spurious warning.

This makes mise ignore empty diff's (and adds some more debug logging to figure out where it was failing 😄)

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 3, 2026

Greptile Summary

This PR fixes a spurious WARN failed to update DIRENV_DIFF: EOF while parsing a value that appeared whenever DIRENV_DIFF was set to an empty string. The fix short-circuits DirenvDiff::parse before any decoding/decompression when the input is empty, returning an empty diff that the existing new_path().is_empty() guard in update_direnv_diff then dismisses cleanly. Additional inspect_err calls in hook_env.rs improve debug visibility for any remaining parse failures without changing error-propagation semantics.

Confidence Score: 5/5

Safe to merge — the fix is minimal, correctly targets the reported bug, and does not alter any non-empty-input code paths.

All findings are P2 (missing test for the new empty-string branch). No logic errors, data-integrity issues, or security concerns were found. The existing new_path().is_empty() guard already handles the downstream consequence of an empty diff, so the fix integrates cleanly with the surrounding control flow.

No files require special attention.

Important Files Changed

Filename Overview
src/direnv.rs Adds early-return guard in DirenvDiff::parse when input is empty, returning an empty diff instead of attempting to base64-decode/decompress/JSON-parse an empty string (which caused a spurious "EOF while parsing" warning). No existing tests were updated to cover this new branch.
src/cli/hook_env.rs Adds inspect_err debug logging around each fallible call in update_direnv_diff to surface where exactly an error originates; logic and error-propagation behaviour are otherwise unchanged.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["DIRENV_DIFF env var present?"] -->|No| Z["Skip DIRENV_DIFF update"]
    A -->|"Yes - Some(input)"| B["update_direnv_diff(input, ...)"]
    B --> C{"input.is_empty()?"}
    C -->|"Yes - NEW"| D["Return empty DirenvDiff{}"]
    C -->|No| E["base64 decode → zlib decompress → JSON parse"]
    E -->|Error| F["inspect_err debug log → propagate Err"]
    F --> G["build_path_operations: warn!"]
    D --> H{"new_path().is_empty()?"}
    E -->|Ok| H
    H -->|Yes| I["Return Ok(None) — no DIRENV_DIFF patch"]
    H -->|No| J["remove_path_from_old_and_new"]
    J --> K["add_path_to_old_and_new"]
    K --> L["diff.dump() → EnvDiffOperation::Change"]
    L --> M["Return Ok(Some(op)) → pushed to patches"]
Loading

Reviews (2): Last reviewed commit: "suggestions from gemini" | Re-trigger Greptile

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

This pull request implements error logging for Direnv operations in hook_env.rs and adds a check for empty input in the DirenvDiff parser. The review feedback suggests standardizing the debug log format and including contextual path information in the error logs to assist with debugging.

@jdx jdx merged commit 45d5e39 into jdx:main Apr 4, 2026
34 checks passed
jdx pushed a commit that referenced this pull request Apr 5, 2026
### 🚀 Features

- **(ci)** auto-convert external PRs to draft mode by @jdx in
[#8896](#8896)
- **(deps)** add `depends` field for user-specified tool dependencies by
@cprecioso in [#8776](#8776)
- **(dotnet)** support runtime-only installs by @fragon10 in
[#8524](#8524)
- **(npm)** apply install_before to transitive dependencies by @risu729
in [#8851](#8851)
- **(task)** allow passing arguments to task dependencies via
{{usage.*}} templates by @jdx in
[#8893](#8893)
- add options field to BackendListVersionsCtx by @esteve in
[#8875](#8875)

### 🐛 Bug Fixes

- **(backend)** filter PEP 440 .dev versions in fuzzy version matching
by @richardthe3rd in [#8849](#8849)
- **(ci)** update COPR BuildRequires rust version to match MSRV 1.88 by
@jdx in [#8911](#8911)
- **(ci)** add Ruby build dependencies to e2e Docker image by @jdx in
[#8910](#8910)
- **(ci)** add missing build dependencies to e2e Docker image by @jdx in
[#8912](#8912)
- **(ci)** add missing build dependencies to e2e Docker image by @jdx in
[#8914](#8914)
- **(ci)** use Node 24 LTS for corepack e2e test by @jdx in
[#8915](#8915)
- **(ci)** add libxml2 and pkg-config to e2e Docker image by @jdx in
[#8917](#8917)
- **(ci)** add libxml2-dev to e2e image and disable Swift SPM tests by
@jdx in [#8918](#8918)
- **(docs)** use sans-serif font for badges by @jdx in
[#8887](#8887)
- **(env)** parse --env=VALUE and -E=VALUE flag forms correctly by @jdx
in [#8889](#8889)
- **(exec)** use i64::from() for seccomp syscall numbers to survive
autofix by @jdx in [#8882](#8882)
- **(github)** preserve tool options like filter_bins when version
specified via CLI by @jdx in
[#8888](#8888)
- **(github)** use alias-specific options when tool_alias has its own
config by @jdx in [#8892](#8892)
- **(install)** add locked_verify_provenance setting and detect github
attestations at lock time by @jdx in
[#8901](#8901)
- **(lock)** prune stale version entries during filtered `mise lock
<tool>` runs by @altendky in
[#8599](#8599)
- **(python)** use lockfile URL for precompiled installs by @hehaoqian
in [#8750](#8750)
- **(release)** verify all build targets succeed before releasing by
@jdx in [#8886](#8886)
- **(ruby)** support build revisions for precompiled binaries in
mise.lock by @jdx in [#8900](#8900)
- **(swift)** fall back to Ubuntu 24.04 for unsupported Ubuntu versions
by @jdx in [#8916](#8916)
- **(zsh)** avoid duplicate trust warning after cd by @timothysparg in
[#8898](#8898)
- update flake.lock and add fix for rust-bindgen to default.nix by
@esteve in [#8874](#8874)
- when direnv diff is empty, do not try to parse it by @yaleman in
[#8857](#8857)
- skip trust check for plain .tool-versions in task list by @dportalesr
in [#8876](#8876)

### 🚜 Refactor

- **(go)** rename go_* settings to go.* namespace by @jdbruijn in
[#8598](#8598)

### 📚 Documentation

- **(tasks)** clarify task_config.includes behavior by @risu729 in
[#8905](#8905)

### 🧪 Testing

- **(ci)** run e2e tests inside Docker containers by @jdx in
[#8899](#8899)

### 📦️ Dependency Updates

- bump ubi from 0.8 to 0.9 by @jdx in
[#8906](#8906)
- bump zip from 3 to 8 by @jdx in
[#8908](#8908)
- update lockfile deps (hold back rattler) by @jdx in
[#8909](#8909)
- update bun.lock by @jdx in
[#8913](#8913)

### 📦 Registry

- add turso
([github:tursodatabase/turso-cli](https://github.com/tursodatabase/turso-cli))
by @kenn in [#8884](#8884)
- remove carp test by @jdx in
[#8894](#8894)

### Chore

- **(ci)** add workflow to warn PRs modifying vendored aqua-registry by
@jdx in [#8897](#8897)
- **(ci)** use github.token for draft conversion in auto-draft workflow
by @jdx in [#8903](#8903)
- remove deprecated settings older than 12 months by @jdx in
[#8904](#8904)

### New Contributors

- @dportalesr made their first contribution in
[#8876](#8876)
- @timothysparg made their first contribution in
[#8898](#8898)
- @hehaoqian made their first contribution in
[#8750](#8750)
- @jdbruijn made their first contribution in
[#8598](#8598)
- @cprecioso made their first contribution in
[#8776](#8776)
- @yaleman made their first contribution in
[#8857](#8857)
- @kenn made their first contribution in
[#8884](#8884)
- @fragon10 made their first contribution in
[#8524](#8524)

## 📦 Aqua Registry Updates

#### New Packages (6)

- [`ahkohd/oyo`](https://github.com/ahkohd/oyo)
- [`bellicose100xp/jiq`](https://github.com/bellicose100xp/jiq)
- [`kurama/dealve-tui`](https://github.com/kurama/dealve-tui)
- [`micahkepe/jsongrep`](https://github.com/micahkepe/jsongrep)
- [`textfuel/lazyjira`](https://github.com/textfuel/lazyjira)
- [`ubugeeei/vize`](https://github.com/ubugeeei/vize)

#### Updated Packages (1)

- [`sigstore/cosign`](https://github.com/sigstore/cosign)
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