2  * Builtin "git interpret-trailers"
 
   4  * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
 
  10 #include "parse-options.h"
 
  11 #include "string-list.h"
 
  15 static const char * const git_interpret_trailers_usage[] = {
 
  16         N_("git interpret-trailers [--in-place] [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]"),
 
  20 static enum trailer_where where;
 
  21 static enum trailer_if_exists if_exists;
 
  22 static enum trailer_if_missing if_missing;
 
  24 static int option_parse_where(const struct option *opt,
 
  25                               const char *arg, int unset)
 
  27         return trailer_set_where(&where, arg);
 
  30 static int option_parse_if_exists(const struct option *opt,
 
  31                                   const char *arg, int unset)
 
  33         return trailer_set_if_exists(&if_exists, arg);
 
  36 static int option_parse_if_missing(const struct option *opt,
 
  37                                    const char *arg, int unset)
 
  39         return trailer_set_if_missing(&if_missing, arg);
 
  42 static void new_trailers_clear(struct list_head *trailers)
 
  44         struct list_head *pos, *tmp;
 
  45         struct new_trailer_item *item;
 
  47         list_for_each_safe(pos, tmp, trailers) {
 
  48                 item = list_entry(pos, struct new_trailer_item, list);
 
  54 static int option_parse_trailer(const struct option *opt,
 
  55                                    const char *arg, int unset)
 
  57         struct list_head *trailers = opt->value;
 
  58         struct new_trailer_item *item;
 
  61                 new_trailers_clear(trailers);
 
  68         item = xmalloc(sizeof(*item));
 
  71         item->if_exists = if_exists;
 
  72         item->if_missing = if_missing;
 
  73         list_add_tail(&item->list, trailers);
 
  77 static int parse_opt_parse(const struct option *opt, const char *arg,
 
  80         struct process_trailer_options *v = opt->value;
 
  84         BUG_ON_OPT_NEG(unset);
 
  89 int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
 
  91         struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
 
  94         struct option options[] = {
 
  95                 OPT_BOOL(0, "in-place", &opts.in_place, N_("edit files in place")),
 
  96                 OPT_BOOL(0, "trim-empty", &opts.trim_empty, N_("trim empty trailers")),
 
  98                 OPT_CALLBACK(0, "where", NULL, N_("action"),
 
  99                              N_("where to place the new trailer"), option_parse_where),
 
 100                 OPT_CALLBACK(0, "if-exists", NULL, N_("action"),
 
 101                              N_("action if trailer already exists"), option_parse_if_exists),
 
 102                 OPT_CALLBACK(0, "if-missing", NULL, N_("action"),
 
 103                              N_("action if trailer is missing"), option_parse_if_missing),
 
 105                 OPT_BOOL(0, "only-trailers", &opts.only_trailers, N_("output only the trailers")),
 
 106                 OPT_BOOL(0, "only-input", &opts.only_input, N_("do not apply config rules")),
 
 107                 OPT_BOOL(0, "unfold", &opts.unfold, N_("join whitespace-continued values")),
 
 108                 { OPTION_CALLBACK, 0, "parse", &opts, NULL, N_("set parsing options"),
 
 109                         PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_parse },
 
 110                 OPT_BOOL(0, "no-divider", &opts.no_divider, N_("do not treat --- specially")),
 
 111                 OPT_CALLBACK(0, "trailer", &trailers, N_("trailer"),
 
 112                                 N_("trailer(s) to add"), option_parse_trailer),
 
 116         git_config(git_default_config, NULL);
 
 118         argc = parse_options(argc, argv, prefix, options,
 
 119                              git_interpret_trailers_usage, 0);
 
 121         if (opts.only_input && !list_empty(&trailers))
 
 123                         _("--trailer with --only-input does not make sense"),
 
 124                         git_interpret_trailers_usage,
 
 129                 for (i = 0; i < argc; i++)
 
 130                         process_trailers(argv[i], &opts, &trailers);
 
 133                         die(_("no input file given for in-place editing"));
 
 134                 process_trailers(NULL, &opts, &trailers);
 
 137         new_trailers_clear(&trailers);