mirror of
https://github.com/git-for-windows/git.git
synced 2026-02-03 18:59:59 -06:00
Merge branch 'dont-clean-junctions-fscache'
We already avoid traversing NTFS junction points in `git clean -dfx`. With this topic branch, we do that when the FSCache is enabled, too. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
commit
945ef1b85b
@ -1042,6 +1042,7 @@ int cmd_clean(int argc,
|
||||
|
||||
if (repo_read_index(the_repository) < 0)
|
||||
die(_("index file corrupt"));
|
||||
enable_fscache(the_repository->index->cache_nr);
|
||||
|
||||
pl = add_pattern_list(&dir, EXC_CMDL, "--exclude option");
|
||||
for (i = 0; i < exclude_list.nr; i++)
|
||||
@ -1116,6 +1117,7 @@ int cmd_clean(int argc,
|
||||
}
|
||||
}
|
||||
|
||||
disable_fscache();
|
||||
strbuf_release(&abs_path);
|
||||
strbuf_release(&buf);
|
||||
string_list_clear(&del_list, 0);
|
||||
|
||||
@ -3296,6 +3296,8 @@ pid_t waitpid(pid_t pid, int *status, int options)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int (*win32_is_mount_point)(struct strbuf *path) = mingw_is_mount_point;
|
||||
|
||||
int mingw_is_mount_point(struct strbuf *path)
|
||||
{
|
||||
WIN32_FIND_DATAW findbuf = { 0 };
|
||||
|
||||
@ -40,7 +40,8 @@ static inline void convert_slashes(char *path)
|
||||
}
|
||||
struct strbuf;
|
||||
int mingw_is_mount_point(struct strbuf *path);
|
||||
#define is_mount_point mingw_is_mount_point
|
||||
extern int (*win32_is_mount_point)(struct strbuf *path);
|
||||
#define is_mount_point win32_is_mount_point
|
||||
#define CAN_UNLINK_MOUNT_POINTS 1
|
||||
#define PATH_SEP ';'
|
||||
char *mingw_query_user_email(void);
|
||||
|
||||
@ -46,6 +46,7 @@ static struct trace_key trace_fscache = TRACE_KEY_INIT(FSCACHE);
|
||||
struct fsentry {
|
||||
struct hashmap_entry ent;
|
||||
mode_t st_mode;
|
||||
ULONG reparse_tag;
|
||||
/* Pointer to the directory listing, or NULL for the listing itself. */
|
||||
struct fsentry *list;
|
||||
/* Pointer to the next file entry of the list. */
|
||||
@ -202,6 +203,10 @@ static struct fsentry *fseentry_create_entry(struct fscache *cache,
|
||||
|
||||
fse = fsentry_alloc(cache, list, buf, len);
|
||||
|
||||
fse->reparse_tag =
|
||||
fdata->FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT ?
|
||||
fdata->EaSize : 0;
|
||||
|
||||
fse->st_mode = file_attr_to_st_mode(fdata->FileAttributes,
|
||||
fdata->EaSize);
|
||||
fse->dirent.d_type = S_ISREG(fse->st_mode) ? DT_REG :
|
||||
@ -472,6 +477,7 @@ int fscache_enable(size_t initial_size)
|
||||
/* redirect opendir and lstat to the fscache implementations */
|
||||
opendir = fscache_opendir;
|
||||
lstat = fscache_lstat;
|
||||
win32_is_mount_point = fscache_is_mount_point;
|
||||
}
|
||||
initialized++;
|
||||
LeaveCriticalSection(&fscache_cs);
|
||||
@ -532,6 +538,7 @@ void fscache_disable(void)
|
||||
/* reset opendir and lstat to the original implementations */
|
||||
opendir = dirent_opendir;
|
||||
lstat = mingw_lstat;
|
||||
win32_is_mount_point = mingw_is_mount_point;
|
||||
}
|
||||
LeaveCriticalSection(&fscache_cs);
|
||||
|
||||
@ -619,6 +626,44 @@ int fscache_lstat(const char *filename, struct stat *st)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* is_mount_point() replacement, uses cache if enabled, otherwise falls
|
||||
* back to mingw_is_mount_point().
|
||||
*/
|
||||
int fscache_is_mount_point(struct strbuf *path)
|
||||
{
|
||||
int dirlen, base, len;
|
||||
#pragma GCC diagnostic push
|
||||
#ifdef __clang__
|
||||
#pragma GCC diagnostic ignored "-Wflexible-array-extensions"
|
||||
#endif
|
||||
struct heap_fsentry key[2];
|
||||
#pragma GCC diagnostic pop
|
||||
struct fsentry *fse;
|
||||
struct fscache *cache = fscache_getcache();
|
||||
|
||||
if (!cache || !do_fscache_enabled(cache, path->buf))
|
||||
return mingw_is_mount_point(path);
|
||||
|
||||
cache->lstat_requests++;
|
||||
/* split path into path + name */
|
||||
len = path->len;
|
||||
if (len && is_dir_sep(path->buf[len - 1]))
|
||||
len--;
|
||||
base = len;
|
||||
while (base && !is_dir_sep(path->buf[base - 1]))
|
||||
base--;
|
||||
dirlen = base ? base - 1 : 0;
|
||||
|
||||
/* lookup entry for path + name in cache */
|
||||
fsentry_init(&key[0].u.ent, NULL, path->buf, dirlen);
|
||||
fsentry_init(&key[1].u.ent, &key[0].u.ent, path->buf + base, len - base);
|
||||
fse = fscache_get(cache, &key[1].u.ent);
|
||||
if (!fse)
|
||||
return mingw_is_mount_point(path);
|
||||
return fse->reparse_tag == IO_REPARSE_TAG_MOUNT_POINT;
|
||||
}
|
||||
|
||||
typedef struct fscache_DIR {
|
||||
struct DIR base_dir; /* extend base struct DIR */
|
||||
struct fsentry *pfsentry;
|
||||
|
||||
@ -22,6 +22,7 @@ void fscache_flush(void);
|
||||
|
||||
DIR *fscache_opendir(const char *dir);
|
||||
int fscache_lstat(const char *file_name, struct stat *buf);
|
||||
int fscache_is_mount_point(struct strbuf *path);
|
||||
|
||||
/* opaque fscache structure */
|
||||
struct fscache;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user