32
32
#include "object-store.h"
33
33
34
34
#define IN_PACK (obj ) oe_in_pack(&to_pack, obj)
35
+ #define DELTA (obj ) oe_delta(&to_pack, obj)
36
+ #define DELTA_CHILD (obj ) oe_delta_child(&to_pack, obj)
37
+ #define DELTA_SIBLING (obj ) oe_delta_sibling(&to_pack, obj)
38
+ #define SET_DELTA (obj , val ) oe_set_delta(&to_pack, obj, val)
39
+ #define SET_DELTA_CHILD (obj , val ) oe_set_delta_child(&to_pack, obj, val)
40
+ #define SET_DELTA_SIBLING (obj , val ) oe_set_delta_sibling(&to_pack, obj, val)
35
41
36
42
static const char * pack_usage [] = {
37
43
N_ ("git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" ),
@@ -129,10 +135,11 @@ static void *get_delta(struct object_entry *entry)
129
135
buf = read_object_file (& entry -> idx .oid , & type , & size );
130
136
if (!buf )
131
137
die ("unable to read %s" , oid_to_hex (& entry -> idx .oid ));
132
- base_buf = read_object_file (& entry -> delta -> idx .oid , & type , & base_size );
138
+ base_buf = read_object_file (& DELTA (entry )-> idx .oid , & type ,
139
+ & base_size );
133
140
if (!base_buf )
134
141
die ("unable to read %s" ,
135
- oid_to_hex (& entry -> delta -> idx .oid ));
142
+ oid_to_hex (& DELTA ( entry ) -> idx .oid ));
136
143
delta_buf = diff_delta (base_buf , base_size ,
137
144
buf , size , & delta_size , 0 );
138
145
if (!delta_buf || delta_size != entry -> delta_size )
@@ -288,12 +295,12 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent
288
295
size = entry -> delta_size ;
289
296
buf = entry -> delta_data ;
290
297
entry -> delta_data = NULL ;
291
- type = (allow_ofs_delta && entry -> delta -> idx .offset ) ?
298
+ type = (allow_ofs_delta && DELTA ( entry ) -> idx .offset ) ?
292
299
OBJ_OFS_DELTA : OBJ_REF_DELTA ;
293
300
} else {
294
301
buf = get_delta (entry );
295
302
size = entry -> delta_size ;
296
- type = (allow_ofs_delta && entry -> delta -> idx .offset ) ?
303
+ type = (allow_ofs_delta && DELTA ( entry ) -> idx .offset ) ?
297
304
OBJ_OFS_DELTA : OBJ_REF_DELTA ;
298
305
}
299
306
@@ -317,7 +324,7 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent
317
324
* encoding of the relative offset for the delta
318
325
* base from this object's position in the pack.
319
326
*/
320
- off_t ofs = entry -> idx .offset - entry -> delta -> idx .offset ;
327
+ off_t ofs = entry -> idx .offset - DELTA ( entry ) -> idx .offset ;
321
328
unsigned pos = sizeof (dheader ) - 1 ;
322
329
dheader [pos ] = ofs & 127 ;
323
330
while (ofs >>= 7 )
@@ -343,7 +350,7 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent
343
350
return 0 ;
344
351
}
345
352
hashwrite (f , header , hdrlen );
346
- hashwrite (f , entry -> delta -> idx .oid .hash , 20 );
353
+ hashwrite (f , DELTA ( entry ) -> idx .oid .hash , 20 );
347
354
hdrlen += 20 ;
348
355
} else {
349
356
if (limit && hdrlen + datalen + 20 >= limit ) {
@@ -379,8 +386,8 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
379
386
dheader [MAX_PACK_OBJECT_HEADER ];
380
387
unsigned hdrlen ;
381
388
382
- if (entry -> delta )
383
- type = (allow_ofs_delta && entry -> delta -> idx .offset ) ?
389
+ if (DELTA ( entry ) )
390
+ type = (allow_ofs_delta && DELTA ( entry ) -> idx .offset ) ?
384
391
OBJ_OFS_DELTA : OBJ_REF_DELTA ;
385
392
hdrlen = encode_in_pack_object_header (header , sizeof (header ),
386
393
type , entry -> size );
@@ -408,7 +415,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
408
415
}
409
416
410
417
if (type == OBJ_OFS_DELTA ) {
411
- off_t ofs = entry -> idx .offset - entry -> delta -> idx .offset ;
418
+ off_t ofs = entry -> idx .offset - DELTA ( entry ) -> idx .offset ;
412
419
unsigned pos = sizeof (dheader ) - 1 ;
413
420
dheader [pos ] = ofs & 127 ;
414
421
while (ofs >>= 7 )
@@ -427,7 +434,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
427
434
return 0 ;
428
435
}
429
436
hashwrite (f , header , hdrlen );
430
- hashwrite (f , entry -> delta -> idx .oid .hash , 20 );
437
+ hashwrite (f , DELTA ( entry ) -> idx .oid .hash , 20 );
431
438
hdrlen += 20 ;
432
439
reused_delta ++ ;
433
440
} else {
@@ -467,13 +474,13 @@ static off_t write_object(struct hashfile *f,
467
474
else
468
475
limit = pack_size_limit - write_offset ;
469
476
470
- if (!entry -> delta )
477
+ if (!DELTA ( entry ) )
471
478
usable_delta = 0 ; /* no delta */
472
479
else if (!pack_size_limit )
473
480
usable_delta = 1 ; /* unlimited packfile */
474
- else if (entry -> delta -> idx .offset == (off_t )- 1 )
481
+ else if (DELTA ( entry ) -> idx .offset == (off_t )- 1 )
475
482
usable_delta = 0 ; /* base was written to another pack */
476
- else if (entry -> delta -> idx .offset )
483
+ else if (DELTA ( entry ) -> idx .offset )
477
484
usable_delta = 1 ; /* base already exists in this pack */
478
485
else
479
486
usable_delta = 0 ; /* base could end up in another pack */
@@ -489,7 +496,7 @@ static off_t write_object(struct hashfile *f,
489
496
/* ... but pack split may override that */
490
497
else if (oe_type (entry ) != entry -> in_pack_type )
491
498
to_reuse = 0 ; /* pack has delta which is unusable */
492
- else if (entry -> delta )
499
+ else if (DELTA ( entry ) )
493
500
to_reuse = 0 ; /* we want to pack afresh */
494
501
else
495
502
to_reuse = 1 ; /* we have it in-pack undeltified,
@@ -541,12 +548,12 @@ static enum write_one_status write_one(struct hashfile *f,
541
548
}
542
549
543
550
/* if we are deltified, write out base object first. */
544
- if (e -> delta ) {
551
+ if (DELTA ( e ) ) {
545
552
e -> idx .offset = 1 ; /* now recurse */
546
- switch (write_one (f , e -> delta , offset )) {
553
+ switch (write_one (f , DELTA ( e ) , offset )) {
547
554
case WRITE_ONE_RECURSIVE :
548
555
/* we cannot depend on this one */
549
- e -> delta = NULL ;
556
+ SET_DELTA ( e , NULL ) ;
550
557
break ;
551
558
default :
552
559
break ;
@@ -608,34 +615,34 @@ static void add_descendants_to_write_order(struct object_entry **wo,
608
615
/* add this node... */
609
616
add_to_write_order (wo , endp , e );
610
617
/* all its siblings... */
611
- for (s = e -> delta_sibling ; s ; s = s -> delta_sibling ) {
618
+ for (s = DELTA_SIBLING ( e ) ; s ; s = DELTA_SIBLING ( s ) ) {
612
619
add_to_write_order (wo , endp , s );
613
620
}
614
621
}
615
622
/* drop down a level to add left subtree nodes if possible */
616
- if (e -> delta_child ) {
623
+ if (DELTA_CHILD ( e ) ) {
617
624
add_to_order = 1 ;
618
- e = e -> delta_child ;
625
+ e = DELTA_CHILD ( e ) ;
619
626
} else {
620
627
add_to_order = 0 ;
621
628
/* our sibling might have some children, it is next */
622
- if (e -> delta_sibling ) {
623
- e = e -> delta_sibling ;
629
+ if (DELTA_SIBLING ( e ) ) {
630
+ e = DELTA_SIBLING ( e ) ;
624
631
continue ;
625
632
}
626
633
/* go back to our parent node */
627
- e = e -> delta ;
628
- while (e && !e -> delta_sibling ) {
634
+ e = DELTA ( e ) ;
635
+ while (e && !DELTA_SIBLING ( e ) ) {
629
636
/* we're on the right side of a subtree, keep
630
637
* going up until we can go right again */
631
- e = e -> delta ;
638
+ e = DELTA ( e ) ;
632
639
}
633
640
if (!e ) {
634
641
/* done- we hit our original root node */
635
642
return ;
636
643
}
637
644
/* pass it off to sibling at this level */
638
- e = e -> delta_sibling ;
645
+ e = DELTA_SIBLING ( e ) ;
639
646
}
640
647
};
641
648
}
@@ -646,7 +653,7 @@ static void add_family_to_write_order(struct object_entry **wo,
646
653
{
647
654
struct object_entry * root ;
648
655
649
- for (root = e ; root -> delta ; root = root -> delta )
656
+ for (root = e ; DELTA ( root ) ; root = DELTA ( root ) )
650
657
; /* nothing */
651
658
add_descendants_to_write_order (wo , endp , root );
652
659
}
@@ -661,8 +668,8 @@ static struct object_entry **compute_write_order(void)
661
668
for (i = 0 ; i < to_pack .nr_objects ; i ++ ) {
662
669
objects [i ].tagged = 0 ;
663
670
objects [i ].filled = 0 ;
664
- objects [i ]. delta_child = NULL ;
665
- objects [i ]. delta_sibling = NULL ;
671
+ SET_DELTA_CHILD ( & objects [i ], NULL ) ;
672
+ SET_DELTA_SIBLING ( & objects [i ], NULL ) ;
666
673
}
667
674
668
675
/*
@@ -672,11 +679,11 @@ static struct object_entry **compute_write_order(void)
672
679
*/
673
680
for (i = to_pack .nr_objects ; i > 0 ;) {
674
681
struct object_entry * e = & objects [-- i ];
675
- if (!e -> delta )
682
+ if (!DELTA ( e ) )
676
683
continue ;
677
684
/* Mark me as the first child */
678
- e -> delta_sibling = e -> delta -> delta_child ;
679
- e -> delta -> delta_child = e ;
685
+ e -> delta_sibling_idx = DELTA ( e ) -> delta_child_idx ;
686
+ SET_DELTA_CHILD ( DELTA ( e ), e ) ;
680
687
}
681
688
682
689
/*
@@ -1493,10 +1500,10 @@ static void check_object(struct object_entry *entry)
1493
1500
* circular deltas.
1494
1501
*/
1495
1502
oe_set_type (entry , entry -> in_pack_type );
1496
- entry -> delta = base_entry ;
1503
+ SET_DELTA ( entry , base_entry ) ;
1497
1504
entry -> delta_size = entry -> size ;
1498
- entry -> delta_sibling = base_entry -> delta_child ;
1499
- base_entry -> delta_child = entry ;
1505
+ entry -> delta_sibling_idx = base_entry -> delta_child_idx ;
1506
+ SET_DELTA_CHILD ( base_entry , entry ) ;
1500
1507
unuse_pack (& w_curs );
1501
1508
return ;
1502
1509
}
@@ -1567,17 +1574,19 @@ static int pack_offset_sort(const void *_a, const void *_b)
1567
1574
*/
1568
1575
static void drop_reused_delta (struct object_entry * entry )
1569
1576
{
1570
- struct object_entry * * p = & entry -> delta -> delta_child ;
1577
+ unsigned * idx = & to_pack . objects [ entry -> delta_idx - 1 ]. delta_child_idx ;
1571
1578
struct object_info oi = OBJECT_INFO_INIT ;
1572
1579
enum object_type type ;
1573
1580
1574
- while (* p ) {
1575
- if (* p == entry )
1576
- * p = (* p )-> delta_sibling ;
1581
+ while (* idx ) {
1582
+ struct object_entry * oe = & to_pack .objects [* idx - 1 ];
1583
+
1584
+ if (oe == entry )
1585
+ * idx = oe -> delta_sibling_idx ;
1577
1586
else
1578
- p = & ( * p ) -> delta_sibling ;
1587
+ idx = & oe -> delta_sibling_idx ;
1579
1588
}
1580
- entry -> delta = NULL ;
1589
+ SET_DELTA ( entry , NULL ) ;
1581
1590
entry -> depth = 0 ;
1582
1591
1583
1592
oi .sizep = & entry -> size ;
@@ -1617,7 +1626,7 @@ static void break_delta_chains(struct object_entry *entry)
1617
1626
1618
1627
for (cur = entry , total_depth = 0 ;
1619
1628
cur ;
1620
- cur = cur -> delta , total_depth ++ ) {
1629
+ cur = DELTA ( cur ) , total_depth ++ ) {
1621
1630
if (cur -> dfs_state == DFS_DONE ) {
1622
1631
/*
1623
1632
* We've already seen this object and know it isn't
@@ -1642,7 +1651,7 @@ static void break_delta_chains(struct object_entry *entry)
1642
1651
* it's not a delta, we're done traversing, but we'll mark it
1643
1652
* done to save time on future traversals.
1644
1653
*/
1645
- if (!cur -> delta ) {
1654
+ if (!DELTA ( cur ) ) {
1646
1655
cur -> dfs_state = DFS_DONE ;
1647
1656
break ;
1648
1657
}
@@ -1665,7 +1674,7 @@ static void break_delta_chains(struct object_entry *entry)
1665
1674
* We keep all commits in the chain that we examined.
1666
1675
*/
1667
1676
cur -> dfs_state = DFS_ACTIVE ;
1668
- if (cur -> delta -> dfs_state == DFS_ACTIVE ) {
1677
+ if (DELTA ( cur ) -> dfs_state == DFS_ACTIVE ) {
1669
1678
drop_reused_delta (cur );
1670
1679
cur -> dfs_state = DFS_DONE ;
1671
1680
break ;
@@ -1680,7 +1689,7 @@ static void break_delta_chains(struct object_entry *entry)
1680
1689
* an extra "next" pointer to keep going after we reset cur->delta.
1681
1690
*/
1682
1691
for (cur = entry ; cur ; cur = next ) {
1683
- next = cur -> delta ;
1692
+ next = DELTA ( cur ) ;
1684
1693
1685
1694
/*
1686
1695
* We should have a chain of zero or more ACTIVE states down to
@@ -1865,7 +1874,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
1865
1874
1866
1875
/* Now some size filtering heuristics. */
1867
1876
trg_size = trg_entry -> size ;
1868
- if (!trg_entry -> delta ) {
1877
+ if (!DELTA ( trg_entry ) ) {
1869
1878
max_size = trg_size /2 - 20 ;
1870
1879
ref_depth = 1 ;
1871
1880
} else {
@@ -1939,7 +1948,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
1939
1948
if (!delta_buf )
1940
1949
return 0 ;
1941
1950
1942
- if (trg_entry -> delta ) {
1951
+ if (DELTA ( trg_entry ) ) {
1943
1952
/* Prefer only shallower same-sized deltas. */
1944
1953
if (delta_size == trg_entry -> delta_size &&
1945
1954
src -> depth + 1 >= trg -> depth ) {
@@ -1968,7 +1977,7 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
1968
1977
free (delta_buf );
1969
1978
}
1970
1979
1971
- trg_entry -> delta = src_entry ;
1980
+ SET_DELTA ( trg_entry , src_entry ) ;
1972
1981
trg_entry -> delta_size = delta_size ;
1973
1982
trg -> depth = src -> depth + 1 ;
1974
1983
@@ -1977,13 +1986,13 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
1977
1986
1978
1987
static unsigned int check_delta_limit (struct object_entry * me , unsigned int n )
1979
1988
{
1980
- struct object_entry * child = me -> delta_child ;
1989
+ struct object_entry * child = DELTA_CHILD ( me ) ;
1981
1990
unsigned int m = n ;
1982
1991
while (child ) {
1983
1992
unsigned int c = check_delta_limit (child , n + 1 );
1984
1993
if (m < c )
1985
1994
m = c ;
1986
- child = child -> delta_sibling ;
1995
+ child = DELTA_SIBLING ( child ) ;
1987
1996
}
1988
1997
return m ;
1989
1998
}
@@ -2052,7 +2061,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
2052
2061
* otherwise they would become too deep.
2053
2062
*/
2054
2063
max_depth = depth ;
2055
- if (entry -> delta_child ) {
2064
+ if (DELTA_CHILD ( entry ) ) {
2056
2065
max_depth -= check_delta_limit (entry , 0 );
2057
2066
if (max_depth <= 0 )
2058
2067
goto next ;
@@ -2102,15 +2111,15 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
2102
2111
* depth, leaving it in the window is pointless. we
2103
2112
* should evict it first.
2104
2113
*/
2105
- if (entry -> delta && max_depth <= n -> depth )
2114
+ if (DELTA ( entry ) && max_depth <= n -> depth )
2106
2115
continue ;
2107
2116
2108
2117
/*
2109
2118
* Move the best delta base up in the window, after the
2110
2119
* currently deltified object, to keep it longer. It will
2111
2120
* be the first base object to be attempted next.
2112
2121
*/
2113
- if (entry -> delta ) {
2122
+ if (DELTA ( entry ) ) {
2114
2123
struct unpacked swap = array [best_base ];
2115
2124
int dist = (window + idx - best_base ) % window ;
2116
2125
int dst = best_base ;
@@ -2431,7 +2440,7 @@ static void prepare_pack(int window, int depth)
2431
2440
for (i = 0 ; i < to_pack .nr_objects ; i ++ ) {
2432
2441
struct object_entry * entry = to_pack .objects + i ;
2433
2442
2434
- if (entry -> delta )
2443
+ if (DELTA ( entry ) )
2435
2444
/* This happens if we decided to reuse existing
2436
2445
* delta from a pack. "reuse_delta &&" is implied.
2437
2446
*/
0 commit comments