diff options
author | Carlos Martín Nieto <cmn@elego.de> | 2015-04-16 16:05:12 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-04-16 10:17:04 -0700 |
commit | 245e1c196dab226675a02a8caca5a83373f5e4d4 (patch) | |
tree | 16a1586a6baed9c7d4203f6a5f9ce5c8efc876c7 | |
parent | fdf96a20acf96a6ac538df8113b2aafd6ed71d50 (diff) | |
download | git-245e1c196dab226675a02a8caca5a83373f5e4d4.tar.gz |
dir: allow a BOM at the beginning of exclude files
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | dir.c | 8 | ||||
-rwxr-xr-x | t/t7061-wtstatus-ignore.sh | 9 |
2 files changed, 16 insertions, 1 deletions
@@ -538,6 +538,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); @@ -574,7 +575,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 460789b4d8..cdc0747bf0 100755 --- a/t/t7061-wtstatus-ignore.sh +++ b/t/t7061-wtstatus-ignore.sh @@ -20,6 +20,15 @@ test_expect_success 'status untracked directory with --ignored' ' test_cmp expected actual ' +test_expect_success 'same with gitignore starting with BOM' ' + printf "\357\273\277ignored\n" >.gitignore && + mkdir -p untracked && + : >untracked/ignored && + : >untracked/uncommitted && + git status --porcelain --ignored >actual && + test_cmp expected actual +' + cat >expected <<\EOF ?? .gitignore ?? actual |