1#ifndef REF_FILTER_H 2#define REF_FILTER_H 3 4#include"sha1-array.h" 5#include"refs.h" 6#include"commit.h" 7#include"parse-options.h" 8 9/* Quoting styles */ 10#define QUOTE_NONE 0 11#define QUOTE_SHELL 1 12#define QUOTE_PERL 2 13#define QUOTE_PYTHON 4 14#define QUOTE_TCL 8 15 16#define FILTER_REFS_INCLUDE_BROKEN 0x0001 17#define FILTER_REFS_TAGS 0x0002 18#define FILTER_REFS_BRANCHES 0x0004 19#define FILTER_REFS_REMOTES 0x0008 20#define FILTER_REFS_OTHERS 0x0010 21#define FILTER_REFS_ALL (FILTER_REFS_TAGS | FILTER_REFS_BRANCHES | \ 22 FILTER_REFS_REMOTES | FILTER_REFS_OTHERS) 23#define FILTER_REFS_DETACHED_HEAD 0x0020 24#define FILTER_REFS_KIND_MASK (FILTER_REFS_ALL | FILTER_REFS_DETACHED_HEAD) 25 26struct atom_value; 27 28struct ref_sorting { 29struct ref_sorting *next; 30int atom;/* index into used_atom array (internal) */ 31unsigned reverse :1, 32 ignore_case :1, 33 version :1; 34}; 35 36struct ref_array_item { 37struct object_id objectname; 38int flag; 39unsigned int kind; 40const char*symref; 41struct commit *commit; 42struct atom_value *value; 43char refname[FLEX_ARRAY]; 44}; 45 46struct ref_array { 47int nr, alloc; 48struct ref_array_item **items; 49struct rev_info *revs; 50}; 51 52struct ref_filter { 53const char**name_patterns; 54struct oid_array points_at; 55struct commit_list *with_commit; 56struct commit_list *no_commit; 57 58enum{ 59 REF_FILTER_MERGED_NONE =0, 60 REF_FILTER_MERGED_INCLUDE, 61 REF_FILTER_MERGED_OMIT 62} merge; 63struct commit *merge_commit; 64 65unsigned int with_commit_tag_algo :1, 66 match_as_path :1, 67 ignore_case :1, 68 detached :1; 69unsigned int kind, 70 lines; 71int abbrev, 72 verbose; 73}; 74 75struct ref_format { 76/* 77 * Set these to define the format; make sure you call 78 * verify_ref_format() afterwards to finalize. 79 */ 80const char*format; 81int quote_style; 82int use_color; 83 84/* Internal state to ref-filter */ 85int need_color_reset_at_eol; 86}; 87 88#define REF_FORMAT_INIT { NULL, 0, -1 } 89 90/* Macros for checking --merged and --no-merged options */ 91#define _OPT_MERGED_NO_MERGED(option, filter, h) \ 92 { OPTION_CALLBACK, 0, option, (filter), N_("commit"), (h), \ 93 PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, \ 94 parse_opt_merge_filter, (intptr_t)"HEAD" \ 95 } 96#define OPT_MERGED(f, h) _OPT_MERGED_NO_MERGED("merged", f, h) 97#define OPT_NO_MERGED(f, h) _OPT_MERGED_NO_MERGED("no-merged", f, h) 98 99#define OPT_REF_SORT(var) \ 100 OPT_CALLBACK_F(0,"sort", (var), \ 101 N_("key"), N_("field name to sort on"), \ 102 PARSE_OPT_NONEG, parse_opt_ref_sorting) 103 104/* 105 * API for filtering a set of refs. Based on the type of refs the user 106 * has requested, we iterate through those refs and apply filters 107 * as per the given ref_filter structure and finally store the 108 * filtered refs in the ref_array structure. 109 */ 110intfilter_refs(struct ref_array *array,struct ref_filter *filter,unsigned int type); 111/* Clear all memory allocated to ref_array */ 112voidref_array_clear(struct ref_array *array); 113/* Used to verify if the given format is correct and to parse out the used atoms */ 114intverify_ref_format(struct ref_format *format); 115/* Sort the given ref_array as per the ref_sorting provided */ 116voidref_array_sort(struct ref_sorting *sort,struct ref_array *array); 117/* Based on the given format and quote_style, fill the strbuf */ 118intformat_ref_array_item(struct ref_array_item *info, 119const struct ref_format *format, 120struct strbuf *final_buf, 121struct strbuf *error_buf); 122/* Print the ref using the given format and quote_style */ 123voidshow_ref_array_item(struct ref_array_item *info,const struct ref_format *format); 124/* Parse a single sort specifier and add it to the list */ 125voidparse_ref_sorting(struct ref_sorting **sorting_tail,const char*atom); 126/* Callback function for parsing the sort option */ 127intparse_opt_ref_sorting(const struct option *opt,const char*arg,int unset); 128/* Default sort option based on refname */ 129struct ref_sorting *ref_default_sorting(void); 130/* Function to parse --merged and --no-merged options */ 131intparse_opt_merge_filter(const struct option *opt,const char*arg,int unset); 132/* Get the current HEAD's description */ 133char*get_head_description(void); 134/* Set up translated strings in the output. */ 135voidsetup_ref_filter_porcelain_msg(void); 136 137/* 138 * Print a single ref, outside of any ref-filter. Note that the 139 * name must be a fully qualified refname. 140 */ 141voidpretty_print_ref(const char*name,const struct object_id *oid, 142const struct ref_format *format); 143 144/* 145 * Push a single ref onto the array; this can be used to construct your own 146 * ref_array without using filter_refs(). 147 */ 148struct ref_array_item *ref_array_push(struct ref_array *array, 149const char*refname, 150const struct object_id *oid); 151 152#endif/* REF_FILTER_H */