Git fork
at reftables-rust 119 lines 3.2 kB view raw
1/* 2 * Another stupid program, this one parsing the headers of an 3 * email to figure out authorship and subject 4 */ 5#define USE_THE_REPOSITORY_VARIABLE 6#include "builtin.h" 7#include "abspath.h" 8#include "environment.h" 9#include "gettext.h" 10#include "strbuf.h" 11#include "mailinfo.h" 12#include "parse-options.h" 13 14static const char * const mailinfo_usage[] = { 15 /* TRANSLATORS: keep <> in "<" mail ">" info. */ 16 N_("git mailinfo [<options>] <msg> <patch> < mail >info"), 17 NULL, 18}; 19 20struct metainfo_charset 21{ 22 enum { 23 CHARSET_DEFAULT, 24 CHARSET_NO_REENCODE, 25 CHARSET_EXPLICIT, 26 } policy; 27 const char *charset; 28}; 29 30static int parse_opt_explicit_encoding(const struct option *opt, 31 const char *arg, int unset) 32{ 33 struct metainfo_charset *meta_charset = opt->value; 34 35 BUG_ON_OPT_NEG(unset); 36 37 meta_charset->policy = CHARSET_EXPLICIT; 38 meta_charset->charset = arg; 39 40 return 0; 41} 42 43static int parse_opt_quoted_cr(const struct option *opt, const char *arg, int unset) 44{ 45 BUG_ON_OPT_NEG(unset); 46 47 if (mailinfo_parse_quoted_cr_action(arg, opt->value) != 0) 48 return error(_("bad action '%s' for '%s'"), arg, "--quoted-cr"); 49 return 0; 50} 51 52int cmd_mailinfo(int argc, 53 const char **argv, 54 const char *prefix, 55 struct repository *repo UNUSED) 56{ 57 struct metainfo_charset meta_charset; 58 struct mailinfo mi; 59 int status; 60 char *msgfile, *patchfile; 61 62 struct option options[] = { 63 OPT_BOOL('k', NULL, &mi.keep_subject, N_("keep subject")), 64 OPT_BOOL('b', NULL, &mi.keep_non_patch_brackets_in_subject, 65 N_("keep non patch brackets in subject")), 66 OPT_BOOL('m', "message-id", &mi.add_message_id, 67 N_("copy Message-ID to the end of commit message")), 68 OPT_SET_INT_F('u', NULL, &meta_charset.policy, 69 N_("re-code metadata to i18n.commitEncoding"), 70 CHARSET_DEFAULT, PARSE_OPT_NONEG), 71 OPT_SET_INT_F('n', NULL, &meta_charset.policy, 72 N_("disable charset re-coding of metadata"), 73 CHARSET_NO_REENCODE, PARSE_OPT_NONEG), 74 OPT_CALLBACK_F(0, "encoding", &meta_charset, N_("encoding"), 75 N_("re-code metadata to this encoding"), 76 PARSE_OPT_NONEG, parse_opt_explicit_encoding), 77 OPT_BOOL(0, "scissors", &mi.use_scissors, N_("use scissors")), 78 OPT_CALLBACK_F(0, "quoted-cr", &mi.quoted_cr, N_("<action>"), 79 N_("action when quoted CR is found"), 80 PARSE_OPT_NONEG, parse_opt_quoted_cr), 81 OPT_HIDDEN_BOOL(0, "inbody-headers", &mi.use_inbody_headers, 82 N_("use headers in message's body")), 83 OPT_END() 84 }; 85 86 setup_mailinfo(the_repository, &mi); 87 meta_charset.policy = CHARSET_DEFAULT; 88 89 argc = parse_options(argc, argv, prefix, options, mailinfo_usage, 0); 90 91 if (argc != 2) 92 usage_with_options(mailinfo_usage, options); 93 94 switch (meta_charset.policy) { 95 case CHARSET_DEFAULT: 96 mi.metainfo_charset = get_commit_output_encoding(); 97 break; 98 case CHARSET_NO_REENCODE: 99 mi.metainfo_charset = NULL; 100 break; 101 case CHARSET_EXPLICIT: 102 break; 103 default: 104 BUG("invalid meta_charset.policy"); 105 } 106 107 mi.input = stdin; 108 mi.output = stdout; 109 110 msgfile = prefix_filename(prefix, argv[0]); 111 patchfile = prefix_filename(prefix, argv[1]); 112 113 status = !!mailinfo(&mi, msgfile, patchfile); 114 clear_mailinfo(&mi); 115 116 free(msgfile); 117 free(patchfile); 118 return status; 119}