@@ -82,6 +82,16 @@ static enum list_objects_filter_result filter_blobs_none(
8282 default :
8383 BUG ("unknown filter_situation: %d" , filter_situation );
8484
85+ case LOFS_TAG :
86+ assert (obj -> type == OBJ_TAG );
87+ /* always include all tag objects */
88+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
89+
90+ case LOFS_COMMIT :
91+ assert (obj -> type == OBJ_COMMIT );
92+ /* always include all commit objects */
93+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
94+
8595 case LOFS_BEGIN_TREE :
8696 assert (obj -> type == OBJ_TREE );
8797 /* always include all tree objects */
@@ -173,6 +183,16 @@ static enum list_objects_filter_result filter_trees_depth(
173183 default :
174184 BUG ("unknown filter_situation: %d" , filter_situation );
175185
186+ case LOFS_TAG :
187+ assert (obj -> type == OBJ_TAG );
188+ /* always include all tag objects */
189+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
190+
191+ case LOFS_COMMIT :
192+ assert (obj -> type == OBJ_COMMIT );
193+ /* always include all commit objects */
194+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
195+
176196 case LOFS_END_TREE :
177197 assert (obj -> type == OBJ_TREE );
178198 filter_data -> current_depth -- ;
@@ -267,6 +287,16 @@ static enum list_objects_filter_result filter_blobs_limit(
267287 default :
268288 BUG ("unknown filter_situation: %d" , filter_situation );
269289
290+ case LOFS_TAG :
291+ assert (obj -> type == OBJ_TAG );
292+ /* always include all tag objects */
293+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
294+
295+ case LOFS_COMMIT :
296+ assert (obj -> type == OBJ_COMMIT );
297+ /* always include all commit objects */
298+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
299+
270300 case LOFS_BEGIN_TREE :
271301 assert (obj -> type == OBJ_TREE );
272302 /* always include all tree objects */
@@ -371,6 +401,16 @@ static enum list_objects_filter_result filter_sparse(
371401 default :
372402 BUG ("unknown filter_situation: %d" , filter_situation );
373403
404+ case LOFS_TAG :
405+ assert (obj -> type == OBJ_TAG );
406+ /* always include all tag objects */
407+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
408+
409+ case LOFS_COMMIT :
410+ assert (obj -> type == OBJ_COMMIT );
411+ /* always include all commit objects */
412+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
413+
374414 case LOFS_BEGIN_TREE :
375415 assert (obj -> type == OBJ_TREE );
376416 dtype = DT_DIR ;
@@ -505,6 +545,81 @@ static void filter_sparse_oid__init(
505545 filter -> free_fn = filter_sparse_free ;
506546}
507547
548+ /*
549+ * A filter for list-objects to omit large blobs.
550+ * And to OPTIONALLY collect a list of the omitted OIDs.
551+ */
552+ struct filter_object_type_data {
553+ enum object_type object_type ;
554+ };
555+
556+ static enum list_objects_filter_result filter_object_type (
557+ struct repository * r ,
558+ enum list_objects_filter_situation filter_situation ,
559+ struct object * obj ,
560+ const char * pathname ,
561+ const char * filename ,
562+ struct oidset * omits ,
563+ void * filter_data_ )
564+ {
565+ struct filter_object_type_data * filter_data = filter_data_ ;
566+
567+ switch (filter_situation ) {
568+ default :
569+ BUG ("unknown filter_situation: %d" , filter_situation );
570+
571+ case LOFS_TAG :
572+ assert (obj -> type == OBJ_TAG );
573+ if (filter_data -> object_type == OBJ_TAG )
574+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
575+ return LOFR_MARK_SEEN ;
576+
577+ case LOFS_COMMIT :
578+ assert (obj -> type == OBJ_COMMIT );
579+ if (filter_data -> object_type == OBJ_COMMIT )
580+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
581+ return LOFR_MARK_SEEN ;
582+
583+ case LOFS_BEGIN_TREE :
584+ assert (obj -> type == OBJ_TREE );
585+
586+ /*
587+ * If we only want to show commits or tags, then there is no
588+ * need to walk down trees.
589+ */
590+ if (filter_data -> object_type == OBJ_COMMIT ||
591+ filter_data -> object_type == OBJ_TAG )
592+ return LOFR_SKIP_TREE ;
593+
594+ if (filter_data -> object_type == OBJ_TREE )
595+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
596+
597+ return LOFR_MARK_SEEN ;
598+
599+ case LOFS_BLOB :
600+ assert (obj -> type == OBJ_BLOB );
601+
602+ if (filter_data -> object_type == OBJ_BLOB )
603+ return LOFR_MARK_SEEN | LOFR_DO_SHOW ;
604+ return LOFR_MARK_SEEN ;
605+
606+ case LOFS_END_TREE :
607+ return LOFR_ZERO ;
608+ }
609+ }
610+
611+ static void filter_object_type__init (
612+ struct list_objects_filter_options * filter_options ,
613+ struct filter * filter )
614+ {
615+ struct filter_object_type_data * d = xcalloc (1 , sizeof (* d ));
616+ d -> object_type = filter_options -> object_type ;
617+
618+ filter -> filter_data = d ;
619+ filter -> filter_object_fn = filter_object_type ;
620+ filter -> free_fn = free ;
621+ }
622+
508623/* A filter which only shows objects shown by all sub-filters. */
509624struct combine_filter_data {
510625 struct subfilter * sub ;
@@ -651,6 +766,7 @@ static filter_init_fn s_filters[] = {
651766 filter_blobs_limit__init ,
652767 filter_trees_depth__init ,
653768 filter_sparse_oid__init ,
769+ filter_object_type__init ,
654770 filter_combine__init ,
655771};
656772
0 commit comments