summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pathspec.c12
-rw-r--r--pathspec.h2
-rw-r--r--preload-index.c4
3 files changed, 18 insertions, 0 deletions
diff --git a/pathspec.c b/pathspec.c
index 08e6c523e7..a32e379e6f 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -251,6 +251,18 @@ static void eat_long_magic(struct pathspec_item *item, const char *elt,
*copyfrom_ = copyfrom;
}
+int pathspec_is_non_threadable(const struct pathspec *pathspec)
+{
+ int i;
+
+ for (i = 0; i < pathspec->nr; i++) {
+ const struct pathspec_item *item = &pathspec->items[i];
+ if (item->attr_check)
+ return 1;
+ }
+ return 0;
+}
+
/*
* Take an element of a pathspec and check for magic signatures.
* Append the result to the prefix. Return the magic bitmap.
diff --git a/pathspec.h b/pathspec.h
index 5308137485..07d21f01b6 100644
--- a/pathspec.h
+++ b/pathspec.h
@@ -115,4 +115,6 @@ extern void add_pathspec_matches_against_index(const struct pathspec *pathspec,
extern const char *check_path_for_gitlink(const char *path);
extern void die_if_path_beyond_symlink(const char *path, const char *prefix);
+extern int pathspec_is_non_threadable(const struct pathspec *);
+
#endif /* PATHSPEC_H */
diff --git a/preload-index.c b/preload-index.c
index c1fe3a3ef9..af468789f5 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -76,6 +76,10 @@ static void preload_index(struct index_state *index,
if (!core_preload_index)
return;
+ /* Do not preload when pathspec uses non-threadable subsystems */
+ if (pathspec && pathspec_is_non_threadable(pathspec))
+ return; /* for now ... */
+
threads = index->cache_nr / THREAD_COST;
if (threads < 2)
return;