mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
Merge branch 'la/hide-trailer-info'
The trailer API has been reshuffled a bit. * la/hide-trailer-info: trailer unit tests: inspect iterator contents trailer: document parse_trailers() usage trailer: retire trailer_info_get() from API trailer: make trailer_info struct private trailer: make parse_trailers() return trailer_info pointer interpret-trailers: access trailer_info with new helpers sequencer: use the trailer iterator trailer: teach iterator about non-trailer lines trailer: add unit tests for trailer iterator Makefile: sort UNIT_TEST_PROGRAMS
This commit is contained in:
169
trailer.c
169
trailer.c
@@ -11,6 +11,27 @@
|
||||
* Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
|
||||
*/
|
||||
|
||||
struct trailer_info {
|
||||
/*
|
||||
* True if there is a blank line before the location pointed to by
|
||||
* trailer_block_start.
|
||||
*/
|
||||
int blank_line_before_trailer;
|
||||
|
||||
/*
|
||||
* Offsets to the trailer block start and end positions in the input
|
||||
* string. If no trailer block is found, these are both set to the
|
||||
* "true" end of the input (find_end_of_log_message()).
|
||||
*/
|
||||
size_t trailer_block_start, trailer_block_end;
|
||||
|
||||
/*
|
||||
* Array of trailers found.
|
||||
*/
|
||||
char **trailers;
|
||||
size_t trailer_nr;
|
||||
};
|
||||
|
||||
struct conf_info {
|
||||
char *name;
|
||||
char *key;
|
||||
@@ -952,58 +973,16 @@ static void unfold_value(struct strbuf *val)
|
||||
strbuf_release(&out);
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse trailers in "str", populating the trailer info and "head"
|
||||
* linked list structure.
|
||||
*/
|
||||
void parse_trailers(const struct process_trailer_options *opts,
|
||||
struct trailer_info *info,
|
||||
const char *str,
|
||||
struct list_head *head)
|
||||
static struct trailer_info *trailer_info_new(void)
|
||||
{
|
||||
struct strbuf tok = STRBUF_INIT;
|
||||
struct strbuf val = STRBUF_INIT;
|
||||
size_t i;
|
||||
|
||||
trailer_info_get(opts, str, info);
|
||||
|
||||
for (i = 0; i < info->trailer_nr; i++) {
|
||||
int separator_pos;
|
||||
char *trailer = info->trailers[i];
|
||||
if (starts_with(trailer, comment_line_str))
|
||||
continue;
|
||||
separator_pos = find_separator(trailer, separators);
|
||||
if (separator_pos >= 1) {
|
||||
parse_trailer(&tok, &val, NULL, trailer,
|
||||
separator_pos);
|
||||
if (opts->unfold)
|
||||
unfold_value(&val);
|
||||
add_trailer_item(head,
|
||||
strbuf_detach(&tok, NULL),
|
||||
strbuf_detach(&val, NULL));
|
||||
} else if (!opts->only_trailers) {
|
||||
strbuf_addstr(&val, trailer);
|
||||
strbuf_strip_suffix(&val, "\n");
|
||||
add_trailer_item(head,
|
||||
NULL,
|
||||
strbuf_detach(&val, NULL));
|
||||
}
|
||||
}
|
||||
struct trailer_info *info = xcalloc(1, sizeof(*info));
|
||||
return info;
|
||||
}
|
||||
|
||||
void free_trailers(struct list_head *trailers)
|
||||
{
|
||||
struct list_head *pos, *p;
|
||||
list_for_each_safe(pos, p, trailers) {
|
||||
list_del(pos);
|
||||
free_trailer_item(list_entry(pos, struct trailer_item, list));
|
||||
}
|
||||
}
|
||||
|
||||
void trailer_info_get(const struct process_trailer_options *opts,
|
||||
const char *str,
|
||||
struct trailer_info *info)
|
||||
static struct trailer_info *trailer_info_get(const struct process_trailer_options *opts,
|
||||
const char *str)
|
||||
{
|
||||
struct trailer_info *info = trailer_info_new();
|
||||
size_t end_of_log_message = 0, trailer_block_start = 0;
|
||||
struct strbuf **trailer_lines, **ptr;
|
||||
char **trailer_strings = NULL;
|
||||
@@ -1042,6 +1021,73 @@ void trailer_info_get(const struct process_trailer_options *opts,
|
||||
info->trailer_block_end = end_of_log_message;
|
||||
info->trailers = trailer_strings;
|
||||
info->trailer_nr = nr;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse trailers in "str", populating the trailer info and "trailer_objects"
|
||||
* linked list structure.
|
||||
*/
|
||||
struct trailer_info *parse_trailers(const struct process_trailer_options *opts,
|
||||
const char *str,
|
||||
struct list_head *trailer_objects)
|
||||
{
|
||||
struct trailer_info *info;
|
||||
struct strbuf tok = STRBUF_INIT;
|
||||
struct strbuf val = STRBUF_INIT;
|
||||
size_t i;
|
||||
|
||||
info = trailer_info_get(opts, str);
|
||||
|
||||
for (i = 0; i < info->trailer_nr; i++) {
|
||||
int separator_pos;
|
||||
char *trailer = info->trailers[i];
|
||||
if (starts_with(trailer, comment_line_str))
|
||||
continue;
|
||||
separator_pos = find_separator(trailer, separators);
|
||||
if (separator_pos >= 1) {
|
||||
parse_trailer(&tok, &val, NULL, trailer,
|
||||
separator_pos);
|
||||
if (opts->unfold)
|
||||
unfold_value(&val);
|
||||
add_trailer_item(trailer_objects,
|
||||
strbuf_detach(&tok, NULL),
|
||||
strbuf_detach(&val, NULL));
|
||||
} else if (!opts->only_trailers) {
|
||||
strbuf_addstr(&val, trailer);
|
||||
strbuf_strip_suffix(&val, "\n");
|
||||
add_trailer_item(trailer_objects,
|
||||
NULL,
|
||||
strbuf_detach(&val, NULL));
|
||||
}
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
void free_trailers(struct list_head *trailers)
|
||||
{
|
||||
struct list_head *pos, *p;
|
||||
list_for_each_safe(pos, p, trailers) {
|
||||
list_del(pos);
|
||||
free_trailer_item(list_entry(pos, struct trailer_item, list));
|
||||
}
|
||||
}
|
||||
|
||||
size_t trailer_block_start(struct trailer_info *info)
|
||||
{
|
||||
return info->trailer_block_start;
|
||||
}
|
||||
|
||||
size_t trailer_block_end(struct trailer_info *info)
|
||||
{
|
||||
return info->trailer_block_end;
|
||||
}
|
||||
|
||||
int blank_line_before_trailer_block(struct trailer_info *info)
|
||||
{
|
||||
return info->blank_line_before_trailer;
|
||||
}
|
||||
|
||||
void trailer_info_release(struct trailer_info *info)
|
||||
@@ -1050,6 +1096,7 @@ void trailer_info_release(struct trailer_info *info)
|
||||
for (i = 0; i < info->trailer_nr; i++)
|
||||
free(info->trailers[i]);
|
||||
free(info->trailers);
|
||||
free(info);
|
||||
}
|
||||
|
||||
void format_trailers(const struct process_trailer_options *opts,
|
||||
@@ -1117,21 +1164,19 @@ void format_trailers_from_commit(const struct process_trailer_options *opts,
|
||||
struct strbuf *out)
|
||||
{
|
||||
LIST_HEAD(trailer_objects);
|
||||
struct trailer_info info;
|
||||
|
||||
parse_trailers(opts, &info, msg, &trailer_objects);
|
||||
struct trailer_info *info = parse_trailers(opts, msg, &trailer_objects);
|
||||
|
||||
/* If we want the whole block untouched, we can take the fast path. */
|
||||
if (!opts->only_trailers && !opts->unfold && !opts->filter &&
|
||||
!opts->separator && !opts->key_only && !opts->value_only &&
|
||||
!opts->key_value_separator) {
|
||||
strbuf_add(out, msg + info.trailer_block_start,
|
||||
info.trailer_block_end - info.trailer_block_start);
|
||||
strbuf_add(out, msg + info->trailer_block_start,
|
||||
info->trailer_block_end - info->trailer_block_start);
|
||||
} else
|
||||
format_trailers(opts, &trailer_objects, out);
|
||||
|
||||
free_trailers(&trailer_objects);
|
||||
trailer_info_release(&info);
|
||||
trailer_info_release(info);
|
||||
}
|
||||
|
||||
void trailer_iterator_init(struct trailer_iterator *iter, const char *msg)
|
||||
@@ -1140,23 +1185,21 @@ void trailer_iterator_init(struct trailer_iterator *iter, const char *msg)
|
||||
strbuf_init(&iter->key, 0);
|
||||
strbuf_init(&iter->val, 0);
|
||||
opts.no_divider = 1;
|
||||
trailer_info_get(&opts, msg, &iter->internal.info);
|
||||
iter->internal.info = trailer_info_get(&opts, msg);
|
||||
iter->internal.cur = 0;
|
||||
}
|
||||
|
||||
int trailer_iterator_advance(struct trailer_iterator *iter)
|
||||
{
|
||||
while (iter->internal.cur < iter->internal.info.trailer_nr) {
|
||||
char *trailer = iter->internal.info.trailers[iter->internal.cur++];
|
||||
int separator_pos = find_separator(trailer, separators);
|
||||
|
||||
if (separator_pos < 1)
|
||||
continue; /* not a real trailer */
|
||||
if (iter->internal.cur < iter->internal.info->trailer_nr) {
|
||||
char *line = iter->internal.info->trailers[iter->internal.cur++];
|
||||
int separator_pos = find_separator(line, separators);
|
||||
|
||||
iter->raw = line;
|
||||
strbuf_reset(&iter->key);
|
||||
strbuf_reset(&iter->val);
|
||||
parse_trailer(&iter->key, &iter->val, NULL,
|
||||
trailer, separator_pos);
|
||||
line, separator_pos);
|
||||
/* Always unfold values during iteration. */
|
||||
unfold_value(&iter->val);
|
||||
return 1;
|
||||
@@ -1166,7 +1209,7 @@ int trailer_iterator_advance(struct trailer_iterator *iter)
|
||||
|
||||
void trailer_iterator_release(struct trailer_iterator *iter)
|
||||
{
|
||||
trailer_info_release(&iter->internal.info);
|
||||
trailer_info_release(iter->internal.info);
|
||||
strbuf_release(&iter->val);
|
||||
strbuf_release(&iter->key);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user