Merge branch 'ds/commit-graph-lockfile-fix'
Update to ds/generation-numbers topic. * ds/commit-graph-lockfile-fix: commit-graph: fix UX issue when .lock file exists commit-graph.txt: update design document merge: check config before loading commits commit: use generation number in remove_redundant() commit: add short-circuit to paint_down_to_common() commit: use generation numbers for in_merge_bases() ref-filter: use generation number for --contains commit-graph: always load commit-graph information commit: use generations in paint_down_to_common() commit-graph: compute generation numbers commit: add generation number to struct commit ref-filter: fix outdated comment on in_commit_list
This commit is contained in:
26
ref-filter.c
26
ref-filter.c
@ -16,6 +16,7 @@
|
||||
#include "trailer.h"
|
||||
#include "wt-status.h"
|
||||
#include "commit-slab.h"
|
||||
#include "commit-graph.h"
|
||||
|
||||
static struct ref_msg {
|
||||
const char *gone;
|
||||
@ -1662,12 +1663,13 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
|
||||
}
|
||||
|
||||
/*
|
||||
* Test whether the candidate or one of its parents is contained in the list.
|
||||
* Test whether the candidate is contained in the list.
|
||||
* Do not recurse to find out, though, but return -1 if inconclusive.
|
||||
*/
|
||||
static enum contains_result contains_test(struct commit *candidate,
|
||||
const struct commit_list *want,
|
||||
struct contains_cache *cache)
|
||||
struct contains_cache *cache,
|
||||
uint32_t cutoff)
|
||||
{
|
||||
enum contains_result *cached = contains_cache_at(cache, candidate);
|
||||
|
||||
@ -1683,6 +1685,10 @@ static enum contains_result contains_test(struct commit *candidate,
|
||||
|
||||
/* Otherwise, we don't know; prepare to recurse */
|
||||
parse_commit_or_die(candidate);
|
||||
|
||||
if (candidate->generation < cutoff)
|
||||
return CONTAINS_NO;
|
||||
|
||||
return CONTAINS_UNKNOWN;
|
||||
}
|
||||
|
||||
@ -1698,8 +1704,18 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
|
||||
struct contains_cache *cache)
|
||||
{
|
||||
struct contains_stack contains_stack = { 0, 0, NULL };
|
||||
enum contains_result result = contains_test(candidate, want, cache);
|
||||
enum contains_result result;
|
||||
uint32_t cutoff = GENERATION_NUMBER_INFINITY;
|
||||
const struct commit_list *p;
|
||||
|
||||
for (p = want; p; p = p->next) {
|
||||
struct commit *c = p->item;
|
||||
load_commit_graph_info(c);
|
||||
if (c->generation < cutoff)
|
||||
cutoff = c->generation;
|
||||
}
|
||||
|
||||
result = contains_test(candidate, want, cache, cutoff);
|
||||
if (result != CONTAINS_UNKNOWN)
|
||||
return result;
|
||||
|
||||
@ -1717,7 +1733,7 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
|
||||
* If we just popped the stack, parents->item has been marked,
|
||||
* therefore contains_test will return a meaningful yes/no.
|
||||
*/
|
||||
else switch (contains_test(parents->item, want, cache)) {
|
||||
else switch (contains_test(parents->item, want, cache, cutoff)) {
|
||||
case CONTAINS_YES:
|
||||
*contains_cache_at(cache, commit) = CONTAINS_YES;
|
||||
contains_stack.nr--;
|
||||
@ -1731,7 +1747,7 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
|
||||
}
|
||||
}
|
||||
free(contains_stack.contains_stack);
|
||||
return contains_test(candidate, want, cache);
|
||||
return contains_test(candidate, want, cache, cutoff);
|
||||
}
|
||||
|
||||
static int commit_contains(struct ref_filter *filter, struct commit *commit,
|
||||
|
Reference in New Issue
Block a user