@@ -2443,6 +2443,132 @@ int test_bitmap_hashes(struct repository *r)
24432443 return 0 ;
24442444}
24452445
2446+ static void bit_pos_to_object_id (struct bitmap_index * bitmap_git ,
2447+ uint32_t bit_pos ,
2448+ struct object_id * oid )
2449+ {
2450+ uint32_t index_pos ;
2451+
2452+ if (bitmap_is_midx (bitmap_git ))
2453+ index_pos = pack_pos_to_midx (bitmap_git -> midx , bit_pos );
2454+ else
2455+ index_pos = pack_pos_to_index (bitmap_git -> pack , bit_pos );
2456+
2457+ nth_bitmap_object_oid (bitmap_git , oid , index_pos );
2458+ }
2459+
2460+ int test_bitmap_pseudo_merges (struct repository * r )
2461+ {
2462+ struct bitmap_index * bitmap_git ;
2463+ uint32_t i ;
2464+
2465+ bitmap_git = prepare_bitmap_git (r );
2466+ if (!bitmap_git || !bitmap_git -> pseudo_merges .nr )
2467+ goto cleanup ;
2468+
2469+ for (i = 0 ; i < bitmap_git -> pseudo_merges .nr ; i ++ ) {
2470+ struct pseudo_merge * merge ;
2471+ struct ewah_bitmap * commits_bitmap , * merge_bitmap ;
2472+
2473+ merge = use_pseudo_merge (& bitmap_git -> pseudo_merges ,
2474+ & bitmap_git -> pseudo_merges .v [i ]);
2475+ commits_bitmap = merge -> commits ;
2476+ merge_bitmap = pseudo_merge_bitmap (& bitmap_git -> pseudo_merges ,
2477+ merge );
2478+
2479+ printf ("at=%" PRIuMAX ", commits=%" PRIuMAX ", objects=%" PRIuMAX "\n" ,
2480+ (uintmax_t )merge -> at ,
2481+ (uintmax_t )ewah_bitmap_popcount (commits_bitmap ),
2482+ (uintmax_t )ewah_bitmap_popcount (merge_bitmap ));
2483+ }
2484+
2485+ cleanup :
2486+ free_bitmap_index (bitmap_git );
2487+ return 0 ;
2488+ }
2489+
2490+ static void dump_ewah_object_ids (struct bitmap_index * bitmap_git ,
2491+ struct ewah_bitmap * bitmap )
2492+
2493+ {
2494+ struct ewah_iterator it ;
2495+ eword_t word ;
2496+ uint32_t pos = 0 ;
2497+
2498+ ewah_iterator_init (& it , bitmap );
2499+
2500+ while (ewah_iterator_next (& word , & it )) {
2501+ struct object_id oid ;
2502+ uint32_t offset ;
2503+
2504+ for (offset = 0 ; offset < BITS_IN_EWORD ; offset ++ ) {
2505+ if (!(word >> offset ))
2506+ break ;
2507+
2508+ offset += ewah_bit_ctz64 (word >> offset );
2509+
2510+ bit_pos_to_object_id (bitmap_git , pos + offset , & oid );
2511+ printf ("%s\n" , oid_to_hex (& oid ));
2512+ }
2513+ pos += BITS_IN_EWORD ;
2514+ }
2515+ }
2516+
2517+ int test_bitmap_pseudo_merge_commits (struct repository * r , uint32_t n )
2518+ {
2519+ struct bitmap_index * bitmap_git ;
2520+ struct pseudo_merge * merge ;
2521+ int ret = 0 ;
2522+
2523+ bitmap_git = prepare_bitmap_git (r );
2524+ if (!bitmap_git || !bitmap_git -> pseudo_merges .nr )
2525+ goto cleanup ;
2526+
2527+ if (n >= bitmap_git -> pseudo_merges .nr ) {
2528+ ret = error (_ ("pseudo-merge index out of range "
2529+ "(%" PRIu32 " >= %" PRIuMAX ")" ),
2530+ n , (uintmax_t )bitmap_git -> pseudo_merges .nr );
2531+ goto cleanup ;
2532+ }
2533+
2534+ merge = use_pseudo_merge (& bitmap_git -> pseudo_merges ,
2535+ & bitmap_git -> pseudo_merges .v [n ]);
2536+ dump_ewah_object_ids (bitmap_git , merge -> commits );
2537+
2538+ cleanup :
2539+ free_bitmap_index (bitmap_git );
2540+ return ret ;
2541+ }
2542+
2543+ int test_bitmap_pseudo_merge_objects (struct repository * r , uint32_t n )
2544+ {
2545+ struct bitmap_index * bitmap_git ;
2546+ struct pseudo_merge * merge ;
2547+ int ret = 0 ;
2548+
2549+ bitmap_git = prepare_bitmap_git (r );
2550+ if (!bitmap_git || !bitmap_git -> pseudo_merges .nr )
2551+ goto cleanup ;
2552+
2553+ if (n >= bitmap_git -> pseudo_merges .nr ) {
2554+ ret = error (_ ("pseudo-merge index out of range "
2555+ "(%" PRIu32 " >= %" PRIuMAX ")" ),
2556+ n , (uintmax_t )bitmap_git -> pseudo_merges .nr );
2557+ goto cleanup ;
2558+ }
2559+
2560+ merge = use_pseudo_merge (& bitmap_git -> pseudo_merges ,
2561+ & bitmap_git -> pseudo_merges .v [n ]);
2562+
2563+ dump_ewah_object_ids (bitmap_git ,
2564+ pseudo_merge_bitmap (& bitmap_git -> pseudo_merges ,
2565+ merge ));
2566+
2567+ cleanup :
2568+ free_bitmap_index (bitmap_git );
2569+ return ret ;
2570+ }
2571+
24462572int rebuild_bitmap (const uint32_t * reposition ,
24472573 struct ewah_bitmap * source ,
24482574 struct bitmap * dest )
0 commit comments