@@ -230,13 +230,31 @@ static int objecttype_atom_parser(const struct ref_format *format, struct used_a
230
230
231
231
static int objectsize_atom_parser (const struct ref_format * format , struct used_atom * atom ,
232
232
const char * arg , struct strbuf * err )
233
+ {
234
+ if (!arg ) {
235
+ if (* atom -> name == '*' )
236
+ oi_deref .info .sizep = & oi_deref .size ;
237
+ else
238
+ oi .info .sizep = & oi .size ;
239
+ } else if (!strcmp (arg , "disk" )) {
240
+ if (* atom -> name == '*' )
241
+ oi_deref .info .disk_sizep = & oi_deref .disk_size ;
242
+ else
243
+ oi .info .disk_sizep = & oi .disk_size ;
244
+ } else
245
+ return strbuf_addf_ret (err , -1 , _ ("unrecognized %%(objectsize) argument: %s" ), arg );
246
+ return 0 ;
247
+ }
248
+
249
+ static int deltabase_atom_parser (const struct ref_format * format , struct used_atom * atom ,
250
+ const char * arg , struct strbuf * err )
233
251
{
234
252
if (arg )
235
- return strbuf_addf_ret (err , -1 , _ ("%%(objectsize ) does not take arguments" ));
253
+ return strbuf_addf_ret (err , -1 , _ ("%%(deltabase ) does not take arguments" ));
236
254
if (* atom -> name == '*' )
237
- oi_deref .info .sizep = & oi_deref .size ;
255
+ oi_deref .info .delta_base_sha1 = oi_deref .delta_base_oid . hash ;
238
256
else
239
- oi .info .sizep = & oi .size ;
257
+ oi .info .delta_base_sha1 = oi .delta_base_oid . hash ;
240
258
return 0 ;
241
259
}
242
260
@@ -431,6 +449,7 @@ static struct {
431
449
{ "objecttype" , SOURCE_OTHER , FIELD_STR , objecttype_atom_parser },
432
450
{ "objectsize" , SOURCE_OTHER , FIELD_ULONG , objectsize_atom_parser },
433
451
{ "objectname" , SOURCE_OTHER , FIELD_STR , objectname_atom_parser },
452
+ { "deltabase" , SOURCE_OTHER , FIELD_STR , deltabase_atom_parser },
434
453
{ "tree" , SOURCE_OBJ },
435
454
{ "parent" , SOURCE_OBJ },
436
455
{ "numparent" , SOURCE_OBJ , FIELD_ULONG },
@@ -880,10 +899,14 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
880
899
name ++ ;
881
900
if (!strcmp (name , "objecttype" ))
882
901
v -> s = xstrdup (type_name (oi -> type ));
883
- else if (!strcmp (name , "objectsize" )) {
902
+ else if (!strcmp (name , "objectsize:disk" )) {
903
+ v -> value = oi -> disk_size ;
904
+ v -> s = xstrfmt ("%" PRIuMAX , (uintmax_t )oi -> disk_size );
905
+ } else if (!strcmp (name , "objectsize" )) {
884
906
v -> value = oi -> size ;
885
907
v -> s = xstrfmt ("%" PRIuMAX , (uintmax_t )oi -> size );
886
- }
908
+ } else if (!strcmp (name , "deltabase" ))
909
+ v -> s = xstrdup (oid_to_hex (& oi -> delta_base_oid ));
887
910
else if (deref )
888
911
grab_objectname (name , & oi -> oid , v , & used_atom [i ]);
889
912
}
@@ -1482,6 +1505,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
1482
1505
OBJECT_INFO_LOOKUP_REPLACE ))
1483
1506
return strbuf_addf_ret (err , -1 , _ ("missing object %s for %s" ),
1484
1507
oid_to_hex (& oi -> oid ), ref -> refname );
1508
+ if (oi -> info .disk_sizep && oi -> disk_size < 0 )
1509
+ BUG ("Object size is less than zero." );
1485
1510
1486
1511
if (oi -> info .contentp ) {
1487
1512
* obj = parse_object_buffer (the_repository , & oi -> oid , oi -> type , oi -> size , oi -> content , & eaten );
0 commit comments