| 
10 | 10 | 
 
  | 
11 | 11 | #include "git-compat-util.h"  | 
12 | 12 | #include "abspath.h"  | 
 | 13 | +#include "virtualfilesystem.h"  | 
13 | 14 | #include "config.h"  | 
14 | 15 | #include "convert.h"  | 
15 | 16 | #include "dir.h"  | 
@@ -1475,6 +1476,19 @@ enum pattern_match_result path_matches_pattern_list(  | 
1475 | 1476 | 	int result = NOT_MATCHED;  | 
1476 | 1477 | 	size_t slash_pos;  | 
1477 | 1478 | 
 
  | 
 | 1479 | +	if (core_virtualfilesystem) {  | 
 | 1480 | +		/*  | 
 | 1481 | +		* The virtual file system data is used to prevent git from traversing  | 
 | 1482 | +		* any part of the tree that is not in the virtual file system.  Return  | 
 | 1483 | +		* 1 to exclude the entry if it is not found in the virtual file system,  | 
 | 1484 | +		* else fall through to the regular excludes logic as it may further exclude.  | 
 | 1485 | +		*/  | 
 | 1486 | +		if (*dtype == DT_UNKNOWN)  | 
 | 1487 | +			*dtype = resolve_dtype(DT_UNKNOWN, istate, pathname, pathlen);  | 
 | 1488 | +		if (is_excluded_from_virtualfilesystem(pathname, pathlen, *dtype) > 0)  | 
 | 1489 | +			return 1;  | 
 | 1490 | +	}  | 
 | 1491 | + | 
1478 | 1492 | 	if (!pl->use_cone_patterns) {  | 
1479 | 1493 | 		pattern = last_matching_pattern_from_list(pathname, pathlen, basename,  | 
1480 | 1494 | 							dtype, pl, istate);  | 
@@ -1819,8 +1833,22 @@ struct path_pattern *last_matching_pattern(struct dir_struct *dir,  | 
1819 | 1833 | int is_excluded(struct dir_struct *dir, struct index_state *istate,  | 
1820 | 1834 | 		const char *pathname, int *dtype_p)  | 
1821 | 1835 | {  | 
1822 |  | -	struct path_pattern *pattern =  | 
1823 |  | -		last_matching_pattern(dir, istate, pathname, dtype_p);  | 
 | 1836 | +	struct path_pattern *pattern;  | 
 | 1837 | + | 
 | 1838 | +	if (core_virtualfilesystem) {  | 
 | 1839 | +		/*  | 
 | 1840 | +		* The virtual file system data is used to prevent git from traversing  | 
 | 1841 | +		* any part of the tree that is not in the virtual file system.  Return  | 
 | 1842 | +		* 1 to exclude the entry if it is not found in the virtual file system,  | 
 | 1843 | +		* else fall through to the regular excludes logic as it may further exclude.  | 
 | 1844 | +		*/  | 
 | 1845 | +		if (*dtype_p == DT_UNKNOWN)  | 
 | 1846 | +			*dtype_p = resolve_dtype(DT_UNKNOWN, istate, pathname, strlen(pathname));  | 
 | 1847 | +		if (is_excluded_from_virtualfilesystem(pathname, strlen(pathname), *dtype_p) > 0)  | 
 | 1848 | +			return 1;  | 
 | 1849 | +	}  | 
 | 1850 | + | 
 | 1851 | +	pattern = last_matching_pattern(dir, istate, pathname, dtype_p);  | 
1824 | 1852 | 	if (pattern)  | 
1825 | 1853 | 		return pattern->flags & PATTERN_FLAG_NEGATIVE ? 0 : 1;  | 
1826 | 1854 | 	return 0;  | 
@@ -2438,6 +2466,8 @@ static enum path_treatment treat_path(struct dir_struct *dir,  | 
2438 | 2466 | 						ignore_case);  | 
2439 | 2467 | 	if (dtype != DT_DIR && has_path_in_index)  | 
2440 | 2468 | 		return path_none;  | 
 | 2469 | +	if (is_excluded_from_virtualfilesystem(path->buf, path->len, dtype) > 0)  | 
 | 2470 | +		return path_excluded;  | 
2441 | 2471 | 
 
  | 
2442 | 2472 | 	/*  | 
2443 | 2473 | 	 * When we are looking at a directory P in the working tree,  | 
@@ -2642,6 +2672,8 @@ static void add_path_to_appropriate_result_list(struct dir_struct *dir,  | 
2642 | 2672 | 	/* add the path to the appropriate result list */  | 
2643 | 2673 | 	switch (state) {  | 
2644 | 2674 | 	case path_excluded:  | 
 | 2675 | +		if (is_excluded_from_virtualfilesystem(path->buf, path->len, DT_DIR) > 0)  | 
 | 2676 | +			break;  | 
2645 | 2677 | 		if (dir->flags & DIR_SHOW_IGNORED)  | 
2646 | 2678 | 			dir_add_name(dir, istate, path->buf, path->len);  | 
2647 | 2679 | 		else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||  | 
 | 
0 commit comments