]>
Commit | Line | Data |
---|---|---|
b1d78d77 CC |
1 | #ifndef TRAILER_H |
2 | #define TRAILER_H | |
3 | ||
51166b87 | 4 | #include "list.h" |
f0939a0e | 5 | #include "strbuf.h" |
ef3ca954 | 6 | |
52fc319d | 7 | enum trailer_where { |
0ea5292e | 8 | WHERE_DEFAULT, |
52fc319d PB |
9 | WHERE_END, |
10 | WHERE_AFTER, | |
11 | WHERE_BEFORE, | |
12 | WHERE_START | |
13 | }; | |
14 | enum trailer_if_exists { | |
0ea5292e | 15 | EXISTS_DEFAULT, |
52fc319d PB |
16 | EXISTS_ADD_IF_DIFFERENT_NEIGHBOR, |
17 | EXISTS_ADD_IF_DIFFERENT, | |
18 | EXISTS_ADD, | |
19 | EXISTS_REPLACE, | |
20 | EXISTS_DO_NOTHING | |
21 | }; | |
22 | enum trailer_if_missing { | |
0ea5292e | 23 | MISSING_DEFAULT, |
52fc319d PB |
24 | MISSING_ADD, |
25 | MISSING_DO_NOTHING | |
26 | }; | |
27 | ||
28 | int trailer_set_where(enum trailer_where *item, const char *value); | |
29 | int trailer_set_if_exists(enum trailer_if_exists *item, const char *value); | |
30 | int trailer_set_if_missing(enum trailer_if_missing *item, const char *value); | |
31 | ||
e8c352c3 JT |
32 | struct trailer_info { |
33 | /* | |
34 | * True if there is a blank line before the location pointed to by | |
35 | * trailer_start. | |
36 | */ | |
37 | int blank_line_before_trailer; | |
38 | ||
39 | /* | |
40 | * Pointers to the start and end of the trailer block found. If there | |
41 | * is no trailer block found, these 2 pointers point to the end of the | |
42 | * input string. | |
43 | */ | |
44 | const char *trailer_start, *trailer_end; | |
45 | ||
46 | /* | |
47 | * Array of trailers found. | |
48 | */ | |
49 | char **trailers; | |
50 | size_t trailer_nr; | |
51 | }; | |
52 | ||
51166b87 PB |
53 | /* |
54 | * A list that represents newly-added trailers, such as those provided | |
55 | * with the --trailer command line option of git-interpret-trailers. | |
56 | */ | |
57 | struct new_trailer_item { | |
58 | struct list_head list; | |
59 | ||
60 | const char *text; | |
0ea5292e PB |
61 | |
62 | enum trailer_where where; | |
63 | enum trailer_if_exists if_exists; | |
64 | enum trailer_if_missing if_missing; | |
51166b87 PB |
65 | }; |
66 | ||
8abc8980 JK |
67 | struct process_trailer_options { |
68 | int in_place; | |
69 | int trim_empty; | |
56c493ed | 70 | int only_trailers; |
fdbdb64f | 71 | int only_input; |
00002396 | 72 | int unfold; |
1688c9a4 | 73 | int no_divider; |
9d87d5ae | 74 | int key_only; |
d9b936db | 75 | int value_only; |
0b691d86 | 76 | const struct strbuf *separator; |
058761f1 | 77 | const struct strbuf *key_value_separator; |
250bea0c AW |
78 | int (*filter)(const struct strbuf *, void *); |
79 | void *filter_data; | |
8abc8980 JK |
80 | }; |
81 | ||
82 | #define PROCESS_TRAILER_OPTIONS_INIT {0} | |
83 | ||
84 | void process_trailers(const char *file, | |
85 | const struct process_trailer_options *opts, | |
51166b87 | 86 | struct list_head *new_trailer_head); |
b1d78d77 | 87 | |
00a21f5c JK |
88 | void trailer_info_get(struct trailer_info *info, const char *str, |
89 | const struct process_trailer_options *opts); | |
e8c352c3 JT |
90 | |
91 | void trailer_info_release(struct trailer_info *info); | |
92 | ||
a388b10f JK |
93 | /* |
94 | * Format the trailers from the commit msg "msg" into the strbuf "out". | |
95 | * Note two caveats about "opts": | |
96 | * | |
97 | * - this is primarily a helper for pretty.c, and not | |
98 | * all of the flags are supported. | |
99 | * | |
100 | * - this differs from process_trailers slightly in that we always format | |
101 | * only the trailer block itself, even if the "only_trailers" option is not | |
102 | * set. | |
103 | */ | |
104 | void format_trailers_from_commit(struct strbuf *out, const char *msg, | |
105 | const struct process_trailer_options *opts); | |
106 | ||
f0939a0e JK |
107 | /* |
108 | * An interface for iterating over the trailers found in a particular commit | |
109 | * message. Use like: | |
110 | * | |
111 | * struct trailer_iterator iter; | |
112 | * trailer_iterator_init(&iter, msg); | |
113 | * while (trailer_iterator_advance(&iter)) | |
114 | * ... do something with iter.key and iter.val ... | |
115 | * trailer_iterator_release(&iter); | |
116 | */ | |
117 | struct trailer_iterator { | |
118 | struct strbuf key; | |
119 | struct strbuf val; | |
120 | ||
121 | /* private */ | |
13211ae2 LA |
122 | struct { |
123 | struct trailer_info info; | |
124 | size_t cur; | |
125 | } internal; | |
f0939a0e JK |
126 | }; |
127 | ||
128 | /* | |
129 | * Initialize "iter" in preparation for walking over the trailers in the commit | |
130 | * message "msg". The "msg" pointer must remain valid until the iterator is | |
131 | * released. | |
132 | * | |
133 | * After initializing, note that key/val will not yet point to any trailer. | |
134 | * Call advance() to parse the first one (if any). | |
135 | */ | |
136 | void trailer_iterator_init(struct trailer_iterator *iter, const char *msg); | |
137 | ||
138 | /* | |
139 | * Advance to the next trailer of the iterator. Returns 0 if there is no such | |
140 | * trailer, and 1 otherwise. The key and value of the trailer can be | |
141 | * fetched from the iter->key and iter->value fields (which are valid | |
142 | * only until the next advance). | |
143 | */ | |
144 | int trailer_iterator_advance(struct trailer_iterator *iter); | |
145 | ||
146 | /* | |
147 | * Release all resources associated with the trailer iteration. | |
148 | */ | |
149 | void trailer_iterator_release(struct trailer_iterator *iter); | |
150 | ||
b1d78d77 | 151 | #endif /* TRAILER_H */ |