threads / bug / 62833

[bug] Using --ignore-space-at-eol with --name-only does not apply the filtering

Subject: [bug] Using --ignore-space-at-eol with --name-only does not apply the filtering

## tl;dr

2 messages between Jan 20, 2025 and Jan 20, 2025.

replies: 1people: 2as markdown or json

Bob Ruiken· Jan 20, 2025, 13:15 UTC · lore
Hi,

While doing some diffing work today I found a small issue combining a filtering and formatting flag. Let me know if anything is missing in this email, this is my first time reporting a bug here.

What did you do before the bug happened? (Steps to reproduce your issue) I'm using "git diff --name-only" to analyse the difference between the current branch and a target branch. Then I wanted to expand the preciseness, I don't actually care about spacing differences at the end of lines, for which I use the "--ignore-space-at-eol" flag. The problem comes in when combining the two flags: when I do "git diff --name-only --ignore-space-at-eol" the names of the files where only space changes at EOL are happening still appear.

What did you expect to happen? (Expected behavior) I expect the two flags "--name-only" and "--ignore-space-at-eol" to work together such that files not matching the latter filter are not shown in the output.

What happened instead? (Actual behavior) The files that the "--ignore-space-at-eol" flag is supposed to filter are still shown when "--name-only" is used.

What's different between what you expected and what actually happened? Filenames being resulted that do not match the filters added by flags.

Best regards,
Bob

[System Info] git version: git version 2.39.5 (Apple Git-154) cpu: arm64 no commit associated with this build sizeof-long: 8 sizeof-size_t: 8 shell-path: /bin/sh feature: fsmonitor--daemon uname: Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:14:38 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6020 arm64 compiler info: clang: 16.0.0 (clang-1600.0.26.6) libc info: no libc information available $SHELL (typically, interactive shell): /bin/zsh

shejialuo· Jan 20, 2025, 16:28 UTC · re: Bob Ruiken · lore

Re: [bug] Using --ignore-space-at-eol with --name-only does not apply the filtering

On Mon, Jan 20, 2025 at 03:15:54PM +0200, Bob Ruiken wrote:
Show 16 quoted lines
> Hi,
> 
> While doing some diffing work today I found a small issue combining a
> filtering and formatting flag. Let me know if anything is missing in
> this email, this is my first time reporting a bug here.
> 
> What did you do before the bug happened? (Steps to reproduce your issue)
> I'm using "git diff --name-only" to analyse the difference between the
> current branch and a target branch.
> Then I wanted to expand the preciseness, I don't actually care about
> spacing differences at the end of lines, for which I use the
> "--ignore-space-at-eol" flag.
> The problem comes in when combining the two flags: when I do "git diff
> --name-only --ignore-space-at-eol" the names of the files where only
> space changes at EOL are happening still appear.
> 

Thanks for your report, this problem could be reproduced in the master branch with the following shell commands:

```sh git init repo && cd repo printf "foo\n" > foo git add foo && git commit -mx && git branch test printf "foo \n" > foo git add foo && git commit -mx git diff master test --name-only --ignore-space-at-eol ```

Show 9 quoted lines
> What did you expect to happen? (Expected behavior)
> I expect the two flags "--name-only" and "--ignore-space-at-eol" to
> work together such that files not matching the latter filter are not
> shown in the output.
> 
> What happened instead? (Actual behavior)
> The files that the "--ignore-space-at-eol" flag is supposed to filter
> are still shown when "--name-only" is used.
> 

This logic is in the "diff.c::diff_flush" function, when specifying the "--name-only" option, it will set the "DIFF_FORMAT_NAME" bit which will let the code goes to the following control flow and then exit the function.

```c
	if (output_format & (DIFF_FORMAT_RAW |
			     DIFF_FORMAT_NAME |
			     DIFF_FORMAT_NAME_STATUS |
			     DIFF_FORMAT_CHECKDIFF)) {
		for (i = 0; i < q->nr; i++) {
			struct diff_filepair *p = q->queue[i];
			if (check_pair_status(p))
				flush_one_pair(p, options);
		}
		separator++;
	}
```

So as long as you specify "--name-only", from my understanding (maybe not correct here), there is no real diff here. We have just stored the information about which file is added, modified or deleted by comparing two trees.

Although you have specified "--ignore-space-at-eol", the code path does not care about this option at all. Because it simply uses the information described above to print the difference between the two trees without checking their real contents.

I am not familiar with the code in the diff part, it would cause too much effort for me to solve this problem. From my perspective, we need to explain more about "--name-only" option or we need to make sure that we cannot use both "--name-only" and "--ignore-space-at-eol" options.

Thanks, Jialuo

← back to recent threads