Liu Yubao wrote: > Hi, > Here is a minor optimization, the involved second "for" loop doesn't > need to start from beginning. > I found it when I debugged a strange problem on Cygwin, at last, I think it's a bug of Cygwin. $ touch hello.exe $ git add hello The following paths are ignored by one of your .gitignore files: hello Use -f if you really want to add them. Here is a ugly fix, I don't hope it will be merged into git tree as it's not git's fault, I will file a bug report for Cygwin. --- builtin-add.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/builtin-add.c b/builtin-add.c index 9d10fdc..ff1e74f 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -42,6 +42,9 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p for (i = 0; i < specs; i++) { struct stat st; const char *match; +#ifdef __CYGWIN__ + int fd; +#endif if (seen[i]) continue; @@ -50,9 +53,18 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p continue; /* Existing file? We must have ignored it */ +#ifdef __CYGWIN__ + /* + * On cygwin, lstat("hello", &st) returns 0 when + * "hello.exe" exists, so test with open() again. + */ + if (lstat(match, &st) && -1 != (fd = open(match, O_RDONLY))) { + struct dir_entry *ent; + close(fd); +#else if (!lstat(match, &st)) { struct dir_entry *ent; - +#endif ent = dir_add_name(dir, match, strlen(match)); ent->ignored = 1; if (S_ISDIR(st.st_mode)) -- 1.5.2.rc0.95.ga0715-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html