mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
bc5975d24f
Teach list-objects the "tree:0" filter which allows for filtering out all tree and blob objects (unless other objects are explicitly specified by the user). The purpose of this patch is to allow smaller partial clones. The name of this filter - tree:0 - does not explicitly specify that it also filters out all blobs, but this should not cause much confusion because blobs are not at all useful without the trees that refer to them. I also considered only:commits as a name, but this is inaccurate because it suggests that annotated tags are omitted, but actually they are included. The name "tree:0" allows later filtering based on depth, i.e. "tree:1" would filter out all but the root tree and blobs. In order to avoid confusion between 0 and capital O, the documentation was worded in a somewhat round-about way that also hints at this future improvement to the feature. Signed-off-by: Matthew DeVore <matvore@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
#ifndef LIST_OBJECTS_FILTER_OPTIONS_H
|
|
#define LIST_OBJECTS_FILTER_OPTIONS_H
|
|
|
|
#include "parse-options.h"
|
|
|
|
/*
|
|
* The list of defined filters for list-objects.
|
|
*/
|
|
enum list_objects_filter_choice {
|
|
LOFC_DISABLED = 0,
|
|
LOFC_BLOB_NONE,
|
|
LOFC_BLOB_LIMIT,
|
|
LOFC_TREE_NONE,
|
|
LOFC_SPARSE_OID,
|
|
LOFC_SPARSE_PATH,
|
|
LOFC__COUNT /* must be last */
|
|
};
|
|
|
|
struct list_objects_filter_options {
|
|
/*
|
|
* 'filter_spec' is the raw argument value given on the command line
|
|
* or protocol request. (The part after the "--keyword=".) For
|
|
* commands that launch filtering sub-processes, this value should be
|
|
* passed to them as received by the current process.
|
|
*/
|
|
char *filter_spec;
|
|
|
|
/*
|
|
* 'choice' is determined by parsing the filter-spec. This indicates
|
|
* the filtering algorithm to use.
|
|
*/
|
|
enum list_objects_filter_choice choice;
|
|
|
|
/*
|
|
* Choice is LOFC_DISABLED because "--no-filter" was requested.
|
|
*/
|
|
unsigned int no_filter : 1;
|
|
|
|
/*
|
|
* Parsed values (fields) from within the filter-spec. These are
|
|
* choice-specific; not all values will be defined for any given
|
|
* choice.
|
|
*/
|
|
struct object_id *sparse_oid_value;
|
|
char *sparse_path_value;
|
|
unsigned long blob_limit_value;
|
|
};
|
|
|
|
/* Normalized command line arguments */
|
|
#define CL_ARG__FILTER "filter"
|
|
|
|
int parse_list_objects_filter(
|
|
struct list_objects_filter_options *filter_options,
|
|
const char *arg);
|
|
|
|
int opt_parse_list_objects_filter(const struct option *opt,
|
|
const char *arg, int unset);
|
|
|
|
#define OPT_PARSE_LIST_OBJECTS_FILTER(fo) \
|
|
{ OPTION_CALLBACK, 0, CL_ARG__FILTER, fo, N_("args"), \
|
|
N_("object filtering"), 0, \
|
|
opt_parse_list_objects_filter }
|
|
|
|
void list_objects_filter_release(
|
|
struct list_objects_filter_options *filter_options);
|
|
|
|
static inline void list_objects_filter_set_no_filter(
|
|
struct list_objects_filter_options *filter_options)
|
|
{
|
|
list_objects_filter_release(filter_options);
|
|
filter_options->no_filter = 1;
|
|
}
|
|
|
|
void partial_clone_register(
|
|
const char *remote,
|
|
const struct list_objects_filter_options *filter_options);
|
|
void partial_clone_get_default_filter_spec(
|
|
struct list_objects_filter_options *filter_options);
|
|
|
|
#endif /* LIST_OBJECTS_FILTER_OPTIONS_H */
|