]>
Commit | Line | Data |
---|---|---|
69b1cf91 KN |
1 | #ifndef REF_FILTER_H |
2 | #define REF_FILTER_H | |
3 | ||
fe299ec5 | 4 | #include "oid-array.h" |
69b1cf91 KN |
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 | ||
5b4f2851 KN |
16 | #define FILTER_REFS_TAGS 0x0002 |
17 | #define FILTER_REFS_BRANCHES 0x0004 | |
18 | #define FILTER_REFS_REMOTES 0x0008 | |
19 | #define FILTER_REFS_OTHERS 0x0010 | |
20 | #define FILTER_REFS_ALL (FILTER_REFS_TAGS | FILTER_REFS_BRANCHES | \ | |
21 | FILTER_REFS_REMOTES | FILTER_REFS_OTHERS) | |
22 | #define FILTER_REFS_DETACHED_HEAD 0x0020 | |
23 | #define FILTER_REFS_KIND_MASK (FILTER_REFS_ALL | FILTER_REFS_DETACHED_HEAD) | |
14de7fba | 24 | |
3a25761a | 25 | struct atom_value; |
98e7ab6d | 26 | struct ref_sorting; |
69b1cf91 | 27 | |
98e7ab6d JH |
28 | enum ref_sorting_order { |
29 | REF_SORTING_REVERSE = 1<<0, | |
30 | REF_SORTING_ICASE = 1<<1, | |
31 | REF_SORTING_VERSION = 1<<2, | |
32 | REF_SORTING_DETACHED_HEAD_FIRST = 1<<3, | |
69b1cf91 KN |
33 | }; |
34 | ||
35 | struct ref_array_item { | |
cedfc41a | 36 | struct object_id objectname; |
b9dee075 | 37 | const char *rest; |
69b1cf91 | 38 | int flag; |
5b4f2851 | 39 | unsigned int kind; |
69b1cf91 | 40 | const char *symref; |
35257aa0 | 41 | struct commit *commit; |
69b1cf91 | 42 | struct atom_value *value; |
1958a6eb | 43 | char refname[FLEX_ARRAY]; |
69b1cf91 KN |
44 | }; |
45 | ||
46 | struct ref_array { | |
47 | int nr, alloc; | |
48 | struct ref_array_item **items; | |
1511b22d | 49 | struct rev_info *revs; |
69b1cf91 KN |
50 | }; |
51 | ||
52 | struct ref_filter { | |
53 | const char **name_patterns; | |
910650d2 | 54 | struct oid_array points_at; |
ee2bd06b | 55 | struct commit_list *with_commit; |
ac3f5a34 | 56 | struct commit_list *no_commit; |
21bf9339 AL |
57 | struct commit_list *reachable_from; |
58 | struct commit_list *unreachable_from; | |
ee2bd06b | 59 | |
bef0e12b | 60 | unsigned int with_commit_tag_algo : 1, |
1511b22d | 61 | match_as_path : 1, |
3bb16a8b | 62 | ignore_case : 1, |
1511b22d | 63 | detached : 1; |
1bb38e5a KN |
64 | unsigned int kind, |
65 | lines; | |
1511b22d KN |
66 | int abbrev, |
67 | verbose; | |
69b1cf91 KN |
68 | }; |
69 | ||
4a68e36d JK |
70 | struct ref_format { |
71 | /* | |
72 | * Set these to define the format; make sure you call | |
73 | * verify_ref_format() afterwards to finalize. | |
74 | */ | |
75 | const char *format; | |
b9dee075 | 76 | const char *rest; |
4a68e36d | 77 | int quote_style; |
b9dee075 | 78 | int use_rest; |
11b087ad | 79 | int use_color; |
bf285ae6 JK |
80 | |
81 | /* Internal state to ref-filter */ | |
82 | int need_color_reset_at_eol; | |
4a68e36d JK |
83 | }; |
84 | ||
b9dee075 | 85 | #define REF_FORMAT_INIT { .use_color = -1 } |
4a68e36d | 86 | |
5afcb905 KN |
87 | /* Macros for checking --merged and --no-merged options */ |
88 | #define _OPT_MERGED_NO_MERGED(option, filter, h) \ | |
89 | { OPTION_CALLBACK, 0, option, (filter), N_("commit"), (h), \ | |
90 | PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, \ | |
91 | parse_opt_merge_filter, (intptr_t) "HEAD" \ | |
92 | } | |
93 | #define OPT_MERGED(f, h) _OPT_MERGED_NO_MERGED("merged", f, h) | |
94 | #define OPT_NO_MERGED(f, h) _OPT_MERGED_NO_MERGED("no-merged", f, h) | |
95 | ||
95be717c | 96 | #define OPT_REF_SORT(var) \ |
98e7ab6d JH |
97 | OPT_STRING_LIST(0, "sort", (var), \ |
98 | N_("key"), N_("field name to sort on")) | |
95be717c | 99 | |
14de7fba KN |
100 | /* |
101 | * API for filtering a set of refs. Based on the type of refs the user | |
102 | * has requested, we iterate through those refs and apply filters | |
103 | * as per the given ref_filter structure and finally store the | |
104 | * filtered refs in the ref_array structure. | |
105 | */ | |
106 | int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int type); | |
69b1cf91 KN |
107 | /* Clear all memory allocated to ref_array */ |
108 | void ref_array_clear(struct ref_array *array); | |
69b1cf91 | 109 | /* Used to verify if the given format is correct and to parse out the used atoms */ |
4a68e36d | 110 | int verify_ref_format(struct ref_format *format); |
69b1cf91 KN |
111 | /* Sort the given ref_array as per the ref_sorting provided */ |
112 | void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); | |
7c269a7b ÆAB |
113 | /* Set REF_SORTING_* sort_flags for all elements of a sorting list */ |
114 | void ref_sorting_set_sort_flags_all(struct ref_sorting *sorting, unsigned int mask, int on); | |
99c6a71d | 115 | /* Based on the given format and quote_style, fill the strbuf */ |
3019eca9 | 116 | int format_ref_array_item(struct ref_array_item *info, |
e85fcb35 | 117 | struct ref_format *format, |
3019eca9 OT |
118 | struct strbuf *final_buf, |
119 | struct strbuf *error_buf); | |
e5fb0286 ÆAB |
120 | /* Release a "struct ref_sorting" */ |
121 | void ref_sorting_release(struct ref_sorting *); | |
98e7ab6d JH |
122 | /* Convert list of sort options into ref_sorting */ |
123 | struct ref_sorting *ref_sorting_options(struct string_list *); | |
5afcb905 KN |
124 | /* Function to parse --merged and --no-merged options */ |
125 | int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset); | |
d4919bb2 KN |
126 | /* Get the current HEAD's description */ |
127 | char *get_head_description(void); | |
6eac70fa KN |
128 | /* Set up translated strings in the output. */ |
129 | void setup_ref_filter_porcelain_msg(void); | |
69b1cf91 | 130 | |
2111aa79 LP |
131 | /* |
132 | * Print a single ref, outside of any ref-filter. Note that the | |
133 | * name must be a fully qualified refname. | |
134 | */ | |
53df97a2 | 135 | void pretty_print_ref(const char *name, const struct object_id *oid, |
e85fcb35 | 136 | struct ref_format *format); |
2111aa79 | 137 | |
427cbc9d JK |
138 | /* |
139 | * Push a single ref onto the array; this can be used to construct your own | |
140 | * ref_array without using filter_refs(). | |
141 | */ | |
142 | struct ref_array_item *ref_array_push(struct ref_array *array, | |
143 | const char *refname, | |
144 | const struct object_id *oid); | |
145 | ||
69b1cf91 | 146 | #endif /* REF_FILTER_H */ |