{"thread":{"id":"6105","subject":"[PATCH 4/5] read_directory: show_both option.","startedAt":"2006-12-25T11:11:34Z","lastAt":"2006-12-25T11:11:34Z","messageCount":1,"participants":["Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"30267","messageId":"7vvek0kz6h.fsf@assigned-by-dhcp.cox.net","threadId":"6105","inReplyTo":null,"subject":"[PATCH 4/5] read_directory: show_both option.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-12-25T11:11:34Z","receivedAt":"2006-12-25T11:11:34Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This teaches the internal read_directory() routine to return\nboth interesting and ignored pathnames.\n\nSigned-off-by: Junio C Hamano <junkio@cox.net>\n---\n dir.c |   19 ++++++++++++-------\n dir.h |    6 ++++--\n 2 files changed, 16 insertions(+), 9 deletions(-)\n\ndiff --git a/dir.c b/dir.c\nindex 8477472..dd188a8 100644\n--- a/dir.c\n+++ b/dir.c\n@@ -260,7 +260,8 @@ int excluded(struct dir_struct *dir, const char *pathname)\n \treturn 0;\n }\n \n-static void add_name(struct dir_struct *dir, const char *pathname, int len)\n+static void add_name(struct dir_struct *dir, const char *pathname, int len,\n+\t\t     int ignored_entry)\n {\n \tstruct dir_entry *ent;\n \n@@ -273,6 +274,7 @@ static void add_name(struct dir_struct *dir, const char *pathname, int len)\n \t\tdir->entries = xrealloc(dir->entries, alloc*sizeof(ent));\n \t}\n \tent = xmalloc(sizeof(*ent) + len + 1);\n+\tent->ignored_entry = ignored_entry;\n \tent->len = len;\n \tmemcpy(ent->name, pathname, len);\n \tent->name[len] = 0;\n@@ -314,6 +316,7 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co\n \n \t\twhile ((de = readdir(fdir)) != NULL) {\n \t\t\tint len;\n+\t\t\tint ignored_entry;\n \n \t\t\tif ((de->d_name[0] == '.') &&\n \t\t\t    (de->d_name[1] == 0 ||\n@@ -322,11 +325,12 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co\n \t\t\t\tcontinue;\n \t\t\tlen = strlen(de->d_name);\n \t\t\tmemcpy(fullname + baselen, de->d_name, len+1);\n-\t\t\tif (excluded(dir, fullname) != dir->show_ignored) {\n-\t\t\t\tif (!dir->show_ignored || DTYPE(de) != DT_DIR) {\n-\t\t\t\t\tcontinue;\n-\t\t\t\t}\n-\t\t\t}\n+\t\t\tignored_entry = excluded(dir, fullname);\n+\n+\t\t\tif (!dir->show_both &&\n+\t\t\t    (ignored_entry != dir->show_ignored) &&\n+\t\t\t    (!dir->show_ignored || DTYPE(de) != DT_DIR))\n+\t\t\t\tcontinue;\n \n \t\t\tswitch (DTYPE(de)) {\n \t\t\tstruct stat st;\n@@ -364,7 +368,8 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co\n \t\t\tif (check_only)\n \t\t\t\tgoto exit_early;\n \t\t\telse\n-\t\t\t\tadd_name(dir, fullname, baselen + len);\n+\t\t\t\tadd_name(dir, fullname, baselen + len,\n+\t\t\t\t\t ignored_entry);\n \t\t}\n exit_early:\n \t\tclosedir(fdir);\ndiff --git a/dir.h b/dir.h\nindex c919727..08c6345 100644\n--- a/dir.h\n+++ b/dir.h\n@@ -13,7 +13,8 @@\n \n \n struct dir_entry {\n-\tint len;\n+\tunsigned ignored_entry : 1;\n+\tunsigned int len : 15;\n \tchar name[FLEX_ARRAY]; /* more */\n };\n \n@@ -29,7 +30,8 @@ struct exclude_list {\n \n struct dir_struct {\n \tint nr, alloc;\n-\tunsigned int show_ignored:1,\n+\tunsigned int show_both: 1,\n+\t\t     show_ignored:1,\n \t\t     show_other_directories:1,\n \t\t     hide_empty_directories:1;\n \tstruct dir_entry **entries;\n-- \n1.4.4.3.g50da\n"}]}