Message ID | 80193d6ba38254aab3dd2cda39cabf12986fd939.1617967252.git.ps@pks.im (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | rev-parse: implement object type filter | expand |
Patrick Steinhardt <ps@pks.im> 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@pks.im> > --- > 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) > /*
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); + 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) /*
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@pks.im> --- list-objects-filter.c | 40 ++++++++++++++++++++++++++++++++++++++++ list-objects-filter.h | 2 ++ list-objects.c | 22 +++++++++++++++++++--- 3 files changed, 61 insertions(+), 3 deletions(-)