2013-01-06 17:58:08 +01:00
|
|
|
#include "cache.h"
|
|
|
|
#include "dir.h"
|
|
|
|
#include "pathspec.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Finds which of the given pathspecs match items in the index.
|
|
|
|
*
|
|
|
|
* For each pathspec, sets the corresponding entry in the seen[] array
|
|
|
|
* (which should be specs items long, i.e. the same size as pathspec)
|
|
|
|
* to the nature of the "closest" (i.e. most specific) match found for
|
|
|
|
* that pathspec in the index, if it was a closer type of match than
|
|
|
|
* the existing entry. As an optimization, matching is skipped
|
|
|
|
* altogether if seen[] already only contains non-zero entries.
|
|
|
|
*
|
|
|
|
* If seen[] has not already been written to, it may make sense
|
2013-01-06 17:58:09 +01:00
|
|
|
* to use find_pathspecs_matching_against_index() instead.
|
2013-01-06 17:58:08 +01:00
|
|
|
*/
|
2013-01-06 17:58:09 +01:00
|
|
|
void add_pathspec_matches_against_index(const char **pathspec,
|
|
|
|
char *seen, int specs)
|
2013-01-06 17:58:08 +01:00
|
|
|
{
|
|
|
|
int num_unmatched = 0, i;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Since we are walking the index as if we were walking the directory,
|
|
|
|
* we have to mark the matched pathspec as seen; otherwise we will
|
|
|
|
* mistakenly think that the user gave a pathspec that did not match
|
|
|
|
* anything.
|
|
|
|
*/
|
|
|
|
for (i = 0; i < specs; i++)
|
|
|
|
if (!seen[i])
|
|
|
|
num_unmatched++;
|
|
|
|
if (!num_unmatched)
|
|
|
|
return;
|
|
|
|
for (i = 0; i < active_nr; i++) {
|
|
|
|
struct cache_entry *ce = active_cache[i];
|
|
|
|
match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Finds which of the given pathspecs match items in the index.
|
|
|
|
*
|
2013-01-06 17:58:09 +01:00
|
|
|
* This is a one-shot wrapper around add_pathspec_matches_against_index()
|
|
|
|
* which allocates, populates, and returns a seen[] array indicating the
|
|
|
|
* nature of the "closest" (i.e. most specific) matches which each of the
|
|
|
|
* given pathspecs achieves against all items in the index.
|
2013-01-06 17:58:08 +01:00
|
|
|
*/
|
2013-01-06 17:58:09 +01:00
|
|
|
char *find_pathspecs_matching_against_index(const char **pathspec)
|
2013-01-06 17:58:08 +01:00
|
|
|
{
|
|
|
|
char *seen;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; pathspec[i]; i++)
|
|
|
|
; /* just counting */
|
|
|
|
seen = xcalloc(i, 1);
|
2013-01-06 17:58:09 +01:00
|
|
|
add_pathspec_matches_against_index(pathspec, seen, i);
|
2013-01-06 17:58:08 +01:00
|
|
|
return seen;
|
|
|
|
}
|