|
24 | 24 | #include "commit-slab.h"
|
25 | 25 | #include "wildmatch.h"
|
26 | 26 | #include "prio-queue.h"
|
| 27 | +#include "oidset.h" |
27 | 28 |
|
28 | 29 | #define MAX_TAGS (FLAG_BITS - 1)
|
29 | 30 | #define DEFAULT_CANDIDATES 10
|
@@ -286,38 +287,47 @@ static void lazy_queue_clear(struct lazy_queue *queue)
|
286 | 287 | queue->get_pending = false;
|
287 | 288 | }
|
288 | 289 |
|
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) |
290 | 292 | {
|
| 293 | + unsigned long seen_commits = 0; |
| 294 | + struct oidset unflagged = OIDSET_INIT; |
| 295 | + |
291 | 296 | for (size_t i = queue->get_pending ? 1 : 0; i < queue->queue.nr; i++) {
|
292 | 297 | 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); |
295 | 300 | }
|
296 |
| - return true; |
297 |
| -} |
298 | 301 |
|
299 |
| -static unsigned long finish_depth_computation(struct lazy_queue *queue, |
300 |
| - struct possible_tag *best) |
301 |
| -{ |
302 |
| - unsigned long seen_commits = 0; |
303 | 302 | while (!lazy_queue_empty(queue)) {
|
304 | 303 | struct commit *c = lazy_queue_get(queue);
|
305 | 304 | struct commit_list *parents = c->parents;
|
306 | 305 | seen_commits++;
|
307 | 306 | if (c->object.flags & best->flag_within) {
|
308 |
| - if (all_have_flag(queue, best->flag_within)) |
| 307 | + if (!oidset_size(&unflagged)) |
309 | 308 | break;
|
310 |
| - } else |
| 309 | + } else { |
| 310 | + oidset_remove(&unflagged, &c->object.oid); |
311 | 311 | best->depth++;
|
| 312 | + } |
312 | 313 | while (parents) {
|
| 314 | + unsigned seen, flag_before, flag_after; |
313 | 315 | struct commit *p = parents->item;
|
314 | 316 | repo_parse_commit(the_repository, p);
|
315 |
| - if (!(p->object.flags & SEEN)) |
| 317 | + seen = p->object.flags & SEEN; |
| 318 | + if (!seen) |
316 | 319 | lazy_queue_put(queue, p);
|
| 320 | + flag_before = p->object.flags & best->flag_within; |
317 | 321 | 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); |
318 | 327 | parents = parents->next;
|
319 | 328 | }
|
320 | 329 | }
|
| 330 | + oidset_clear(&unflagged); |
321 | 331 | return seen_commits;
|
322 | 332 | }
|
323 | 333 |
|
|
0 commit comments