Merge branch 'jk/pack-tag-of-tag'
"git pack-objects --include-tag" was taught that when we know that we are sending an object C, we want a tag B that directly points at C but also a tag A that points at the tag B. We used to miss the intermediate tag B in some cases. * jk/pack-tag-of-tag: pack-objects: walk tag chains for --include-tag t5305: simplify packname handling t5305: use "git -C" t5305: drop "dry-run" of unpack-objects t5305: move cleanup into test block
This commit is contained in:
@ -2123,6 +2123,35 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
|
||||
#define ll_find_deltas(l, s, w, d, p) find_deltas(l, &s, w, d, p)
|
||||
#endif
|
||||
|
||||
static void add_tag_chain(const struct object_id *oid)
|
||||
{
|
||||
struct tag *tag;
|
||||
|
||||
/*
|
||||
* We catch duplicates already in add_object_entry(), but we'd
|
||||
* prefer to do this extra check to avoid having to parse the
|
||||
* tag at all if we already know that it's being packed (e.g., if
|
||||
* it was included via bitmaps, we would not have parsed it
|
||||
* previously).
|
||||
*/
|
||||
if (packlist_find(&to_pack, oid->hash, NULL))
|
||||
return;
|
||||
|
||||
tag = lookup_tag(oid->hash);
|
||||
while (1) {
|
||||
if (!tag || parse_tag(tag) || !tag->tagged)
|
||||
die("unable to pack objects reachable from tag %s",
|
||||
oid_to_hex(oid));
|
||||
|
||||
add_object_entry(tag->object.oid.hash, OBJ_TAG, NULL, 0);
|
||||
|
||||
if (tag->tagged->type != OBJ_TAG)
|
||||
return;
|
||||
|
||||
tag = (struct tag *)tag->tagged;
|
||||
}
|
||||
}
|
||||
|
||||
static int add_ref_tag(const char *path, const struct object_id *oid, int flag, void *cb_data)
|
||||
{
|
||||
struct object_id peeled;
|
||||
@ -2130,7 +2159,7 @@ static int add_ref_tag(const char *path, const struct object_id *oid, int flag,
|
||||
if (starts_with(path, "refs/tags/") && /* is a tag? */
|
||||
!peel_ref(path, peeled.hash) && /* peelable? */
|
||||
packlist_find(&to_pack, peeled.hash, NULL)) /* object packed? */
|
||||
add_object_entry(oid->hash, OBJ_TAG, NULL, 0);
|
||||
add_tag_chain(oid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user