545
filter->free_fn = filter_sparse_free;
546
}
547
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
+
623
/* A filter which only shows objects shown by all sub-filters. */
624
struct combine_filter_data {
625
struct subfilter *sub;
766
filter_blobs_limit__init,
767
filter_trees_depth__init,
768
filter_sparse_oid__init,
769
+ filter_object_type__init,
770
filter_combine__init,
771
};
772