Skip to content

Commit da3799a

Browse files
committed
Merge branch 'rs/describe-with-lazy-queue-and-oidset'
Instead of scanning for the remaining items to see if there are still commits to be explored in the queue, use khash to remember which items are still on the queue (an unacceptable alternative is to reserve one object flag bits). * rs/describe-with-lazy-queue-and-oidset: describe: use oidset in finish_depth_computation()
2 parents f67058f + 30598cc commit da3799a

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

builtin/describe.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "commit-slab.h"
2525
#include "wildmatch.h"
2626
#include "prio-queue.h"
27+
#include "oidset.h"
2728

2829
#define MAX_TAGS (FLAG_BITS - 1)
2930
#define DEFAULT_CANDIDATES 10
@@ -286,38 +287,47 @@ static void lazy_queue_clear(struct lazy_queue *queue)
286287
queue->get_pending = false;
287288
}
288289

289-
static bool all_have_flag(const struct lazy_queue *queue, unsigned flag)
290+
static unsigned long finish_depth_computation(struct lazy_queue *queue,
291+
struct possible_tag *best)
290292
{
293+
unsigned long seen_commits = 0;
294+
struct oidset unflagged = OIDSET_INIT;
295+
291296
for (size_t i = queue->get_pending ? 1 : 0; i < queue->queue.nr; i++) {
292297
struct commit *commit = queue->queue.array[i].data;
293-
if (!(commit->object.flags & flag))
294-
return false;
298+
if (!(commit->object.flags & best->flag_within))
299+
oidset_insert(&unflagged, &commit->object.oid);
295300
}
296-
return true;
297-
}
298301

299-
static unsigned long finish_depth_computation(struct lazy_queue *queue,
300-
struct possible_tag *best)
301-
{
302-
unsigned long seen_commits = 0;
303302
while (!lazy_queue_empty(queue)) {
304303
struct commit *c = lazy_queue_get(queue);
305304
struct commit_list *parents = c->parents;
306305
seen_commits++;
307306
if (c->object.flags & best->flag_within) {
308-
if (all_have_flag(queue, best->flag_within))
307+
if (!oidset_size(&unflagged))
309308
break;
310-
} else
309+
} else {
310+
oidset_remove(&unflagged, &c->object.oid);
311311
best->depth++;
312+
}
312313
while (parents) {
314+
unsigned seen, flag_before, flag_after;
313315
struct commit *p = parents->item;
314316
repo_parse_commit(the_repository, p);
315-
if (!(p->object.flags & SEEN))
317+
seen = p->object.flags & SEEN;
318+
if (!seen)
316319
lazy_queue_put(queue, p);
320+
flag_before = p->object.flags & best->flag_within;
317321
p->object.flags |= c->object.flags;
322+
flag_after = p->object.flags & best->flag_within;
323+
if (!seen && !flag_after)
324+
oidset_insert(&unflagged, &p->object.oid);
325+
if (seen && !flag_before && flag_after)
326+
oidset_remove(&unflagged, &p->object.oid);
318327
parents = parents->next;
319328
}
320329
}
330+
oidset_clear(&unflagged);
321331
return seen_commits;
322332
}
323333

0 commit comments

Comments
 (0)