Re: [PATCH] dir: allow a BOM at the beginning of exclude files
On Thu, 2015-04-16 at 16:05 +0200, Carlos Martín Nieto wrote:
Show 8 quoted lines
> Some text editors like Notepad or LibreOffice write an UTF-8 BOM in
> order to indicate that the file is Unicode text rather than whatever the
> current locale would indicate.
>
> If someone uses such an editor to edit a gitignore file, we are left
> with those three bytes at the beginning of the file. If we do not skip
> them, we will attempt to match a filename with the BOM as prefix, which
> won't match the files the user is expecting.
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
which I keep forgetting.
Show 56 quoted lines
>
> ---
>
> If you're wondering how I came up with LibreOffice, I was doing a
> workshop recently and one of the participants was not content with the
> choice of vim or nano, so he opened LibreOffice to edit the gitignore
> file with confusing consequences.
>
> This codepath doesn't go as far as the config code in validating that
> we do not have a partial BOM which would mean there's some invalid
> content, but we don't really have invalid content any other way, as
> we're just dealing with a list of paths in the file.
>
> dir.c | 8 +++++++-
> t/t7061-wtstatus-ignore.sh | 2 ++
> 2 files changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/dir.c b/dir.c
> index 0943a81..6368247 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -581,6 +581,7 @@ int add_excludes_from_file_to_list(const char *fname,
> struct stat st;
> int fd, i, lineno = 1;
> size_t size = 0;
> + static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
> char *buf, *entry;
>
> fd = open(fname, O_RDONLY);
> @@ -617,7 +618,12 @@ int add_excludes_from_file_to_list(const char *fname,
> }
>
> el->filebuf = buf;
> - entry = buf;
> +
> + if (size >= 3 && !memcmp(buf, utf8_bom, 3))
> + entry = buf + 3;
> + else
> + entry = buf;
> +
> for (i = 0; i < size; i++) {
> if (buf[i] == '\n') {
> if (entry != buf + i && entry[0] != '#') {
> diff --git a/t/t7061-wtstatus-ignore.sh b/t/t7061-wtstatus-ignore.sh
> index 460789b..0a06fbf 100755
> --- a/t/t7061-wtstatus-ignore.sh
> +++ b/t/t7061-wtstatus-ignore.sh
> @@ -13,6 +13,8 @@ EOF
>
> test_expect_success 'status untracked directory with --ignored' '
> echo "ignored" >.gitignore &&
> + sed -e "s/^/\xef\xbb\xbf/" .gitignore >.gitignore.new &&
> + mv .gitignore.new .gitignore &&
> mkdir untracked &&
> : >untracked/ignored &&
> : >untracked/uncommitted &&