Skip to content

fix(git): exclude untracked files from unstaged_files set#716

Merged
jdx merged 1 commit intojdx:mainfrom
nkakouros:nkakouros/fix/untracked
Mar 2, 2026
Merged

fix(git): exclude untracked files from unstaged_files set#716
jdx merged 1 commit intojdx:mainfrom
nkakouros:nkakouros/fix/untracked

Conversation

@nkakouros
Copy link
Copy Markdown
Contributor

Untracked files were incorrectly included in unstaged_files, causing hk run pre-commit with stash to pass untracked files to linters as input. Chain untracked_files explicitly in the no-stash default path to preserve hk check behavior.

I am not sure about the design goals of hk, but this seemed like wrong behavior for pre-commit.

Untracked files were incorrectly included in `unstaged_files`, causing
`hk run pre-commit` with stash to pass untracked files to linters as
input. Chain untracked_files explicitly in the no-stash default path to
preserve `hk check` behavior.
@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 resolves an issue where untracked files were mistakenly included in the unstaged_files collection, leading to hk run pre-commit processing these files when a stash was involved. The changes refine the Git status parsing in src/git.rs to accurately separate untracked files from unstaged modifications. Additionally, src/hook.rs is updated to explicitly manage untracked files in the pre-commit hook's file collection, ensuring correct behavior for both stashed and non-stashed scenarios, and a new test verifies this fix.

Highlights

  • Corrected unstaged_files definition: Modified src/git.rs to prevent untracked files (WT_NEW) from being incorrectly added to the unstaged_files set, ensuring only actual unstaged modifications are included.
  • Adjusted pre-commit file collection: Updated src/hook.rs to explicitly chain untracked_files in the default (no-stash) path for pre-commit hooks, preserving hk check behavior while unstaged_files no longer contains untracked items.
  • Added regression test: Introduced a new Bats test (test/untracked_not_processed_pre_commit.bats) to confirm that pre-commit with stashing correctly excludes untracked files from processing by linters.
Changelog
  • src/git.rs
    • Filtered WT_NEW status files from being added to the unstaged_files set.
    • Revised the comment and condition for adding files to unstaged_files to explicitly exclude untracked files.
  • src/hook.rs
    • Chained git_status.untracked_files to the list of files processed by the pre-commit hook in the default path.
  • test/untracked_not_processed_pre_commit.bats
    • Introduced a new Bats test case to validate that pre-commit with stashing does not include untracked files in its processing.
Activity
  • No activity has been recorded for this pull request yet.
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.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

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.

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 correctly excludes untracked files from the unstaged_files set, which fixes an issue where hk run pre-commit with stashing would incorrectly process untracked files. The changes are applied to both the libgit2 and shell-based git status parsing logic in src/git.rs. To maintain existing behavior for non-stashing scenarios like hk check, untracked_files are explicitly added back to the file list in src/hook.rs. A new bats test is also added to verify that untracked files are not passed to steps when using pre-commit with stashing. The changes are logical, well-targeted, and include appropriate testing. I have no further comments as the implementation is solid.

@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Mar 2, 2026

Greptile Summary

Fixes a bug where untracked files were incorrectly included in the unstaged_files set, causing hk run pre-commit with stash to incorrectly pass untracked files to linters.

Key Changes:

  • Modified git status parsing in src/git.rs to properly separate untracked files (status WT_NEW or ?) from unstaged modified files
  • Updated src/hook.rs to explicitly chain untracked_files in the default (no-stash) code path, preserving the intended behavior for hk check
  • Added comprehensive test coverage verifying pre-commit with stash mode only processes staged files

Confidence Score: 5/5

  • This PR is safe to merge with minimal risk
  • The fix is well-targeted, addresses a clear bug with correct logic, includes comprehensive test coverage, and properly preserves existing behavior for hk check while fixing the pre-commit stash behavior
  • No files require special attention

Important Files Changed

Filename Overview
src/git.rs Correctly excludes untracked files from unstaged_files set by checking st != git2::Status::WT_NEW and removing '?' from workdir status check
src/hook.rs Preserves hk check behavior by explicitly chaining untracked_files in the no-stash default path
test/untracked_not_processed_pre_commit.bats Comprehensive test verifying pre-commit with stash only processes staged files, not untracked files

Last reviewed commit: 55a83a4

@jdx jdx merged commit 5daeaa6 into jdx:main Mar 2, 2026
20 checks passed
@jdx
Copy link
Copy Markdown
Owner

jdx commented Mar 2, 2026

I think your change is correct

@jdx jdx mentioned this pull request Mar 2, 2026
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Mar 11, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [hk](https://github.com/jdx/hk) | minor | `1.36.0` → `1.38.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>jdx/hk (hk)</summary>

### [`v1.38.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1380---2026-03-06)

[Compare Source](jdx/hk@v1.37.0...v1.38.0)

##### 🚀 Features

- **(hook)** add `fail_on_fix` option by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;725](jdx/hk#725)

##### 🐛 Bug Fixes

- **(builtins)** remove redundant check/check\_diff from builtins by [@&#8203;nkakouros](https://github.com/nkakouros) in [#&#8203;726](jdx/hk#726)

##### 📦️ Dependency Updates

- update anthropics/claude-code-action digest to [`26ec041`](jdx/hk@26ec041) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;720](jdx/hk#720)
- update jdx/mise-action digest to [`e79ddf6`](jdx/hk@e79ddf6) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;721](jdx/hk#721)
- update actions-rust-lang/setup-rust-toolchain digest to [`a0b538f`](jdx/hk@a0b538f) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;719](jdx/hk#719)
- update rust crate tokio to v1.50.0 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;722](jdx/hk#722)

### [`v1.37.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1370---2026-03-03)

[Compare Source](jdx/hk@v1.36.0...v1.37.0)

##### 🚀 Features

- **(hook)** add env support to hooks by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;709](jdx/hk#709)
- parse Go-style diffs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;704](jdx/hk#704)

##### 🐛 Bug Fixes

- **(builtins)** strip extra trailing newlines in end-of-file-fixer by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;708](jdx/hk#708)
- **(docs)** correctly document what --all is about by [@&#8203;nkakouros](https://github.com/nkakouros) in [#&#8203;715](jdx/hk#715)
- **(git)** exclude untracked files from unstaged\_files set by [@&#8203;nkakouros](https://github.com/nkakouros) in [#&#8203;716](jdx/hk#716)
- **(hkrc)** config format and load order by [@&#8203;ivy](https://github.com/ivy) in [#&#8203;710](jdx/hk#710)
- **(release)** write release notes to file instead of capturing stdout by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;688](jdx/hk#688)
- **(release)** make release notes editorialization non-blocking by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;690](jdx/hk#690)
- **(step)** gate check\_diff forced check\_first on Fix mode only by [@&#8203;nkakouros](https://github.com/nkakouros) in [#&#8203;717](jdx/hk#717)

##### 📚 Documentation

- **(shanty)** add audio player with sea shanty recording by [@&#8203;jdx](https://github.com/jdx) in [67a25ad](jdx/hk@67a25ad)
- document config file search paths by [@&#8203;ivy](https://github.com/ivy) in [#&#8203;701](jdx/hk#701)
- require AI disclosure on GitHub comments by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;703](jdx/hk#703)

##### 🔍 Other Changes

- replace gen-release-notes script with communique by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;700](jdx/hk#700)
- add autofix.ci workflow by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;705](jdx/hk#705)

##### 📦️ Dependency Updates

- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;686](jdx/hk#686)
- update taiki-e/upload-rust-binary-action digest to [`f391289`](jdx/hk@f391289) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;692](jdx/hk#692)
- update anthropics/claude-code-action digest to [`c22f7c3`](jdx/hk@c22f7c3) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;691](jdx/hk#691)
- update rust crate libc to v0.2.181 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;694](jdx/hk#694)
- update rust crate clap to v4.5.58 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;693](jdx/hk#693)
- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;695](jdx/hk#695)
- update anthropics/claude-code-action digest to [`edd85d6`](jdx/hk@edd85d6) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;698](jdx/hk#698)
- update rust crate clap to v4.5.60 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;699](jdx/hk#699)
- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;702](jdx/hk#702)
- lock file maintenance by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;711](jdx/hk#711)

##### New Contributors

- [@&#8203;ivy](https://github.com/ivy) made their first contribution in [#&#8203;710](jdx/hk#710)
- [@&#8203;nkakouros](https://github.com/nkakouros) made their first contribution in [#&#8203;715](jdx/hk#715)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6Om1pbm9yIl19-->
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.

3 participants