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>
This commit is contained in:

committed by
Junio C Hamano

parent
fdf96a20ac
commit
245e1c196d
6
dir.c
6
dir.c
@ -538,6 +538,7 @@ int add_excludes_from_file_to_list(const char *fname,
|
|||||||
struct stat st;
|
struct stat st;
|
||||||
int fd, i, lineno = 1;
|
int fd, i, lineno = 1;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
|
||||||
char *buf, *entry;
|
char *buf, *entry;
|
||||||
|
|
||||||
fd = open(fname, O_RDONLY);
|
fd = open(fname, O_RDONLY);
|
||||||
@ -574,7 +575,12 @@ int add_excludes_from_file_to_list(const char *fname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
el->filebuf = buf;
|
el->filebuf = buf;
|
||||||
|
|
||||||
|
if (size >= 3 && !memcmp(buf, utf8_bom, 3))
|
||||||
|
entry = buf + 3;
|
||||||
|
else
|
||||||
entry = buf;
|
entry = buf;
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
if (buf[i] == '\n') {
|
if (buf[i] == '\n') {
|
||||||
if (entry != buf + i && entry[0] != '#') {
|
if (entry != buf + i && entry[0] != '#') {
|
||||||
|
@ -20,6 +20,15 @@ test_expect_success 'status untracked directory with --ignored' '
|
|||||||
test_cmp expected actual
|
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
|
cat >expected <<\EOF
|
||||||
?? .gitignore
|
?? .gitignore
|
||||||
?? actual
|
?? actual
|
||||||
|
Reference in New Issue
Block a user