fast-export: avoid dying when filtering by paths and old tags exist
If --tag-of-filtered-object=rewrite is specified along with a set of paths to limit what is exported, then any tags pointing to old commits that do not contain any of those specified paths cause problems. Since the old tagged commit is not exported, fast-export attempts to rewrite such tags to an ancestor commit which was exported. If no such commit exists, then fast-export currently die()s. Five years after the tag rewriting logic was added to fast-export (see commit2d8ad46919
, "fast-export: Add a --tag-of-filtered-object option for newly dangling tags", 2009-06-25), fast-import gained the ability to delete refs (see commit4ee1b225b9
, "fast-import: add support to delete refs", 2014-04-20), so now we do have a valid option to rewrite the tag to. Delete these tags instead of dying. Signed-off-by: Elijah Newren <newren@gmail.com> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
b93b81e799
commit
1f30c904b3
@ -775,9 +775,12 @@ static void handle_tag(const char *name, struct tag *tag)
|
||||
break;
|
||||
if (!(p->object.flags & TREESAME))
|
||||
break;
|
||||
if (!p->parents)
|
||||
die("can't find replacement commit for tag %s",
|
||||
oid_to_hex(&tag->object.oid));
|
||||
if (!p->parents) {
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
name, oid_to_hex(&null_oid));
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
p = p->parents->item;
|
||||
}
|
||||
tagged_mark = get_object_mark(&p->object);
|
||||
|
@ -325,6 +325,22 @@ test_expect_success 'rewriting tag of filtered out object' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'rewrite tag predating pathspecs to nothing' '
|
||||
test_create_repo rewrite_tag_predating_pathspecs &&
|
||||
(
|
||||
cd rewrite_tag_predating_pathspecs &&
|
||||
|
||||
test_commit initial &&
|
||||
|
||||
git tag -a -m "Some old tag" v0.0.0.0.0.0.1 &&
|
||||
|
||||
test_commit bar &&
|
||||
|
||||
git fast-export --tag-of-filtered-object=rewrite --all -- bar.t >output &&
|
||||
grep from.$ZERO_OID output
|
||||
)
|
||||
'
|
||||
|
||||
cat > limit-by-paths/expected << EOF
|
||||
blob
|
||||
mark :1
|
||||
|
Loading…
Reference in New Issue
Block a user