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/* 100 * API for filtering a set of refs. Based on the type of refs the user 101 * has requested, we iterate through those refs and apply filters 102 * as per the given ref_filter structure and finally store the 103 * filtered refs in the ref_array structure. 104 */ 105intfilter_refs(struct ref_array *array,struct ref_filter *filter,unsigned int type); 106/* Clear all memory allocated to ref_array */ 107voidref_array_clear(struct ref_array *array); 108/* Used to verify if the given format is correct and to parse out the used atoms */ 109intverify_ref_format(struct ref_format *format); 110/* Sort the given ref_array as per the ref_sorting provided */ 111voidref_array_sort(struct ref_sorting *sort,struct ref_array *array); 112/* Based on the given format and quote_style, fill the strbuf */ 113intformat_ref_array_item(struct ref_array_item *info, 114const struct ref_format *format, 115struct strbuf *final_buf, 116struct strbuf *error_buf); 117/* Print the ref using the given format and quote_style */ 118voidshow_ref_array_item(struct ref_array_item *info,const struct ref_format *format); 119/* Parse a single sort specifier and add it to the list */ 120voidparse_ref_sorting(struct ref_sorting **sorting_tail,const char*atom); 121/* Callback function for parsing the sort option */ 122intparse_opt_ref_sorting(const struct option *opt,const char*arg,int unset); 123/* Default sort option based on refname */ 124struct ref_sorting *ref_default_sorting(void); 125/* Function to parse --merged and --no-merged options */ 126intparse_opt_merge_filter(const struct option *opt,const char*arg,int unset); 127/* Get the current HEAD's description */ 128char*get_head_description(void); 129/* Set up translated strings in the output. */ 130voidsetup_ref_filter_porcelain_msg(void); 131 132/* 133 * Print a single ref, outside of any ref-filter. Note that the 134 * name must be a fully qualified refname. 135 */ 136voidpretty_print_ref(const char*name,const struct object_id *oid, 137const struct ref_format *format); 138 139/* 140 * Push a single ref onto the array; this can be used to construct your own 141 * ref_array without using filter_refs(). 142 */ 143struct ref_array_item *ref_array_push(struct ref_array *array, 144const char*refname, 145const struct object_id *oid); 146 147#endif/* REF_FILTER_H */