trailer: streamline trailer item create and add
Currently, creation and addition (to a list) of trailer items are spread across multiple functions. Streamline this by only having 2 functions: one to parse the user-supplied string, and one to add the parsed information to a list. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
8966a39483
commit
63ab3f3484
138
trailer.c
138
trailer.c
|
@ -500,10 +500,31 @@ static int git_trailer_config(const char *conf_key, const char *value, void *cb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char *trailer)
|
static const char *token_from_item(struct trailer_item *item, char *tok)
|
||||||
|
{
|
||||||
|
if (item->conf.key)
|
||||||
|
return item->conf.key;
|
||||||
|
if (tok)
|
||||||
|
return tok;
|
||||||
|
return item->conf.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int token_matches_item(const char *tok, struct trailer_item *item, int tok_len)
|
||||||
|
{
|
||||||
|
if (!strncasecmp(tok, item->conf.name, tok_len))
|
||||||
|
return 1;
|
||||||
|
return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_trailer(struct strbuf *tok, struct strbuf *val,
|
||||||
|
const struct conf_info **conf, const char *trailer)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
struct strbuf seps = STRBUF_INIT;
|
struct strbuf seps = STRBUF_INIT;
|
||||||
|
struct trailer_item *item;
|
||||||
|
int tok_len;
|
||||||
|
struct list_head *pos;
|
||||||
|
|
||||||
strbuf_addstr(&seps, separators);
|
strbuf_addstr(&seps, separators);
|
||||||
strbuf_addch(&seps, '=');
|
strbuf_addch(&seps, '=');
|
||||||
len = strcspn(trailer, seps.buf);
|
len = strcspn(trailer, seps.buf);
|
||||||
|
@ -523,74 +544,31 @@ static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char *tra
|
||||||
strbuf_addstr(tok, trailer);
|
strbuf_addstr(tok, trailer);
|
||||||
strbuf_trim(tok);
|
strbuf_trim(tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Lookup if the token matches something in the config */
|
||||||
|
tok_len = token_len_without_separator(tok->buf, tok->len);
|
||||||
|
*conf = &default_conf_info;
|
||||||
|
list_for_each(pos, &conf_head) {
|
||||||
|
item = list_entry(pos, struct trailer_item, list);
|
||||||
|
if (token_matches_item(tok->buf, item, tok_len)) {
|
||||||
|
char *tok_buf = strbuf_detach(tok, NULL);
|
||||||
|
*conf = &item->conf;
|
||||||
|
strbuf_addstr(tok, token_from_item(item, tok_buf));
|
||||||
|
free(tok_buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *token_from_item(struct trailer_item *item, char *tok)
|
static void add_trailer_item(struct list_head *head, char *tok, char *val,
|
||||||
{
|
const struct conf_info *conf)
|
||||||
if (item->conf.key)
|
|
||||||
return item->conf.key;
|
|
||||||
if (tok)
|
|
||||||
return tok;
|
|
||||||
return item->conf.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct trailer_item *new_trailer_item(struct trailer_item *conf_item,
|
|
||||||
char *tok, char *val)
|
|
||||||
{
|
{
|
||||||
struct trailer_item *new = xcalloc(sizeof(*new), 1);
|
struct trailer_item *new = xcalloc(sizeof(*new), 1);
|
||||||
new->value = val ? val : xstrdup("");
|
new->token = tok;
|
||||||
|
new->value = val;
|
||||||
if (conf_item) {
|
duplicate_conf(&new->conf, conf);
|
||||||
duplicate_conf(&new->conf, &conf_item->conf);
|
|
||||||
new->token = xstrdup(token_from_item(conf_item, tok));
|
|
||||||
free(tok);
|
|
||||||
} else {
|
|
||||||
duplicate_conf(&new->conf, &default_conf_info);
|
|
||||||
new->token = tok;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int token_matches_item(const char *tok, struct trailer_item *item, int tok_len)
|
|
||||||
{
|
|
||||||
if (!strncasecmp(tok, item->conf.name, tok_len))
|
|
||||||
return 1;
|
|
||||||
return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct trailer_item *create_trailer_item(const char *string)
|
|
||||||
{
|
|
||||||
struct strbuf tok = STRBUF_INIT;
|
|
||||||
struct strbuf val = STRBUF_INIT;
|
|
||||||
struct trailer_item *item;
|
|
||||||
int tok_len;
|
|
||||||
struct list_head *pos;
|
|
||||||
|
|
||||||
if (parse_trailer(&tok, &val, string))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
tok_len = token_len_without_separator(tok.buf, tok.len);
|
|
||||||
|
|
||||||
/* Lookup if the token matches something in the config */
|
|
||||||
list_for_each(pos, &conf_head) {
|
|
||||||
item = list_entry(pos, struct trailer_item, list);
|
|
||||||
if (token_matches_item(tok.buf, item, tok_len))
|
|
||||||
return new_trailer_item(item,
|
|
||||||
strbuf_detach(&tok, NULL),
|
|
||||||
strbuf_detach(&val, NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_trailer_item(NULL,
|
|
||||||
strbuf_detach(&tok, NULL),
|
|
||||||
strbuf_detach(&val, NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void add_trailer_item(struct list_head *head, struct trailer_item *new)
|
|
||||||
{
|
|
||||||
if (!new)
|
|
||||||
return;
|
|
||||||
list_add_tail(&new->list, head);
|
list_add_tail(&new->list, head);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,21 +577,28 @@ static void process_command_line_args(struct list_head *arg_head,
|
||||||
{
|
{
|
||||||
struct string_list_item *tr;
|
struct string_list_item *tr;
|
||||||
struct trailer_item *item;
|
struct trailer_item *item;
|
||||||
|
struct strbuf tok = STRBUF_INIT;
|
||||||
|
struct strbuf val = STRBUF_INIT;
|
||||||
|
const struct conf_info *conf;
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
|
|
||||||
/* Add a trailer item for each configured trailer with a command */
|
/* Add a trailer item for each configured trailer with a command */
|
||||||
list_for_each(pos, &conf_head) {
|
list_for_each(pos, &conf_head) {
|
||||||
item = list_entry(pos, struct trailer_item, list);
|
item = list_entry(pos, struct trailer_item, list);
|
||||||
if (item->conf.command) {
|
if (item->conf.command)
|
||||||
struct trailer_item *new = new_trailer_item(item, NULL, NULL);
|
add_trailer_item(arg_head,
|
||||||
add_trailer_item(arg_head, new);
|
xstrdup(token_from_item(item, NULL)),
|
||||||
}
|
xstrdup(""),
|
||||||
|
&item->conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a trailer item for each trailer on the command line */
|
/* Add a trailer item for each trailer on the command line */
|
||||||
for_each_string_list_item(tr, trailers) {
|
for_each_string_list_item(tr, trailers) {
|
||||||
struct trailer_item *new = create_trailer_item(tr->string);
|
if (!parse_trailer(&tok, &val, &conf, tr->string))
|
||||||
add_trailer_item(arg_head, new);
|
add_trailer_item(arg_head,
|
||||||
|
strbuf_detach(&tok, NULL),
|
||||||
|
strbuf_detach(&val, NULL),
|
||||||
|
conf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -734,6 +719,9 @@ static int process_input_file(FILE *outfile,
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int patch_start, trailer_start, trailer_end, i;
|
int patch_start, trailer_start, trailer_end, i;
|
||||||
|
struct strbuf tok = STRBUF_INIT;
|
||||||
|
struct strbuf val = STRBUF_INIT;
|
||||||
|
const struct conf_info *conf;
|
||||||
|
|
||||||
/* Get the line count */
|
/* Get the line count */
|
||||||
while (lines[count])
|
while (lines[count])
|
||||||
|
@ -751,10 +739,12 @@ static int process_input_file(FILE *outfile,
|
||||||
|
|
||||||
/* Parse trailer lines */
|
/* Parse trailer lines */
|
||||||
for (i = trailer_start; i < trailer_end; i++) {
|
for (i = trailer_start; i < trailer_end; i++) {
|
||||||
if (lines[i]->buf[0] != comment_line_char) {
|
if (lines[i]->buf[0] != comment_line_char &&
|
||||||
struct trailer_item *new = create_trailer_item(lines[i]->buf);
|
!parse_trailer(&tok, &val, &conf, lines[i]->buf))
|
||||||
add_trailer_item(head, new);
|
add_trailer_item(head,
|
||||||
}
|
strbuf_detach(&tok, NULL),
|
||||||
|
strbuf_detach(&val, NULL),
|
||||||
|
conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return trailer_end;
|
return trailer_end;
|
||||||
|
|
Loading…
Reference in New Issue