@@ -33,6 +33,7 @@ static struct pack_list {
struct packed_git *pack;
struct llist *unique_objects;
struct llist *remaining_objects;
+ size_t all_objects_size;
} *local_packs = NULL, *altodb_packs = NULL;
static struct llist_item *free_nodes;
@@ -335,19 +336,25 @@ static inline off_t pack_set_bytecount(struct pack_list *pl)
return ret;
}
-static int cmp_pack_list_reverse(const void *a, const void *b)
+static int cmp_remaining_objects(const void *a, const void *b)
{
struct pack_list *pl_a = *((struct pack_list **)a);
struct pack_list *pl_b = *((struct pack_list **)b);
- size_t sz_a = pl_a->remaining_objects->size;
- size_t sz_b = pl_b->remaining_objects->size;
- if (sz_a == sz_b)
- return 0;
- else if (sz_a < sz_b)
+ if (pl_a->remaining_objects->size == pl_b->remaining_objects->size) {
+ /* have the same remaining_objects, big pack first */
+ if (pl_a->all_objects_size == pl_b->all_objects_size)
+ return 0;
+ else if (pl_a->all_objects_size < pl_b->all_objects_size)
+ return 1;
+ else
+ return -1;
+ } else if (pl_a->remaining_objects->size < pl_b->remaining_objects->size) {
+ /* sort by remaining objects, more objects first */
return 1;
- else
+ } else {
return -1;
+ }
}
/* Sort pack_list, greater size of remaining_objects first */
@@ -365,7 +372,7 @@ static void sort_pack_list(struct pack_list **pl)
for (n = 0, p = *pl; p; p = p->next)
ary[n++] = p;
- QSORT(ary, n, cmp_pack_list_reverse);
+ QSORT(ary, n, cmp_remaining_objects);
/* link them back again */
for (i = 0; i < n - 1; i++)
@@ -507,6 +514,7 @@ static struct pack_list * add_pack(struct packed_git *p)
llist_insert_back(l.remaining_objects, (const struct object_id *)(base + off));
off += step;
}
+ l.all_objects_size = l.remaining_objects->size;
/* this list will be pruned in cmp_two_packs later */
l.unique_objects = llist_copy(l.remaining_objects);
if (p->pack_local)
@@ -133,7 +133,7 @@ test_expect_success 'create pack 4, 5' '
'
cat >expected <<EOF
-P2:$P2
+P3:$P3
EOF
test_expect_success 'one of pack-2/pack-3 is redundant' '