dir.c: move, rename and export match_attrs()
The function will be reused for matching attributes in pathspec when walking trees (currently it's used for matching pathspec when walking a list). pathspec.c would be a more neutral place for this. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									93e23798ef
								
							
						
					
					
						commit
						22af33bece
					
				
							
								
								
									
										41
									
								
								dir.c
								
								
								
								
							
							
						
						
									
										41
									
								
								dir.c
								
								
								
								
							|  | @ -276,44 +276,6 @@ static int do_read_blob(const struct object_id *oid, struct oid_stat *oid_stat, | ||||||
| #define DO_MATCH_DIRECTORY (1<<1) | #define DO_MATCH_DIRECTORY (1<<1) | ||||||
| #define DO_MATCH_SUBMODULE (1<<2) | #define DO_MATCH_SUBMODULE (1<<2) | ||||||
|  |  | ||||||
| static int match_attrs(const struct index_state *istate, |  | ||||||
| 		       const char *name, int namelen, |  | ||||||
| 		       const struct pathspec_item *item) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	char *to_free = NULL; |  | ||||||
|  |  | ||||||
| 	if (name[namelen]) |  | ||||||
| 		name = to_free = xmemdupz(name, namelen); |  | ||||||
|  |  | ||||||
| 	git_check_attr(istate, name, item->attr_check); |  | ||||||
|  |  | ||||||
| 	free(to_free); |  | ||||||
|  |  | ||||||
| 	for (i = 0; i < item->attr_match_nr; i++) { |  | ||||||
| 		const char *value; |  | ||||||
| 		int matched; |  | ||||||
| 		enum attr_match_mode match_mode; |  | ||||||
|  |  | ||||||
| 		value = item->attr_check->items[i].value; |  | ||||||
| 		match_mode = item->attr_match[i].match_mode; |  | ||||||
|  |  | ||||||
| 		if (ATTR_TRUE(value)) |  | ||||||
| 			matched = (match_mode == MATCH_SET); |  | ||||||
| 		else if (ATTR_FALSE(value)) |  | ||||||
| 			matched = (match_mode == MATCH_UNSET); |  | ||||||
| 		else if (ATTR_UNSET(value)) |  | ||||||
| 			matched = (match_mode == MATCH_UNSPECIFIED); |  | ||||||
| 		else |  | ||||||
| 			matched = (match_mode == MATCH_VALUE && |  | ||||||
| 				   !strcmp(item->attr_match[i].value, value)); |  | ||||||
| 		if (!matched) |  | ||||||
| 			return 0; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Does 'match' match the given name? |  * Does 'match' match the given name? | ||||||
|  * A match is found if |  * A match is found if | ||||||
|  | @ -367,7 +329,8 @@ static int match_pathspec_item(const struct index_state *istate, | ||||||
| 	    strncmp(item->match, name - prefix, item->prefix)) | 	    strncmp(item->match, name - prefix, item->prefix)) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	if (item->attr_match_nr && !match_attrs(istate, name, namelen, item)) | 	if (item->attr_match_nr && | ||||||
|  | 	    !match_pathspec_attrs(istate, name, namelen, item)) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	/* If the match was just the prefix, we matched */ | 	/* If the match was just the prefix, we matched */ | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								pathspec.c
								
								
								
								
							
							
						
						
									
										38
									
								
								pathspec.c
								
								
								
								
							|  | @ -659,3 +659,41 @@ void clear_pathspec(struct pathspec *pathspec) | ||||||
| 	FREE_AND_NULL(pathspec->items); | 	FREE_AND_NULL(pathspec->items); | ||||||
| 	pathspec->nr = 0; | 	pathspec->nr = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int match_pathspec_attrs(const struct index_state *istate, | ||||||
|  | 			 const char *name, int namelen, | ||||||
|  | 			 const struct pathspec_item *item) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	char *to_free = NULL; | ||||||
|  |  | ||||||
|  | 	if (name[namelen]) | ||||||
|  | 		name = to_free = xmemdupz(name, namelen); | ||||||
|  |  | ||||||
|  | 	git_check_attr(istate, name, item->attr_check); | ||||||
|  |  | ||||||
|  | 	free(to_free); | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < item->attr_match_nr; i++) { | ||||||
|  | 		const char *value; | ||||||
|  | 		int matched; | ||||||
|  | 		enum attr_match_mode match_mode; | ||||||
|  |  | ||||||
|  | 		value = item->attr_check->items[i].value; | ||||||
|  | 		match_mode = item->attr_match[i].match_mode; | ||||||
|  |  | ||||||
|  | 		if (ATTR_TRUE(value)) | ||||||
|  | 			matched = (match_mode == MATCH_SET); | ||||||
|  | 		else if (ATTR_FALSE(value)) | ||||||
|  | 			matched = (match_mode == MATCH_UNSET); | ||||||
|  | 		else if (ATTR_UNSET(value)) | ||||||
|  | 			matched = (match_mode == MATCH_UNSPECIFIED); | ||||||
|  | 		else | ||||||
|  | 			matched = (match_mode == MATCH_VALUE && | ||||||
|  | 				   !strcmp(item->attr_match[i].value, value)); | ||||||
|  | 		if (!matched) | ||||||
|  | 			return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -111,5 +111,8 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, | ||||||
| 					char *seen); | 					char *seen); | ||||||
| char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, | char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, | ||||||
| 					    const struct index_state *istate); | 					    const struct index_state *istate); | ||||||
|  | int match_pathspec_attrs(const struct index_state *istate, | ||||||
|  | 			 const char *name, int namelen, | ||||||
|  | 			 const struct pathspec_item *item); | ||||||
|  |  | ||||||
| #endif /* PATHSPEC_H */ | #endif /* PATHSPEC_H */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy