Skip to content

Commit

Permalink
cat-file: add %(objectsize:disk) format atom
Browse files Browse the repository at this point in the history
This atom is just like %(objectsize), except that it shows
the on-disk size of the object rather than the object's true
size. In other words, it makes the "disk_size" query of
sha1_object_info_extended available via the command-line.

This can be used for rough attribution of disk usage to
particular refs, though see the caveats in the
documentation.

This patch does not include any tests, as the exact numbers
returned are volatile and subject to zlib and packing
decisions. We cannot even reliably guarantee that the
on-disk size is smaller than the object content (though in
general this should be the case for non-trivial objects).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jul 12, 2013
1 parent 93d2a60 commit a4ac106
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
18 changes: 18 additions & 0 deletions Documentation/git-cat-file.txt
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ newline. The available atoms are:
The size, in bytes, of the object (the same as `cat-file -s`
reports).

`objectsize:disk`::
The size, in bytes, that the object takes up on disk. See the
note about on-disk sizes in the `CAVEATS` section below.

If no format is specified, the default format is `%(objectname)
%(objecttype) %(objectsize)`.

Expand Down Expand Up @@ -133,6 +137,20 @@ the repository, then `cat-file` will ignore any custom format and print:
<object> SP missing LF
------------


CAVEATS
-------

Note that the sizes of objects on disk are reported accurately, but care
should be taken in drawing conclusions about which refs or objects are
responsible for disk usage. The size of a packed non-delta object may be
much larger than the size of objects which delta against it, but the
choice of which object is the base and which is the delta is arbitrary
and is subject to change during a repack. Note also that multiple copies
of an object may be present in the object database; in this case, it is
undefined which copy's size will be reported.


GIT
---
Part of the linkgit:git[1] suite
6 changes: 6 additions & 0 deletions builtin/cat-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct expand_data {
unsigned char sha1[20];
enum object_type type;
unsigned long size;
unsigned long disk_size;

/*
* If mark_query is true, we do not expand anything, but rather
Expand Down Expand Up @@ -155,6 +156,11 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
data->info.sizep = &data->size;
else
strbuf_addf(sb, "%lu", data->size);
} else if (is_atom("objectsize:disk", atom, len)) {
if (data->mark_query)
data->info.disk_sizep = &data->disk_size;
else
strbuf_addf(sb, "%lu", data->disk_size);
} else
die("unknown format element: %.*s", len, atom);
}
Expand Down

0 comments on commit a4ac106

Please sign in to comment.