зеркало из https://github.com/microsoft/git.git
Merge branch 'ot/ref-filter-object-info'
The "--format=<placeholder>" option of for-each-ref, branch and tag learned to show a few more traits of objects that can be learned by the object_info API. * ot/ref-filter-object-info: ref-filter: give uintmax_t to format with %PRIuMAX ref-filter: add docs for new options ref-filter: add tests for deltabase ref-filter: add deltabase option ref-filter: add tests for objectsize:disk ref-filter: add check for negative file size ref-filter: add objectsize:disk option
This commit is contained in:
Коммит
55574bd04a
|
@ -128,13 +128,18 @@ objecttype::
|
|||
|
||||
objectsize::
|
||||
The size of the object (the same as 'git cat-file -s' reports).
|
||||
|
||||
Append `:disk` to get the size, in bytes, that the object takes up on
|
||||
disk. See the note about on-disk sizes in the `CAVEATS` section below.
|
||||
objectname::
|
||||
The object name (aka SHA-1).
|
||||
For a non-ambiguous abbreviation of the object name append `:short`.
|
||||
For an abbreviation of the object name with desired length append
|
||||
`:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
|
||||
length may be exceeded to ensure unique object names.
|
||||
deltabase::
|
||||
This expands to the object name of the delta base for the
|
||||
given object, if it is stored as a delta. Otherwise it
|
||||
expands to the null object name (all zeroes).
|
||||
|
||||
upstream::
|
||||
The name of a local ref which can be considered ``upstream''
|
||||
|
@ -361,6 +366,20 @@ This prints the authorname, if present.
|
|||
git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"
|
||||
------------
|
||||
|
||||
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 or delta base
|
||||
will be reported.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkgit:git-show-ref[1]
|
||||
|
|
35
ref-filter.c
35
ref-filter.c
|
@ -230,13 +230,31 @@ static int objecttype_atom_parser(const struct ref_format *format, struct used_a
|
|||
|
||||
static int objectsize_atom_parser(const struct ref_format *format, struct used_atom *atom,
|
||||
const char *arg, struct strbuf *err)
|
||||
{
|
||||
if (!arg) {
|
||||
if (*atom->name == '*')
|
||||
oi_deref.info.sizep = &oi_deref.size;
|
||||
else
|
||||
oi.info.sizep = &oi.size;
|
||||
} else if (!strcmp(arg, "disk")) {
|
||||
if (*atom->name == '*')
|
||||
oi_deref.info.disk_sizep = &oi_deref.disk_size;
|
||||
else
|
||||
oi.info.disk_sizep = &oi.disk_size;
|
||||
} else
|
||||
return strbuf_addf_ret(err, -1, _("unrecognized %%(objectsize) argument: %s"), arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int deltabase_atom_parser(const struct ref_format *format, struct used_atom *atom,
|
||||
const char *arg, struct strbuf *err)
|
||||
{
|
||||
if (arg)
|
||||
return strbuf_addf_ret(err, -1, _("%%(objectsize) does not take arguments"));
|
||||
return strbuf_addf_ret(err, -1, _("%%(deltabase) does not take arguments"));
|
||||
if (*atom->name == '*')
|
||||
oi_deref.info.sizep = &oi_deref.size;
|
||||
oi_deref.info.delta_base_sha1 = oi_deref.delta_base_oid.hash;
|
||||
else
|
||||
oi.info.sizep = &oi.size;
|
||||
oi.info.delta_base_sha1 = oi.delta_base_oid.hash;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -431,6 +449,7 @@ static struct {
|
|||
{ "objecttype", SOURCE_OTHER, FIELD_STR, objecttype_atom_parser },
|
||||
{ "objectsize", SOURCE_OTHER, FIELD_ULONG, objectsize_atom_parser },
|
||||
{ "objectname", SOURCE_OTHER, FIELD_STR, objectname_atom_parser },
|
||||
{ "deltabase", SOURCE_OTHER, FIELD_STR, deltabase_atom_parser },
|
||||
{ "tree", SOURCE_OBJ },
|
||||
{ "parent", SOURCE_OBJ },
|
||||
{ "numparent", SOURCE_OBJ, FIELD_ULONG },
|
||||
|
@ -880,10 +899,14 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
|
|||
name++;
|
||||
if (!strcmp(name, "objecttype"))
|
||||
v->s = xstrdup(type_name(oi->type));
|
||||
else if (!strcmp(name, "objectsize")) {
|
||||
else if (!strcmp(name, "objectsize:disk")) {
|
||||
v->value = oi->disk_size;
|
||||
v->s = xstrfmt("%"PRIuMAX, (uintmax_t)oi->disk_size);
|
||||
} else if (!strcmp(name, "objectsize")) {
|
||||
v->value = oi->size;
|
||||
v->s = xstrfmt("%"PRIuMAX , (uintmax_t)oi->size);
|
||||
}
|
||||
} else if (!strcmp(name, "deltabase"))
|
||||
v->s = xstrdup(oid_to_hex(&oi->delta_base_oid));
|
||||
else if (deref)
|
||||
grab_objectname(name, &oi->oid, v, &used_atom[i]);
|
||||
}
|
||||
|
@ -1482,6 +1505,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
|
|||
OBJECT_INFO_LOOKUP_REPLACE))
|
||||
return strbuf_addf_ret(err, -1, _("missing object %s for %s"),
|
||||
oid_to_hex(&oi->oid), ref->refname);
|
||||
if (oi->info.disk_sizep && oi->disk_size < 0)
|
||||
BUG("Object size is less than zero.");
|
||||
|
||||
if (oi->info.contentp) {
|
||||
*obj = parse_object_buffer(the_repository, &oi->oid, oi->type, oi->size, oi->content, &eaten);
|
||||
|
|
|
@ -83,6 +83,8 @@ test_atom head push:strip=1 remotes/myfork/master
|
|||
test_atom head push:strip=-1 master
|
||||
test_atom head objecttype commit
|
||||
test_atom head objectsize 171
|
||||
test_atom head objectsize:disk 138
|
||||
test_atom head deltabase 0000000000000000000000000000000000000000
|
||||
test_atom head objectname $(git rev-parse refs/heads/master)
|
||||
test_atom head objectname:short $(git rev-parse --short refs/heads/master)
|
||||
test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
|
||||
|
@ -124,6 +126,10 @@ test_atom tag upstream ''
|
|||
test_atom tag push ''
|
||||
test_atom tag objecttype tag
|
||||
test_atom tag objectsize 154
|
||||
test_atom tag objectsize:disk 138
|
||||
test_atom tag '*objectsize:disk' 138
|
||||
test_atom tag deltabase 0000000000000000000000000000000000000000
|
||||
test_atom tag '*deltabase' 0000000000000000000000000000000000000000
|
||||
test_atom tag objectname $(git rev-parse refs/tags/testtag)
|
||||
test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag)
|
||||
test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
|
||||
|
|
Загрузка…
Ссылка в новой задаче