bundle: allow rev-list options to exclude annotated tags

With options such as "--all --since=2.weeks.ago", annotated tags used to
be included, when they should have been excluded.  The reason is that we
heavily abuse the revision walker to determine what needs to be included
or excluded.  And the revision walker does not show tags at all (and
therefore never marks tags as uninteresting).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2009-01-02 19:08:46 +01:00 committed by Junio C Hamano
parent 27c03aafdf
commit c9a42c4a12
2 changed files with 65 additions and 0 deletions

View file

@ -167,6 +167,32 @@ int list_bundle_refs(struct bundle_header *header, int argc, const char **argv)
return list_refs(&header->references, argc, argv);
}
static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
{
unsigned long size;
enum object_type type;
char *buf, *line, *lineend;
unsigned long date;
if (revs->max_age == -1 && revs->min_age == -1)
return 1;
buf = read_sha1_file(tag->sha1, &type, &size);
if (!buf)
return 1;
line = memmem(buf, size, "\ntagger ", 8);
if (!line++)
return 1;
lineend = memchr(line, buf + size - line, '\n');
line = memchr(line, lineend ? lineend - line : buf + size - line, '>');
if (!line++)
return 1;
date = strtoul(line, NULL, 10);
free(buf);
return (revs->max_age == -1 || revs->max_age < date) &&
(revs->min_age == -1 || revs->min_age > date);
}
int create_bundle(struct bundle_header *header, const char *path,
int argc, const char **argv)
{
@ -255,6 +281,12 @@ int create_bundle(struct bundle_header *header, const char *path,
flag = 0;
display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
if (e->item->type == OBJ_TAG &&
!is_tag_in_date_range(e->item, &revs)) {
e->item->flags |= UNINTERESTING;
continue;
}
/*
* Make sure the refs we wrote out is correct; --max-count and
* other limiting options could have prevented all the tips

33
t/t5704-bundle.sh Executable file
View file

@ -0,0 +1,33 @@
#!/bin/sh
test_description='some bundle related tests'
. ./test-lib.sh
test_expect_success 'setup' '
: > file &&
git add file &&
test_tick &&
git commit -m initial &&
test_tick &&
git tag -m tag tag &&
: > file2 &&
git add file2 &&
: > file3 &&
test_tick &&
git commit -m second &&
git add file3 &&
test_tick &&
git commit -m third
'
test_expect_success 'tags can be excluded by rev-list options' '
git bundle create bundle --all --since=7.Apr.2005.15:16:00.-0700 &&
git ls-remote bundle > output &&
! grep tag output
'
test_done