read_directory: show_both option.
This teaches the internal read_directory() routine to return both interesting and ignored pathnames. Signed-off-by: Junio C Hamano <junkio@cox.net>maint
							parent
							
								
									08d22488a6
								
							
						
					
					
						commit
						4888c53409
					
				
							
								
								
									
										19
									
								
								dir.c
								
								
								
								
							
							
						
						
									
										19
									
								
								dir.c
								
								
								
								
							|  | @ -260,7 +260,8 @@ int excluded(struct dir_struct *dir, const char *pathname) | |||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void add_name(struct dir_struct *dir, const char *pathname, int len) | ||||
| static void add_name(struct dir_struct *dir, const char *pathname, int len, | ||||
| 		     int ignored_entry) | ||||
| { | ||||
| 	struct dir_entry *ent; | ||||
|  | ||||
|  | @ -273,6 +274,7 @@ static void add_name(struct dir_struct *dir, const char *pathname, int len) | |||
| 		dir->entries = xrealloc(dir->entries, alloc*sizeof(ent)); | ||||
| 	} | ||||
| 	ent = xmalloc(sizeof(*ent) + len + 1); | ||||
| 	ent->ignored_entry = ignored_entry; | ||||
| 	ent->len = len; | ||||
| 	memcpy(ent->name, pathname, len); | ||||
| 	ent->name[len] = 0; | ||||
|  | @ -314,6 +316,7 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co | |||
|  | ||||
| 		while ((de = readdir(fdir)) != NULL) { | ||||
| 			int len; | ||||
| 			int ignored_entry; | ||||
|  | ||||
| 			if ((de->d_name[0] == '.') && | ||||
| 			    (de->d_name[1] == 0 || | ||||
|  | @ -322,11 +325,12 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co | |||
| 				continue; | ||||
| 			len = strlen(de->d_name); | ||||
| 			memcpy(fullname + baselen, de->d_name, len+1); | ||||
| 			if (excluded(dir, fullname) != dir->show_ignored) { | ||||
| 				if (!dir->show_ignored || DTYPE(de) != DT_DIR) { | ||||
| 					continue; | ||||
| 				} | ||||
| 			} | ||||
| 			ignored_entry = excluded(dir, fullname); | ||||
|  | ||||
| 			if (!dir->show_both && | ||||
| 			    (ignored_entry != dir->show_ignored) && | ||||
| 			    (!dir->show_ignored || DTYPE(de) != DT_DIR)) | ||||
| 				continue; | ||||
|  | ||||
| 			switch (DTYPE(de)) { | ||||
| 			struct stat st; | ||||
|  | @ -364,7 +368,8 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co | |||
| 			if (check_only) | ||||
| 				goto exit_early; | ||||
| 			else | ||||
| 				add_name(dir, fullname, baselen + len); | ||||
| 				add_name(dir, fullname, baselen + len, | ||||
| 					 ignored_entry); | ||||
| 		} | ||||
| exit_early: | ||||
| 		closedir(fdir); | ||||
|  |  | |||
							
								
								
									
										6
									
								
								dir.h
								
								
								
								
							
							
						
						
									
										6
									
								
								dir.h
								
								
								
								
							|  | @ -13,7 +13,8 @@ | |||
|  | ||||
|  | ||||
| struct dir_entry { | ||||
| 	int len; | ||||
| 	unsigned ignored_entry : 1; | ||||
| 	unsigned int len : 15; | ||||
| 	char name[FLEX_ARRAY]; /* more */ | ||||
| }; | ||||
|  | ||||
|  | @ -29,7 +30,8 @@ struct exclude_list { | |||
|  | ||||
| struct dir_struct { | ||||
| 	int nr, alloc; | ||||
| 	unsigned int show_ignored:1, | ||||
| 	unsigned int show_both: 1, | ||||
| 		     show_ignored:1, | ||||
| 		     show_other_directories:1, | ||||
| 		     hide_empty_directories:1; | ||||
| 	struct dir_entry **entries; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano