2005-04-28 22:46:33 +08:00
|
|
|
#ifndef TAG_H
|
|
|
|
#define TAG_H
|
|
|
|
|
|
|
|
#include "object.h"
|
|
|
|
|
|
|
|
extern const char *tag_type;
|
|
|
|
|
|
|
|
struct tag {
|
|
|
|
struct object object;
|
|
|
|
struct object *tagged;
|
|
|
|
char *tag;
|
2017-04-27 03:29:31 +08:00
|
|
|
timestamp_t date;
|
2005-04-28 22:46:33 +08:00
|
|
|
};
|
2018-06-29 09:22:03 +08:00
|
|
|
#define lookup_tag(r, o) lookup_tag_##r(o)
|
|
|
|
extern struct tag *lookup_tag_the_repository(const struct object_id *oid);
|
2018-06-29 09:22:04 +08:00
|
|
|
#define parse_tag_buffer(r, i, d, s) parse_tag_buffer_##r(i, d, s)
|
|
|
|
extern int parse_tag_buffer_the_repository(struct tag *item, const void *data, unsigned long size);
|
2005-04-28 22:50:39 +08:00
|
|
|
extern int parse_tag(struct tag *item);
|
2018-05-16 05:48:42 +08:00
|
|
|
extern void release_tag_memory(struct tag *t);
|
2018-06-29 09:22:05 +08:00
|
|
|
#define deref_tag(r, o, w, l) deref_tag_##r(o, w, l)
|
|
|
|
extern struct object *deref_tag_the_repository(struct object *, const char *, int);
|
upload-pack: avoid parsing tag destinations
When upload-pack advertises refs, it dereferences any tags
it sees, and shows the resulting sha1 to the client. It does
this by calling deref_tag. That function must load and parse
each tag object to find the sha1 of the tagged object.
However, it also ends up parsing the tagged object itself,
which is not strictly necessary for upload-pack's use.
Each tag produces two object loads (assuming it is not a
recursive tag), when it could get away with only a single
one. Dropping the second load halves the effort we spend.
The downside is that we are no longer verifying the
resulting object by loading it. In particular:
1. We never cross-check the "type" field given in the tag
object with the type of the pointed-to object. If the
tag says it points to a tag but doesn't, then we will
keep peeling and realize the error. If the tag says it
points to a non-tag but actually points to a tag, we
will stop peeling and just advertise the pointed-to
tag.
2. If we are missing the pointed-to object, we will not
realize (because we never even look it up in the object
db).
However, both of these are errors in the object database,
and both will be detected if a client actually requests the
broken objects in question. So we are simply pushing the
verification away from the advertising stage, and down to
the actual fetching stage.
On my test repo with 120K refs, this drops the time to
advertise the refs from ~3.2s to ~2.0s.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-01-07 03:18:01 +08:00
|
|
|
extern struct object *deref_tag_noverify(struct object *);
|
2017-07-13 08:44:15 +08:00
|
|
|
extern int gpg_verify_tag(const struct object_id *oid,
|
2016-04-22 22:52:04 +08:00
|
|
|
const char *name_to_report, unsigned flags);
|
2005-04-28 22:50:39 +08:00
|
|
|
|
2005-04-28 22:46:33 +08:00
|
|
|
#endif /* TAG_H */
|