Patrick Steinhardt <ps@xxxxxx> writes: > Object filters currently only support filtering blobs or trees based on > some criteria. This commit lays the foundation to also allow filtering > of tags and commits. > > No change in behaviour is expected from this commit given that there are > no filters yet for those object types. > > Signed-off-by: Patrick Steinhardt <ps@xxxxxx> > --- > list-objects-filter.c | 40 ++++++++++++++++++++++++++++++++++++++++ > list-objects-filter.h | 2 ++ > list-objects.c | 22 +++++++++++++++++++--- > 3 files changed, 61 insertions(+), 3 deletions(-) > > diff --git a/list-objects-filter.c b/list-objects-filter.c > index 39e2f15333..0ebfa52966 100644 > --- a/list-objects-filter.c > +++ b/list-objects-filter.c > @@ -82,6 +82,16 @@ static enum list_objects_filter_result filter_blobs_none( > default: > BUG("unknown filter_situation: %d", filter_situation); > > + case LOFS_TAG: > + assert(obj->type == OBJ_TAG); > + /* always include all tag objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > + case LOFS_COMMIT: > + assert(obj->type == OBJ_COMMIT); > + /* always include all commit objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > case LOFS_BEGIN_TREE: > assert(obj->type == OBJ_TREE); > /* always include all tree objects */ > @@ -173,6 +183,16 @@ static enum list_objects_filter_result filter_trees_depth( > default: > BUG("unknown filter_situation: %d", filter_situation); > > + case LOFS_TAG: > + assert(obj->type == OBJ_TAG); > + /* always include all tag objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > + case LOFS_COMMIT: > + assert(obj->type == OBJ_COMMIT); > + /* always include all commit objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > case LOFS_END_TREE: > assert(obj->type == OBJ_TREE); > filter_data->current_depth--; > @@ -267,6 +287,16 @@ static enum list_objects_filter_result filter_blobs_limit( > default: > BUG("unknown filter_situation: %d", filter_situation); > > + case LOFS_TAG: > + assert(obj->type == OBJ_TAG); > + /* always include all tag objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > + case LOFS_COMMIT: > + assert(obj->type == OBJ_COMMIT); > + /* always include all commit objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > case LOFS_BEGIN_TREE: > assert(obj->type == OBJ_TREE); > /* always include all tree objects */ > @@ -371,6 +401,16 @@ static enum list_objects_filter_result filter_sparse( > default: > BUG("unknown filter_situation: %d", filter_situation); > > + case LOFS_TAG: > + assert(obj->type == OBJ_TAG); > + /* always include all tag objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > + case LOFS_COMMIT: > + assert(obj->type == OBJ_COMMIT); > + /* always include all commit objects */ > + return LOFR_MARK_SEEN | LOFR_DO_SHOW; > + > case LOFS_BEGIN_TREE: > assert(obj->type == OBJ_TREE); > dtype = DT_DIR; > diff --git a/list-objects-filter.h b/list-objects-filter.h > index cfd784e203..9e98814111 100644 > --- a/list-objects-filter.h > +++ b/list-objects-filter.h > @@ -55,6 +55,8 @@ enum list_objects_filter_result { > }; > > enum list_objects_filter_situation { > + LOFS_COMMIT, > + LOFS_TAG, > LOFS_BEGIN_TREE, > LOFS_END_TREE, > LOFS_BLOB > diff --git a/list-objects.c b/list-objects.c > index a5a60301cb..0c524a81ac 100644 > --- a/list-objects.c > +++ b/list-objects.c > @@ -217,8 +217,14 @@ static void process_tag(struct traversal_context *ctx, > struct tag *tag, > const char *name) > { > - tag->object.flags |= SEEN; > - ctx->show_object(&tag->object, name, ctx->show_data); > + enum list_objects_filter_result r; > + > + r = list_objects_filter__filter_object(ctx->revs->repo, LOFS_TAG, > + &tag->object, "", 0, ctx->filter); s/0/NULL/ > + if (r & LOFR_MARK_SEEN) > + tag->object.flags |= SEEN; > + if (r & LOFR_DO_SHOW) > + ctx->show_object(&tag->object, name, ctx->show_data); > } > > static void mark_edge_parents_uninteresting(struct commit *commit, > @@ -368,6 +374,12 @@ static void do_traverse(struct traversal_context *ctx) > strbuf_init(&csp, PATH_MAX); > > while ((commit = get_revision(ctx->revs)) != NULL) { > + enum list_objects_filter_result r; > + > + r = list_objects_filter__filter_object(ctx->revs->repo, > + LOFS_COMMIT, &commit->object, > + NULL, NULL, ctx->filter); > + > /* > * an uninteresting boundary commit may not have its tree > * parsed yet, but we are not going to show them anyway > @@ -382,7 +394,11 @@ static void do_traverse(struct traversal_context *ctx) > die(_("unable to load root tree for commit %s"), > oid_to_hex(&commit->object.oid)); > } > - ctx->show_commit(commit, ctx->show_data); > + > + if (r & LOFR_MARK_SEEN) > + commit->object.flags |= SEEN; > + if (r & LOFR_DO_SHOW) > + ctx->show_commit(commit, ctx->show_data); > > if (ctx->revs->tree_blobs_in_commit_order) > /*