[clang] [clang-tools-extra] [flang] [lldb] [llvm] [openmp] [pstl] Finally formalise our defacto line-ending policy (PR #86318)

via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 22 03:54:45 PDT 2024


ldrumm wrote:

>> It's my understanding that text=auto does not override core.autocrlf. As far as I can tell from the documentation it honours the user's configuration for core.eol in combination with core.autocrlf - from git config --help:

> This doesn't match my experience.

I think this is due to a subtly of config. Setting `core.autocrlf` to `false` doesn't actually do anything since it's the default. In that case git is still in "no opinion" mode - which means it stores the input line endings and does no conversion.

However, once `eol=auto` is set in a `.gitattributes`, it forces git to use the configured eol config:

```c
static int text_eol_is_crlf(void)
{
	if (auto_crlf == AUTO_CRLF_TRUE)
		return 1;
	else if (auto_crlf == AUTO_CRLF_INPUT)
		return 0;
	if (core_eol == EOL_CRLF)
		return 1;
	if (core_eol == EOL_UNSET && EOL_NATIVE == EOL_CRLF)
		return 1;
	return 0;
}

static enum eol output_eol(enum convert_crlf_action crlf_action)
{
	switch (crlf_action) {
	case CRLF_BINARY:
		return EOL_UNSET;
	case CRLF_TEXT_CRLF:
		return EOL_CRLF;
	case CRLF_TEXT_INPUT:
		return EOL_LF;
	case CRLF_UNDEFINED:
	case CRLF_AUTO_CRLF:
		return EOL_CRLF;
	case CRLF_AUTO_INPUT:
		return EOL_LF;
	case CRLF_TEXT:
	case CRLF_AUTO:
		/* fall through */
		return text_eol_is_crlf() ? EOL_CRLF : EOL_LF;
	}
	warning(_("illegal crlf_action %d"), (int)crlf_action);
	return core_eol;
}
```
`output_eol` is the git function that decides to write out a file with CRLF or LF endings

Notice that now we hit the `CRLF_AUTO`  case so it's `text_eol_is_crlf() ? EOL_CRLF : EOL_LF;`
 
`text_eol_is_crlf()` checks against `core.autocrlf`. Since you've stated that it's `false`, then it then it checks `core.eol`.

So if I've read that correctly, `core.autocrlf=false` is a red herring and you should really set `core.eol=lf` if you want git to use `lf` on windows.

> Would we get there by setting the wildcard rule in .gitattrubtes to * text eof=lf, or something along those lines?

This patch is about respecting local config, which is the exact opposite of that suggestion. It would be a way to solve the line-ending issue by fiat, not by co-operation, so I'm against it on principle. To be clear I very much don't like CRLF, but I also very much don't like it when someone forces me to use wrong-handed tools. Windows users would be forced to use wrong handed tools if we force line-endings one way or another

https://github.com/llvm/llvm-project/pull/86318


More information about the cfe-commits mailing list