|
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