log.c 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337
  1. /*
  2. * Builtin "git log" and related commands (show, whatchanged)
  3. *
  4. * (C) Copyright 2006 Linus Torvalds
  5. * 2006 Junio Hamano
  6. */
  7. #define USE_THE_INDEX_COMPATIBILITY_MACROS
  8. #include "cache.h"
  9. #include "config.h"
  10. #include "refs.h"
  11. #include "object-store.h"
  12. #include "color.h"
  13. #include "commit.h"
  14. #include "diff.h"
  15. #include "revision.h"
  16. #include "log-tree.h"
  17. #include "builtin.h"
  18. #include "tag.h"
  19. #include "reflog-walk.h"
  20. #include "patch-ids.h"
  21. #include "run-command.h"
  22. #include "shortlog.h"
  23. #include "remote.h"
  24. #include "string-list.h"
  25. #include "parse-options.h"
  26. #include "line-log.h"
  27. #include "branch.h"
  28. #include "streaming.h"
  29. #include "version.h"
  30. #include "mailmap.h"
  31. #include "gpg-interface.h"
  32. #include "progress.h"
  33. #include "commit-slab.h"
  34. #include "repository.h"
  35. #include "commit-reach.h"
  36. #include "range-diff.h"
  37. #define MAIL_DEFAULT_WRAP 72
  38. #define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100
  39. /* Set a default date-time format for git log ("log.date" config variable) */
  40. static const char *default_date_mode = NULL;
  41. static int default_abbrev_commit;
  42. static int default_show_root = 1;
  43. static int default_follow;
  44. static int default_show_signature;
  45. static int default_encode_email_headers = 1;
  46. static int decoration_style;
  47. static int decoration_given;
  48. static int use_mailmap_config = 1;
  49. static const char *fmt_patch_subject_prefix = "PATCH";
  50. static const char *fmt_pretty;
  51. static const char * const builtin_log_usage[] = {
  52. N_("git log [<options>] [<revision-range>] [[--] <path>...]"),
  53. N_("git show [<options>] <object>..."),
  54. NULL
  55. };
  56. struct line_opt_callback_data {
  57. struct rev_info *rev;
  58. const char *prefix;
  59. struct string_list args;
  60. };
  61. static int session_is_interactive(void)
  62. {
  63. return isatty(1) || pager_in_use();
  64. }
  65. static int auto_decoration_style(void)
  66. {
  67. return session_is_interactive() ? DECORATE_SHORT_REFS : 0;
  68. }
  69. static int parse_decoration_style(const char *value)
  70. {
  71. switch (git_parse_maybe_bool(value)) {
  72. case 1:
  73. return DECORATE_SHORT_REFS;
  74. case 0:
  75. return 0;
  76. default:
  77. break;
  78. }
  79. if (!strcmp(value, "full"))
  80. return DECORATE_FULL_REFS;
  81. else if (!strcmp(value, "short"))
  82. return DECORATE_SHORT_REFS;
  83. else if (!strcmp(value, "auto"))
  84. return auto_decoration_style();
  85. /*
  86. * Please update _git_log() in git-completion.bash when you
  87. * add new decoration styles.
  88. */
  89. return -1;
  90. }
  91. static int decorate_callback(const struct option *opt, const char *arg, int unset)
  92. {
  93. if (unset)
  94. decoration_style = 0;
  95. else if (arg)
  96. decoration_style = parse_decoration_style(arg);
  97. else
  98. decoration_style = DECORATE_SHORT_REFS;
  99. if (decoration_style < 0)
  100. die(_("invalid --decorate option: %s"), arg);
  101. decoration_given = 1;
  102. return 0;
  103. }
  104. static int log_line_range_callback(const struct option *option, const char *arg, int unset)
  105. {
  106. struct line_opt_callback_data *data = option->value;
  107. BUG_ON_OPT_NEG(unset);
  108. if (!arg)
  109. return -1;
  110. data->rev->line_level_traverse = 1;
  111. string_list_append(&data->args, arg);
  112. return 0;
  113. }
  114. static void init_log_defaults(void)
  115. {
  116. init_grep_defaults(the_repository);
  117. init_diff_ui_defaults();
  118. decoration_style = auto_decoration_style();
  119. }
  120. static void cmd_log_init_defaults(struct rev_info *rev)
  121. {
  122. if (fmt_pretty)
  123. get_commit_format(fmt_pretty, rev);
  124. if (default_follow)
  125. rev->diffopt.flags.default_follow_renames = 1;
  126. rev->verbose_header = 1;
  127. rev->diffopt.flags.recursive = 1;
  128. rev->diffopt.stat_width = -1; /* use full terminal width */
  129. rev->diffopt.stat_graph_width = -1; /* respect statGraphWidth config */
  130. rev->abbrev_commit = default_abbrev_commit;
  131. rev->show_root_diff = default_show_root;
  132. rev->subject_prefix = fmt_patch_subject_prefix;
  133. rev->show_signature = default_show_signature;
  134. rev->encode_email_headers = default_encode_email_headers;
  135. rev->diffopt.flags.allow_textconv = 1;
  136. if (default_date_mode)
  137. parse_date_format(default_date_mode, &rev->date_mode);
  138. }
  139. static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
  140. struct rev_info *rev, struct setup_revision_opt *opt)
  141. {
  142. struct userformat_want w;
  143. int quiet = 0, source = 0, mailmap;
  144. static struct line_opt_callback_data line_cb = {NULL, NULL, STRING_LIST_INIT_DUP};
  145. static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP;
  146. static struct string_list decorate_refs_exclude_config = STRING_LIST_INIT_NODUP;
  147. static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
  148. struct decoration_filter decoration_filter = {&decorate_refs_include,
  149. &decorate_refs_exclude,
  150. &decorate_refs_exclude_config};
  151. static struct revision_sources revision_sources;
  152. const struct option builtin_log_options[] = {
  153. OPT__QUIET(&quiet, N_("suppress diff output")),
  154. OPT_BOOL(0, "source", &source, N_("show source")),
  155. OPT_BOOL(0, "use-mailmap", &mailmap, N_("Use mail map file")),
  156. OPT_ALIAS(0, "mailmap", "use-mailmap"),
  157. OPT_STRING_LIST(0, "decorate-refs", &decorate_refs_include,
  158. N_("pattern"), N_("only decorate refs that match <pattern>")),
  159. OPT_STRING_LIST(0, "decorate-refs-exclude", &decorate_refs_exclude,
  160. N_("pattern"), N_("do not decorate refs that match <pattern>")),
  161. OPT_CALLBACK_F(0, "decorate", NULL, NULL, N_("decorate options"),
  162. PARSE_OPT_OPTARG, decorate_callback),
  163. OPT_CALLBACK('L', NULL, &line_cb, "n,m:file",
  164. N_("Process line range n,m in file, counting from 1"),
  165. log_line_range_callback),
  166. OPT_END()
  167. };
  168. line_cb.rev = rev;
  169. line_cb.prefix = prefix;
  170. mailmap = use_mailmap_config;
  171. argc = parse_options(argc, argv, prefix,
  172. builtin_log_options, builtin_log_usage,
  173. PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
  174. PARSE_OPT_KEEP_DASHDASH);
  175. if (quiet)
  176. rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT;
  177. argc = setup_revisions(argc, argv, rev, opt);
  178. /* Any arguments at this point are not recognized */
  179. if (argc > 1)
  180. die(_("unrecognized argument: %s"), argv[1]);
  181. memset(&w, 0, sizeof(w));
  182. userformat_find_requirements(NULL, &w);
  183. if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
  184. rev->show_notes = 1;
  185. if (rev->show_notes)
  186. load_display_notes(&rev->notes_opt);
  187. if ((rev->diffopt.pickaxe_opts & DIFF_PICKAXE_KINDS_MASK) ||
  188. rev->diffopt.filter || rev->diffopt.flags.follow_renames)
  189. rev->always_show_header = 0;
  190. if (source || w.source) {
  191. init_revision_sources(&revision_sources);
  192. rev->sources = &revision_sources;
  193. }
  194. if (mailmap) {
  195. rev->mailmap = xcalloc(1, sizeof(struct string_list));
  196. read_mailmap(rev->mailmap, NULL);
  197. }
  198. if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
  199. /*
  200. * "log --pretty=raw" is special; ignore UI oriented
  201. * configuration variables such as decoration.
  202. */
  203. if (!decoration_given)
  204. decoration_style = 0;
  205. if (!rev->abbrev_commit_given)
  206. rev->abbrev_commit = 0;
  207. }
  208. if (decoration_style) {
  209. const struct string_list *config_exclude =
  210. repo_config_get_value_multi(the_repository,
  211. "log.excludeDecoration");
  212. if (config_exclude) {
  213. struct string_list_item *item;
  214. for_each_string_list_item(item, config_exclude)
  215. string_list_append(&decorate_refs_exclude_config,
  216. item->string);
  217. }
  218. rev->show_decorations = 1;
  219. load_ref_decorations(&decoration_filter, decoration_style);
  220. }
  221. if (rev->line_level_traverse)
  222. line_log_init(rev, line_cb.prefix, &line_cb.args);
  223. setup_pager();
  224. }
  225. static void cmd_log_init(int argc, const char **argv, const char *prefix,
  226. struct rev_info *rev, struct setup_revision_opt *opt)
  227. {
  228. cmd_log_init_defaults(rev);
  229. cmd_log_init_finish(argc, argv, prefix, rev, opt);
  230. }
  231. /*
  232. * This gives a rough estimate for how many commits we
  233. * will print out in the list.
  234. */
  235. static int estimate_commit_count(struct commit_list *list)
  236. {
  237. int n = 0;
  238. while (list) {
  239. struct commit *commit = list->item;
  240. unsigned int flags = commit->object.flags;
  241. list = list->next;
  242. if (!(flags & (TREESAME | UNINTERESTING)))
  243. n++;
  244. }
  245. return n;
  246. }
  247. static void show_early_header(struct rev_info *rev, const char *stage, int nr)
  248. {
  249. if (rev->shown_one) {
  250. rev->shown_one = 0;
  251. if (rev->commit_format != CMIT_FMT_ONELINE)
  252. putchar(rev->diffopt.line_termination);
  253. }
  254. fprintf(rev->diffopt.file, _("Final output: %d %s\n"), nr, stage);
  255. }
  256. static struct itimerval early_output_timer;
  257. static void log_show_early(struct rev_info *revs, struct commit_list *list)
  258. {
  259. int i = revs->early_output, close_file = revs->diffopt.close_file;
  260. int show_header = 1;
  261. revs->diffopt.close_file = 0;
  262. sort_in_topological_order(&list, revs->sort_order);
  263. while (list && i) {
  264. struct commit *commit = list->item;
  265. switch (simplify_commit(revs, commit)) {
  266. case commit_show:
  267. if (show_header) {
  268. int n = estimate_commit_count(list);
  269. show_early_header(revs, "incomplete", n);
  270. show_header = 0;
  271. }
  272. log_tree_commit(revs, commit);
  273. i--;
  274. break;
  275. case commit_ignore:
  276. break;
  277. case commit_error:
  278. if (close_file)
  279. fclose(revs->diffopt.file);
  280. return;
  281. }
  282. list = list->next;
  283. }
  284. /* Did we already get enough commits for the early output? */
  285. if (!i) {
  286. if (close_file)
  287. fclose(revs->diffopt.file);
  288. return;
  289. }
  290. /*
  291. * ..if no, then repeat it twice a second until we
  292. * do.
  293. *
  294. * NOTE! We don't use "it_interval", because if the
  295. * reader isn't listening, we want our output to be
  296. * throttled by the writing, and not have the timer
  297. * trigger every second even if we're blocked on a
  298. * reader!
  299. */
  300. early_output_timer.it_value.tv_sec = 0;
  301. early_output_timer.it_value.tv_usec = 500000;
  302. setitimer(ITIMER_REAL, &early_output_timer, NULL);
  303. }
  304. static void early_output(int signal)
  305. {
  306. show_early_output = log_show_early;
  307. }
  308. static void setup_early_output(void)
  309. {
  310. struct sigaction sa;
  311. /*
  312. * Set up the signal handler, minimally intrusively:
  313. * we only set a single volatile integer word (not
  314. * using sigatomic_t - trying to avoid unnecessary
  315. * system dependencies and headers), and using
  316. * SA_RESTART.
  317. */
  318. memset(&sa, 0, sizeof(sa));
  319. sa.sa_handler = early_output;
  320. sigemptyset(&sa.sa_mask);
  321. sa.sa_flags = SA_RESTART;
  322. sigaction(SIGALRM, &sa, NULL);
  323. /*
  324. * If we can get the whole output in less than a
  325. * tenth of a second, don't even bother doing the
  326. * early-output thing..
  327. *
  328. * This is a one-time-only trigger.
  329. */
  330. early_output_timer.it_value.tv_sec = 0;
  331. early_output_timer.it_value.tv_usec = 100000;
  332. setitimer(ITIMER_REAL, &early_output_timer, NULL);
  333. }
  334. static void finish_early_output(struct rev_info *rev)
  335. {
  336. int n = estimate_commit_count(rev->commits);
  337. signal(SIGALRM, SIG_IGN);
  338. show_early_header(rev, "done", n);
  339. }
  340. static int cmd_log_walk(struct rev_info *rev)
  341. {
  342. struct commit *commit;
  343. int saved_nrl = 0;
  344. int saved_dcctc = 0, close_file = rev->diffopt.close_file;
  345. if (rev->early_output)
  346. setup_early_output();
  347. if (prepare_revision_walk(rev))
  348. die(_("revision walk setup failed"));
  349. if (rev->early_output)
  350. finish_early_output(rev);
  351. /*
  352. * For --check and --exit-code, the exit code is based on CHECK_FAILED
  353. * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
  354. * retain that state information if replacing rev->diffopt in this loop
  355. */
  356. rev->diffopt.close_file = 0;
  357. while ((commit = get_revision(rev)) != NULL) {
  358. if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
  359. /*
  360. * We decremented max_count in get_revision,
  361. * but we didn't actually show the commit.
  362. */
  363. rev->max_count++;
  364. if (!rev->reflog_info) {
  365. /*
  366. * We may show a given commit multiple times when
  367. * walking the reflogs.
  368. */
  369. free_commit_buffer(the_repository->parsed_objects,
  370. commit);
  371. free_commit_list(commit->parents);
  372. commit->parents = NULL;
  373. }
  374. if (saved_nrl < rev->diffopt.needed_rename_limit)
  375. saved_nrl = rev->diffopt.needed_rename_limit;
  376. if (rev->diffopt.degraded_cc_to_c)
  377. saved_dcctc = 1;
  378. }
  379. rev->diffopt.degraded_cc_to_c = saved_dcctc;
  380. rev->diffopt.needed_rename_limit = saved_nrl;
  381. if (close_file)
  382. fclose(rev->diffopt.file);
  383. if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
  384. rev->diffopt.flags.check_failed) {
  385. return 02;
  386. }
  387. return diff_result_code(&rev->diffopt, 0);
  388. }
  389. static int git_log_config(const char *var, const char *value, void *cb)
  390. {
  391. const char *slot_name;
  392. if (!strcmp(var, "format.pretty"))
  393. return git_config_string(&fmt_pretty, var, value);
  394. if (!strcmp(var, "format.subjectprefix"))
  395. return git_config_string(&fmt_patch_subject_prefix, var, value);
  396. if (!strcmp(var, "format.encodeemailheaders")) {
  397. default_encode_email_headers = git_config_bool(var, value);
  398. return 0;
  399. }
  400. if (!strcmp(var, "log.abbrevcommit")) {
  401. default_abbrev_commit = git_config_bool(var, value);
  402. return 0;
  403. }
  404. if (!strcmp(var, "log.date"))
  405. return git_config_string(&default_date_mode, var, value);
  406. if (!strcmp(var, "log.decorate")) {
  407. decoration_style = parse_decoration_style(value);
  408. if (decoration_style < 0)
  409. decoration_style = 0; /* maybe warn? */
  410. return 0;
  411. }
  412. if (!strcmp(var, "log.showroot")) {
  413. default_show_root = git_config_bool(var, value);
  414. return 0;
  415. }
  416. if (!strcmp(var, "log.follow")) {
  417. default_follow = git_config_bool(var, value);
  418. return 0;
  419. }
  420. if (skip_prefix(var, "color.decorate.", &slot_name))
  421. return parse_decorate_color_config(var, slot_name, value);
  422. if (!strcmp(var, "log.mailmap")) {
  423. use_mailmap_config = git_config_bool(var, value);
  424. return 0;
  425. }
  426. if (!strcmp(var, "log.showsignature")) {
  427. default_show_signature = git_config_bool(var, value);
  428. return 0;
  429. }
  430. if (grep_config(var, value, cb) < 0)
  431. return -1;
  432. if (git_gpg_config(var, value, cb) < 0)
  433. return -1;
  434. return git_diff_ui_config(var, value, cb);
  435. }
  436. int cmd_whatchanged(int argc, const char **argv, const char *prefix)
  437. {
  438. struct rev_info rev;
  439. struct setup_revision_opt opt;
  440. init_log_defaults();
  441. git_config(git_log_config, NULL);
  442. repo_init_revisions(the_repository, &rev, prefix);
  443. rev.diff = 1;
  444. rev.simplify_history = 0;
  445. memset(&opt, 0, sizeof(opt));
  446. opt.def = "HEAD";
  447. opt.revarg_opt = REVARG_COMMITTISH;
  448. cmd_log_init(argc, argv, prefix, &rev, &opt);
  449. if (!rev.diffopt.output_format)
  450. rev.diffopt.output_format = DIFF_FORMAT_RAW;
  451. return cmd_log_walk(&rev);
  452. }
  453. static void show_tagger(const char *buf, struct rev_info *rev)
  454. {
  455. struct strbuf out = STRBUF_INIT;
  456. struct pretty_print_context pp = {0};
  457. pp.fmt = rev->commit_format;
  458. pp.date_mode = rev->date_mode;
  459. pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
  460. fprintf(rev->diffopt.file, "%s", out.buf);
  461. strbuf_release(&out);
  462. }
  463. static int show_blob_object(const struct object_id *oid, struct rev_info *rev, const char *obj_name)
  464. {
  465. struct object_id oidc;
  466. struct object_context obj_context;
  467. char *buf;
  468. unsigned long size;
  469. fflush(rev->diffopt.file);
  470. if (!rev->diffopt.flags.textconv_set_via_cmdline ||
  471. !rev->diffopt.flags.allow_textconv)
  472. return stream_blob_to_fd(1, oid, NULL, 0);
  473. if (get_oid_with_context(the_repository, obj_name,
  474. GET_OID_RECORD_PATH,
  475. &oidc, &obj_context))
  476. die(_("not a valid object name %s"), obj_name);
  477. if (!obj_context.path ||
  478. !textconv_object(the_repository, obj_context.path,
  479. obj_context.mode, &oidc, 1, &buf, &size)) {
  480. free(obj_context.path);
  481. return stream_blob_to_fd(1, oid, NULL, 0);
  482. }
  483. if (!buf)
  484. die(_("git show %s: bad file"), obj_name);
  485. write_or_die(1, buf, size);
  486. free(obj_context.path);
  487. return 0;
  488. }
  489. static int show_tag_object(const struct object_id *oid, struct rev_info *rev)
  490. {
  491. unsigned long size;
  492. enum object_type type;
  493. char *buf = read_object_file(oid, &type, &size);
  494. int offset = 0;
  495. if (!buf)
  496. return error(_("could not read object %s"), oid_to_hex(oid));
  497. assert(type == OBJ_TAG);
  498. while (offset < size && buf[offset] != '\n') {
  499. int new_offset = offset + 1;
  500. const char *ident;
  501. while (new_offset < size && buf[new_offset++] != '\n')
  502. ; /* do nothing */
  503. if (skip_prefix(buf + offset, "tagger ", &ident))
  504. show_tagger(ident, rev);
  505. offset = new_offset;
  506. }
  507. if (offset < size)
  508. fwrite(buf + offset, size - offset, 1, rev->diffopt.file);
  509. free(buf);
  510. return 0;
  511. }
  512. static int show_tree_object(const struct object_id *oid,
  513. struct strbuf *base,
  514. const char *pathname, unsigned mode, int stage, void *context)
  515. {
  516. FILE *file = context;
  517. fprintf(file, "%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
  518. return 0;
  519. }
  520. static void show_setup_revisions_tweak(struct rev_info *rev,
  521. struct setup_revision_opt *opt)
  522. {
  523. if (rev->ignore_merges < 0) {
  524. /* There was no "-m" variant on the command line */
  525. rev->ignore_merges = 0;
  526. if (!rev->first_parent_only && !rev->combine_merges) {
  527. /* No "--first-parent", "-c", or "--cc" */
  528. rev->combine_merges = 1;
  529. rev->dense_combined_merges = 1;
  530. }
  531. }
  532. if (!rev->diffopt.output_format)
  533. rev->diffopt.output_format = DIFF_FORMAT_PATCH;
  534. }
  535. int cmd_show(int argc, const char **argv, const char *prefix)
  536. {
  537. struct rev_info rev;
  538. struct object_array_entry *objects;
  539. struct setup_revision_opt opt;
  540. struct pathspec match_all;
  541. int i, count, ret = 0;
  542. init_log_defaults();
  543. git_config(git_log_config, NULL);
  544. memset(&match_all, 0, sizeof(match_all));
  545. repo_init_revisions(the_repository, &rev, prefix);
  546. rev.diff = 1;
  547. rev.always_show_header = 1;
  548. rev.no_walk = REVISION_WALK_NO_WALK_SORTED;
  549. rev.diffopt.stat_width = -1; /* Scale to real terminal size */
  550. memset(&opt, 0, sizeof(opt));
  551. opt.def = "HEAD";
  552. opt.tweak = show_setup_revisions_tweak;
  553. cmd_log_init(argc, argv, prefix, &rev, &opt);
  554. if (!rev.no_walk)
  555. return cmd_log_walk(&rev);
  556. count = rev.pending.nr;
  557. objects = rev.pending.objects;
  558. for (i = 0; i < count && !ret; i++) {
  559. struct object *o = objects[i].item;
  560. const char *name = objects[i].name;
  561. switch (o->type) {
  562. case OBJ_BLOB:
  563. ret = show_blob_object(&o->oid, &rev, name);
  564. break;
  565. case OBJ_TAG: {
  566. struct tag *t = (struct tag *)o;
  567. struct object_id *oid = get_tagged_oid(t);
  568. if (rev.shown_one)
  569. putchar('\n');
  570. fprintf(rev.diffopt.file, "%stag %s%s\n",
  571. diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
  572. t->tag,
  573. diff_get_color_opt(&rev.diffopt, DIFF_RESET));
  574. ret = show_tag_object(&o->oid, &rev);
  575. rev.shown_one = 1;
  576. if (ret)
  577. break;
  578. o = parse_object(the_repository, oid);
  579. if (!o)
  580. ret = error(_("could not read object %s"),
  581. oid_to_hex(oid));
  582. objects[i].item = o;
  583. i--;
  584. break;
  585. }
  586. case OBJ_TREE:
  587. if (rev.shown_one)
  588. putchar('\n');
  589. fprintf(rev.diffopt.file, "%stree %s%s\n\n",
  590. diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
  591. name,
  592. diff_get_color_opt(&rev.diffopt, DIFF_RESET));
  593. read_tree_recursive(the_repository, (struct tree *)o, "",
  594. 0, 0, &match_all, show_tree_object,
  595. rev.diffopt.file);
  596. rev.shown_one = 1;
  597. break;
  598. case OBJ_COMMIT:
  599. rev.pending.nr = rev.pending.alloc = 0;
  600. rev.pending.objects = NULL;
  601. add_object_array(o, name, &rev.pending);
  602. ret = cmd_log_walk(&rev);
  603. break;
  604. default:
  605. ret = error(_("unknown type: %d"), o->type);
  606. }
  607. }
  608. free(objects);
  609. return ret;
  610. }
  611. /*
  612. * This is equivalent to "git log -g --abbrev-commit --pretty=oneline"
  613. */
  614. int cmd_log_reflog(int argc, const char **argv, const char *prefix)
  615. {
  616. struct rev_info rev;
  617. struct setup_revision_opt opt;
  618. init_log_defaults();
  619. git_config(git_log_config, NULL);
  620. repo_init_revisions(the_repository, &rev, prefix);
  621. init_reflog_walk(&rev.reflog_info);
  622. rev.verbose_header = 1;
  623. memset(&opt, 0, sizeof(opt));
  624. opt.def = "HEAD";
  625. cmd_log_init_defaults(&rev);
  626. rev.abbrev_commit = 1;
  627. rev.commit_format = CMIT_FMT_ONELINE;
  628. rev.use_terminator = 1;
  629. rev.always_show_header = 1;
  630. cmd_log_init_finish(argc, argv, prefix, &rev, &opt);
  631. return cmd_log_walk(&rev);
  632. }
  633. static void log_setup_revisions_tweak(struct rev_info *rev,
  634. struct setup_revision_opt *opt)
  635. {
  636. if (rev->diffopt.flags.default_follow_renames &&
  637. rev->prune_data.nr == 1)
  638. rev->diffopt.flags.follow_renames = 1;
  639. /* Turn --cc/-c into -p --cc/-c when -p was not given */
  640. if (!rev->diffopt.output_format && rev->combine_merges)
  641. rev->diffopt.output_format = DIFF_FORMAT_PATCH;
  642. if (rev->first_parent_only && rev->ignore_merges < 0)
  643. rev->ignore_merges = 0;
  644. }
  645. int cmd_log(int argc, const char **argv, const char *prefix)
  646. {
  647. struct rev_info rev;
  648. struct setup_revision_opt opt;
  649. init_log_defaults();
  650. git_config(git_log_config, NULL);
  651. repo_init_revisions(the_repository, &rev, prefix);
  652. rev.always_show_header = 1;
  653. memset(&opt, 0, sizeof(opt));
  654. opt.def = "HEAD";
  655. opt.revarg_opt = REVARG_COMMITTISH;
  656. opt.tweak = log_setup_revisions_tweak;
  657. cmd_log_init(argc, argv, prefix, &rev, &opt);
  658. return cmd_log_walk(&rev);
  659. }
  660. /* format-patch */
  661. static const char *fmt_patch_suffix = ".patch";
  662. static int numbered = 0;
  663. static int auto_number = 1;
  664. static char *default_attach = NULL;
  665. static struct string_list extra_hdr = STRING_LIST_INIT_NODUP;
  666. static struct string_list extra_to = STRING_LIST_INIT_NODUP;
  667. static struct string_list extra_cc = STRING_LIST_INIT_NODUP;
  668. static void add_header(const char *value)
  669. {
  670. struct string_list_item *item;
  671. int len = strlen(value);
  672. while (len && value[len - 1] == '\n')
  673. len--;
  674. if (!strncasecmp(value, "to: ", 4)) {
  675. item = string_list_append(&extra_to, value + 4);
  676. len -= 4;
  677. } else if (!strncasecmp(value, "cc: ", 4)) {
  678. item = string_list_append(&extra_cc, value + 4);
  679. len -= 4;
  680. } else {
  681. item = string_list_append(&extra_hdr, value);
  682. }
  683. item->string[len] = '\0';
  684. }
  685. enum cover_setting {
  686. COVER_UNSET,
  687. COVER_OFF,
  688. COVER_ON,
  689. COVER_AUTO
  690. };
  691. enum thread_level {
  692. THREAD_UNSET,
  693. THREAD_SHALLOW,
  694. THREAD_DEEP
  695. };
  696. enum cover_from_description {
  697. COVER_FROM_NONE,
  698. COVER_FROM_MESSAGE,
  699. COVER_FROM_SUBJECT,
  700. COVER_FROM_AUTO
  701. };
  702. enum auto_base_setting {
  703. AUTO_BASE_NEVER,
  704. AUTO_BASE_ALWAYS,
  705. AUTO_BASE_WHEN_ABLE
  706. };
  707. static enum thread_level thread;
  708. static int do_signoff;
  709. static enum auto_base_setting auto_base;
  710. static char *from;
  711. static const char *signature = git_version_string;
  712. static const char *signature_file;
  713. static enum cover_setting config_cover_letter;
  714. static const char *config_output_directory;
  715. static enum cover_from_description cover_from_description_mode = COVER_FROM_MESSAGE;
  716. static int show_notes;
  717. static struct display_notes_opt notes_opt;
  718. static enum cover_from_description parse_cover_from_description(const char *arg)
  719. {
  720. if (!arg || !strcmp(arg, "default"))
  721. return COVER_FROM_MESSAGE;
  722. else if (!strcmp(arg, "none"))
  723. return COVER_FROM_NONE;
  724. else if (!strcmp(arg, "message"))
  725. return COVER_FROM_MESSAGE;
  726. else if (!strcmp(arg, "subject"))
  727. return COVER_FROM_SUBJECT;
  728. else if (!strcmp(arg, "auto"))
  729. return COVER_FROM_AUTO;
  730. else
  731. die(_("%s: invalid cover from description mode"), arg);
  732. }
  733. static int git_format_config(const char *var, const char *value, void *cb)
  734. {
  735. if (!strcmp(var, "format.headers")) {
  736. if (!value)
  737. die(_("format.headers without value"));
  738. add_header(value);
  739. return 0;
  740. }
  741. if (!strcmp(var, "format.suffix"))
  742. return git_config_string(&fmt_patch_suffix, var, value);
  743. if (!strcmp(var, "format.to")) {
  744. if (!value)
  745. return config_error_nonbool(var);
  746. string_list_append(&extra_to, value);
  747. return 0;
  748. }
  749. if (!strcmp(var, "format.cc")) {
  750. if (!value)
  751. return config_error_nonbool(var);
  752. string_list_append(&extra_cc, value);
  753. return 0;
  754. }
  755. if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") ||
  756. !strcmp(var, "color.ui") || !strcmp(var, "diff.submodule")) {
  757. return 0;
  758. }
  759. if (!strcmp(var, "format.numbered")) {
  760. if (value && !strcasecmp(value, "auto")) {
  761. auto_number = 1;
  762. return 0;
  763. }
  764. numbered = git_config_bool(var, value);
  765. auto_number = auto_number && numbered;
  766. return 0;
  767. }
  768. if (!strcmp(var, "format.attach")) {
  769. if (value && *value)
  770. default_attach = xstrdup(value);
  771. else
  772. default_attach = xstrdup(git_version_string);
  773. return 0;
  774. }
  775. if (!strcmp(var, "format.thread")) {
  776. if (value && !strcasecmp(value, "deep")) {
  777. thread = THREAD_DEEP;
  778. return 0;
  779. }
  780. if (value && !strcasecmp(value, "shallow")) {
  781. thread = THREAD_SHALLOW;
  782. return 0;
  783. }
  784. thread = git_config_bool(var, value) ? THREAD_SHALLOW : THREAD_UNSET;
  785. return 0;
  786. }
  787. if (!strcmp(var, "format.signoff")) {
  788. do_signoff = git_config_bool(var, value);
  789. return 0;
  790. }
  791. if (!strcmp(var, "format.signature"))
  792. return git_config_string(&signature, var, value);
  793. if (!strcmp(var, "format.signaturefile"))
  794. return git_config_pathname(&signature_file, var, value);
  795. if (!strcmp(var, "format.coverletter")) {
  796. if (value && !strcasecmp(value, "auto")) {
  797. config_cover_letter = COVER_AUTO;
  798. return 0;
  799. }
  800. config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF;
  801. return 0;
  802. }
  803. if (!strcmp(var, "format.outputdirectory"))
  804. return git_config_string(&config_output_directory, var, value);
  805. if (!strcmp(var, "format.useautobase")) {
  806. if (value && !strcasecmp(value, "whenAble")) {
  807. auto_base = AUTO_BASE_WHEN_ABLE;
  808. return 0;
  809. }
  810. auto_base = git_config_bool(var, value) ? AUTO_BASE_ALWAYS : AUTO_BASE_NEVER;
  811. return 0;
  812. }
  813. if (!strcmp(var, "format.from")) {
  814. int b = git_parse_maybe_bool(value);
  815. free(from);
  816. if (b < 0)
  817. from = xstrdup(value);
  818. else if (b)
  819. from = xstrdup(git_committer_info(IDENT_NO_DATE));
  820. else
  821. from = NULL;
  822. return 0;
  823. }
  824. if (!strcmp(var, "format.notes")) {
  825. int b = git_parse_maybe_bool(value);
  826. if (b < 0)
  827. enable_ref_display_notes(&notes_opt, &show_notes, value);
  828. else if (b)
  829. enable_default_display_notes(&notes_opt, &show_notes);
  830. else
  831. disable_display_notes(&notes_opt, &show_notes);
  832. return 0;
  833. }
  834. if (!strcmp(var, "format.coverfromdescription")) {
  835. cover_from_description_mode = parse_cover_from_description(value);
  836. return 0;
  837. }
  838. return git_log_config(var, value, cb);
  839. }
  840. static const char *output_directory = NULL;
  841. static int outdir_offset;
  842. static int open_next_file(struct commit *commit, const char *subject,
  843. struct rev_info *rev, int quiet)
  844. {
  845. struct strbuf filename = STRBUF_INIT;
  846. int suffix_len = strlen(rev->patch_suffix) + 1;
  847. if (output_directory) {
  848. strbuf_addstr(&filename, output_directory);
  849. if (filename.len >=
  850. PATH_MAX - FORMAT_PATCH_NAME_MAX - suffix_len) {
  851. strbuf_release(&filename);
  852. return error(_("name of output directory is too long"));
  853. }
  854. strbuf_complete(&filename, '/');
  855. }
  856. if (rev->numbered_files)
  857. strbuf_addf(&filename, "%d", rev->nr);
  858. else if (commit)
  859. fmt_output_commit(&filename, commit, rev);
  860. else
  861. fmt_output_subject(&filename, subject, rev);
  862. if (!quiet)
  863. printf("%s\n", filename.buf + outdir_offset);
  864. if ((rev->diffopt.file = fopen(filename.buf, "w")) == NULL) {
  865. error_errno(_("cannot open patch file %s"), filename.buf);
  866. strbuf_release(&filename);
  867. return -1;
  868. }
  869. strbuf_release(&filename);
  870. return 0;
  871. }
  872. static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
  873. {
  874. struct rev_info check_rev;
  875. struct commit *commit, *c1, *c2;
  876. struct object *o1, *o2;
  877. unsigned flags1, flags2;
  878. if (rev->pending.nr != 2)
  879. die(_("need exactly one range"));
  880. o1 = rev->pending.objects[0].item;
  881. o2 = rev->pending.objects[1].item;
  882. flags1 = o1->flags;
  883. flags2 = o2->flags;
  884. c1 = lookup_commit_reference(the_repository, &o1->oid);
  885. c2 = lookup_commit_reference(the_repository, &o2->oid);
  886. if ((flags1 & UNINTERESTING) == (flags2 & UNINTERESTING))
  887. die(_("not a range"));
  888. init_patch_ids(the_repository, ids);
  889. /* given a range a..b get all patch ids for b..a */
  890. repo_init_revisions(the_repository, &check_rev, rev->prefix);
  891. check_rev.max_parents = 1;
  892. o1->flags ^= UNINTERESTING;
  893. o2->flags ^= UNINTERESTING;
  894. add_pending_object(&check_rev, o1, "o1");
  895. add_pending_object(&check_rev, o2, "o2");
  896. if (prepare_revision_walk(&check_rev))
  897. die(_("revision walk setup failed"));
  898. while ((commit = get_revision(&check_rev)) != NULL) {
  899. add_commit_patch_id(commit, ids);
  900. }
  901. /* reset for next revision walk */
  902. clear_commit_marks(c1, SEEN | UNINTERESTING | SHOWN | ADDED);
  903. clear_commit_marks(c2, SEEN | UNINTERESTING | SHOWN | ADDED);
  904. o1->flags = flags1;
  905. o2->flags = flags2;
  906. }
  907. static void gen_message_id(struct rev_info *info, char *base)
  908. {
  909. struct strbuf buf = STRBUF_INIT;
  910. strbuf_addf(&buf, "%s.%"PRItime".git.%s", base,
  911. (timestamp_t) time(NULL),
  912. git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT));
  913. info->message_id = strbuf_detach(&buf, NULL);
  914. }
  915. static void print_signature(FILE *file)
  916. {
  917. if (!signature || !*signature)
  918. return;
  919. fprintf(file, "-- \n%s", signature);
  920. if (signature[strlen(signature)-1] != '\n')
  921. putc('\n', file);
  922. putc('\n', file);
  923. }
  924. static char *find_branch_name(struct rev_info *rev)
  925. {
  926. int i, positive = -1;
  927. struct object_id branch_oid;
  928. const struct object_id *tip_oid;
  929. const char *ref, *v;
  930. char *full_ref, *branch = NULL;
  931. for (i = 0; i < rev->cmdline.nr; i++) {
  932. if (rev->cmdline.rev[i].flags & UNINTERESTING)
  933. continue;
  934. if (positive < 0)
  935. positive = i;
  936. else
  937. return NULL;
  938. }
  939. if (positive < 0)
  940. return NULL;
  941. ref = rev->cmdline.rev[positive].name;
  942. tip_oid = &rev->cmdline.rev[positive].item->oid;
  943. if (dwim_ref(ref, strlen(ref), &branch_oid, &full_ref, 0) &&
  944. skip_prefix(full_ref, "refs/heads/", &v) &&
  945. oideq(tip_oid, &branch_oid))
  946. branch = xstrdup(v);
  947. free(full_ref);
  948. return branch;
  949. }
  950. static void show_diffstat(struct rev_info *rev,
  951. struct commit *origin, struct commit *head)
  952. {
  953. struct diff_options opts;
  954. memcpy(&opts, &rev->diffopt, sizeof(opts));
  955. opts.output_format = DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
  956. diff_setup_done(&opts);
  957. diff_tree_oid(get_commit_tree_oid(origin),
  958. get_commit_tree_oid(head),
  959. "", &opts);
  960. diffcore_std(&opts);
  961. diff_flush(&opts);
  962. fprintf(rev->diffopt.file, "\n");
  963. }
  964. static void prepare_cover_text(struct pretty_print_context *pp,
  965. const char *branch_name,
  966. struct strbuf *sb,
  967. const char *encoding,
  968. int need_8bit_cte)
  969. {
  970. const char *subject = "*** SUBJECT HERE ***";
  971. const char *body = "*** BLURB HERE ***";
  972. struct strbuf description_sb = STRBUF_INIT;
  973. struct strbuf subject_sb = STRBUF_INIT;
  974. if (cover_from_description_mode == COVER_FROM_NONE)
  975. goto do_pp;
  976. if (branch_name && *branch_name)
  977. read_branch_desc(&description_sb, branch_name);
  978. if (!description_sb.len)
  979. goto do_pp;
  980. if (cover_from_description_mode == COVER_FROM_SUBJECT ||
  981. cover_from_description_mode == COVER_FROM_AUTO)
  982. body = format_subject(&subject_sb, description_sb.buf, " ");
  983. if (cover_from_description_mode == COVER_FROM_MESSAGE ||
  984. (cover_from_description_mode == COVER_FROM_AUTO &&
  985. subject_sb.len > COVER_FROM_AUTO_MAX_SUBJECT_LEN))
  986. body = description_sb.buf;
  987. else
  988. subject = subject_sb.buf;
  989. do_pp:
  990. pp_title_line(pp, &subject, sb, encoding, need_8bit_cte);
  991. pp_remainder(pp, &body, sb, 0);
  992. strbuf_release(&description_sb);
  993. strbuf_release(&subject_sb);
  994. }
  995. static int get_notes_refs(struct string_list_item *item, void *arg)
  996. {
  997. strvec_pushf(arg, "--notes=%s", item->string);
  998. return 0;
  999. }
  1000. static void get_notes_args(struct strvec *arg, struct rev_info *rev)
  1001. {
  1002. if (!rev->show_notes) {
  1003. strvec_push(arg, "--no-notes");
  1004. } else if (rev->notes_opt.use_default_notes > 0 ||
  1005. (rev->notes_opt.use_default_notes == -1 &&
  1006. !rev->notes_opt.extra_notes_refs.nr)) {
  1007. strvec_push(arg, "--notes");
  1008. } else {
  1009. for_each_string_list(&rev->notes_opt.extra_notes_refs, get_notes_refs, arg);
  1010. }
  1011. }
  1012. static void make_cover_letter(struct rev_info *rev, int use_stdout,
  1013. struct commit *origin,
  1014. int nr, struct commit **list,
  1015. const char *branch_name,
  1016. int quiet)
  1017. {
  1018. const char *committer;
  1019. struct shortlog log;
  1020. struct strbuf sb = STRBUF_INIT;
  1021. int i;
  1022. const char *encoding = "UTF-8";
  1023. int need_8bit_cte = 0;
  1024. struct pretty_print_context pp = {0};
  1025. struct commit *head = list[0];
  1026. if (!cmit_fmt_is_mail(rev->commit_format))
  1027. die(_("cover letter needs email format"));
  1028. committer = git_committer_info(0);
  1029. if (!use_stdout &&
  1030. open_next_file(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
  1031. die(_("failed to create cover-letter file"));
  1032. log_write_email_headers(rev, head, &pp.after_subject, &need_8bit_cte, 0);
  1033. for (i = 0; !need_8bit_cte && i < nr; i++) {
  1034. const char *buf = get_commit_buffer(list[i], NULL);
  1035. if (has_non_ascii(buf))
  1036. need_8bit_cte = 1;
  1037. unuse_commit_buffer(list[i], buf);
  1038. }
  1039. if (!branch_name)
  1040. branch_name = find_branch_name(rev);
  1041. pp.fmt = CMIT_FMT_EMAIL;
  1042. pp.date_mode.type = DATE_RFC2822;
  1043. pp.rev = rev;
  1044. pp.print_email_subject = 1;
  1045. pp_user_info(&pp, NULL, &sb, committer, encoding);
  1046. prepare_cover_text(&pp, branch_name, &sb, encoding, need_8bit_cte);
  1047. fprintf(rev->diffopt.file, "%s\n", sb.buf);
  1048. strbuf_release(&sb);
  1049. shortlog_init(&log);
  1050. log.wrap_lines = 1;
  1051. log.wrap = MAIL_DEFAULT_WRAP;
  1052. log.in1 = 2;
  1053. log.in2 = 4;
  1054. log.file = rev->diffopt.file;
  1055. log.groups = SHORTLOG_GROUP_AUTHOR;
  1056. for (i = 0; i < nr; i++)
  1057. shortlog_add_commit(&log, list[i]);
  1058. shortlog_output(&log);
  1059. /* We can only do diffstat with a unique reference point */
  1060. if (origin)
  1061. show_diffstat(rev, origin, head);
  1062. if (rev->idiff_oid1) {
  1063. fprintf_ln(rev->diffopt.file, "%s", rev->idiff_title);
  1064. show_interdiff(rev->idiff_oid1, rev->idiff_oid2, 0,
  1065. &rev->diffopt);
  1066. }
  1067. if (rev->rdiff1) {
  1068. /*
  1069. * Pass minimum required diff-options to range-diff; others
  1070. * can be added later if deemed desirable.
  1071. */
  1072. struct diff_options opts;
  1073. struct strvec other_arg = STRVEC_INIT;
  1074. diff_setup(&opts);
  1075. opts.file = rev->diffopt.file;
  1076. opts.use_color = rev->diffopt.use_color;
  1077. diff_setup_done(&opts);
  1078. fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
  1079. get_notes_args(&other_arg, rev);
  1080. show_range_diff(rev->rdiff1, rev->rdiff2,
  1081. rev->creation_factor, 1, &opts, &other_arg);
  1082. strvec_clear(&other_arg);
  1083. }
  1084. }
  1085. static const char *clean_message_id(const char *msg_id)
  1086. {
  1087. char ch;
  1088. const char *a, *z, *m;
  1089. m = msg_id;
  1090. while ((ch = *m) && (isspace(ch) || (ch == '<')))
  1091. m++;
  1092. a = m;
  1093. z = NULL;
  1094. while ((ch = *m)) {
  1095. if (!isspace(ch) && (ch != '>'))
  1096. z = m;
  1097. m++;
  1098. }
  1099. if (!z)
  1100. die(_("insane in-reply-to: %s"), msg_id);
  1101. if (++z == m)
  1102. return a;
  1103. return xmemdupz(a, z - a);
  1104. }
  1105. static const char *set_outdir(const char *prefix, const char *output_directory)
  1106. {
  1107. if (output_directory && is_absolute_path(output_directory))
  1108. return output_directory;
  1109. if (!prefix || !*prefix) {
  1110. if (output_directory)
  1111. return output_directory;
  1112. /* The user did not explicitly ask for "./" */
  1113. outdir_offset = 2;
  1114. return "./";
  1115. }
  1116. outdir_offset = strlen(prefix);
  1117. if (!output_directory)
  1118. return prefix;
  1119. return prefix_filename(prefix, output_directory);
  1120. }
  1121. static const char * const builtin_format_patch_usage[] = {
  1122. N_("git format-patch [<options>] [<since> | <revision-range>]"),
  1123. NULL
  1124. };
  1125. static int keep_subject = 0;
  1126. static int keep_callback(const struct option *opt, const char *arg, int unset)
  1127. {
  1128. BUG_ON_OPT_NEG(unset);
  1129. BUG_ON_OPT_ARG(arg);
  1130. ((struct rev_info *)opt->value)->total = -1;
  1131. keep_subject = 1;
  1132. return 0;
  1133. }
  1134. static int subject_prefix = 0;
  1135. static int subject_prefix_callback(const struct option *opt, const char *arg,
  1136. int unset)
  1137. {
  1138. BUG_ON_OPT_NEG(unset);
  1139. subject_prefix = 1;
  1140. ((struct rev_info *)opt->value)->subject_prefix = arg;
  1141. return 0;
  1142. }
  1143. static int rfc_callback(const struct option *opt, const char *arg, int unset)
  1144. {
  1145. BUG_ON_OPT_NEG(unset);
  1146. BUG_ON_OPT_ARG(arg);
  1147. return subject_prefix_callback(opt, "RFC PATCH", unset);
  1148. }
  1149. static int numbered_cmdline_opt = 0;
  1150. static int numbered_callback(const struct option *opt, const char *arg,
  1151. int unset)
  1152. {
  1153. BUG_ON_OPT_ARG(arg);
  1154. *(int *)opt->value = numbered_cmdline_opt = unset ? 0 : 1;
  1155. if (unset)
  1156. auto_number = 0;
  1157. return 0;
  1158. }
  1159. static int no_numbered_callback(const struct option *opt, const char *arg,
  1160. int unset)
  1161. {
  1162. BUG_ON_OPT_NEG(unset);
  1163. return numbered_callback(opt, arg, 1);
  1164. }
  1165. static int output_directory_callback(const struct option *opt, const char *arg,
  1166. int unset)
  1167. {
  1168. const char **dir = (const char **)opt->value;
  1169. BUG_ON_OPT_NEG(unset);
  1170. if (*dir)
  1171. die(_("two output directories?"));
  1172. *dir = arg;
  1173. return 0;
  1174. }
  1175. static int thread_callback(const struct option *opt, const char *arg, int unset)
  1176. {
  1177. enum thread_level *thread = (enum thread_level *)opt->value;
  1178. if (unset)
  1179. *thread = THREAD_UNSET;
  1180. else if (!arg || !strcmp(arg, "shallow"))
  1181. *thread = THREAD_SHALLOW;
  1182. else if (!strcmp(arg, "deep"))
  1183. *thread = THREAD_DEEP;
  1184. /*
  1185. * Please update _git_formatpatch() in git-completion.bash
  1186. * when you add new options.
  1187. */
  1188. else
  1189. return 1;
  1190. return 0;
  1191. }
  1192. static int attach_callback(const struct option *opt, const char *arg, int unset)
  1193. {
  1194. struct rev_info *rev = (struct rev_info *)opt->value;
  1195. if (unset)
  1196. rev->mime_boundary = NULL;
  1197. else if (arg)
  1198. rev->mime_boundary = arg;
  1199. else
  1200. rev->mime_boundary = git_version_string;
  1201. rev->no_inline = unset ? 0 : 1;
  1202. return 0;
  1203. }
  1204. static int inline_callback(const struct option *opt, const char *arg, int unset)
  1205. {
  1206. struct rev_info *rev = (struct rev_info *)opt->value;
  1207. if (unset)
  1208. rev->mime_boundary = NULL;
  1209. else if (arg)
  1210. rev->mime_boundary = arg;
  1211. else
  1212. rev->mime_boundary = git_version_string;
  1213. rev->no_inline = 0;
  1214. return 0;
  1215. }
  1216. static int header_callback(const struct option *opt, const char *arg, int unset)
  1217. {
  1218. if (unset) {
  1219. string_list_clear(&extra_hdr, 0);
  1220. string_list_clear(&extra_to, 0);
  1221. string_list_clear(&extra_cc, 0);
  1222. } else {
  1223. add_header(arg);
  1224. }
  1225. return 0;
  1226. }
  1227. static int to_callback(const struct option *opt, const char *arg, int unset)
  1228. {
  1229. if (unset)
  1230. string_list_clear(&extra_to, 0);
  1231. else
  1232. string_list_append(&extra_to, arg);
  1233. return 0;
  1234. }
  1235. static int cc_callback(const struct option *opt, const char *arg, int unset)
  1236. {
  1237. if (unset)
  1238. string_list_clear(&extra_cc, 0);
  1239. else
  1240. string_list_append(&extra_cc, arg);
  1241. return 0;
  1242. }
  1243. static int from_callback(const struct option *opt, const char *arg, int unset)
  1244. {
  1245. char **from = opt->value;
  1246. free(*from);
  1247. if (unset)
  1248. *from = NULL;
  1249. else if (arg)
  1250. *from = xstrdup(arg);
  1251. else
  1252. *from = xstrdup(git_committer_info(IDENT_NO_DATE));
  1253. return 0;
  1254. }
  1255. static int base_callback(const struct option *opt, const char *arg, int unset)
  1256. {
  1257. const char **base_commit = opt->value;
  1258. if (unset) {
  1259. auto_base = AUTO_BASE_NEVER;
  1260. *base_commit = NULL;
  1261. } else if (!strcmp(arg, "auto")) {
  1262. auto_base = AUTO_BASE_ALWAYS;
  1263. *base_commit = NULL;
  1264. } else {
  1265. auto_base = AUTO_BASE_NEVER;
  1266. *base_commit = arg;
  1267. }
  1268. return 0;
  1269. }
  1270. struct base_tree_info {
  1271. struct object_id base_commit;
  1272. int nr_patch_id, alloc_patch_id;
  1273. struct object_id *patch_id;
  1274. };
  1275. static struct commit *get_base_commit(const char *base_commit,
  1276. struct commit **list,
  1277. int total)
  1278. {
  1279. struct commit *base = NULL;
  1280. struct commit **rev;
  1281. int i = 0, rev_nr = 0, auto_select, die_on_failure;
  1282. switch (auto_base) {
  1283. case AUTO_BASE_NEVER:
  1284. if (base_commit) {
  1285. auto_select = 0;
  1286. die_on_failure = 1;
  1287. } else {
  1288. /* no base information is requested */
  1289. return NULL;
  1290. }
  1291. break;
  1292. case AUTO_BASE_ALWAYS:
  1293. case AUTO_BASE_WHEN_ABLE:
  1294. if (base_commit) {
  1295. BUG("requested automatic base selection but a commit was provided");
  1296. } else {
  1297. auto_select = 1;
  1298. die_on_failure = auto_base == AUTO_BASE_ALWAYS;
  1299. }
  1300. break;
  1301. default:
  1302. BUG("unexpected automatic base selection method");
  1303. }
  1304. if (!auto_select) {
  1305. base = lookup_commit_reference_by_name(base_commit);
  1306. if (!base)
  1307. die(_("unknown commit %s"), base_commit);
  1308. } else {
  1309. struct branch *curr_branch = branch_get(NULL);
  1310. const char *upstream = branch_get_upstream(curr_branch, NULL);
  1311. if (upstream) {
  1312. struct commit_list *base_list;
  1313. struct commit *commit;
  1314. struct object_id oid;
  1315. if (get_oid(upstream, &oid)) {
  1316. if (die_on_failure)
  1317. die(_("failed to resolve '%s' as a valid ref"), upstream);
  1318. else
  1319. return NULL;
  1320. }
  1321. commit = lookup_commit_or_die(&oid, "upstream base");
  1322. base_list = get_merge_bases_many(commit, total, list);
  1323. /* There should be one and only one merge base. */
  1324. if (!base_list || base_list->next) {
  1325. if (die_on_failure) {
  1326. die(_("could not find exact merge base"));
  1327. } else {
  1328. free_commit_list(base_list);
  1329. return NULL;
  1330. }
  1331. }
  1332. base = base_list->item;
  1333. free_commit_list(base_list);
  1334. } else {
  1335. if (die_on_failure)
  1336. die(_("failed to get upstream, if you want to record base commit automatically,\n"
  1337. "please use git branch --set-upstream-to to track a remote branch.\n"
  1338. "Or you could specify base commit by --base=<base-commit-id> manually"));
  1339. else
  1340. return NULL;
  1341. }
  1342. }
  1343. ALLOC_ARRAY(rev, total);
  1344. for (i = 0; i < total; i++)
  1345. rev[i] = list[i];
  1346. rev_nr = total;
  1347. /*
  1348. * Get merge base through pair-wise computations
  1349. * and store it in rev[0].
  1350. */
  1351. while (rev_nr > 1) {
  1352. for (i = 0; i < rev_nr / 2; i++) {
  1353. struct commit_list *merge_base;
  1354. merge_base = get_merge_bases(rev[2 * i], rev[2 * i + 1]);
  1355. if (!merge_base || merge_base->next) {
  1356. if (die_on_failure) {
  1357. die(_("failed to find exact merge base"));
  1358. } else {
  1359. free(rev);
  1360. return NULL;
  1361. }
  1362. }
  1363. rev[i] = merge_base->item;
  1364. }
  1365. if (rev_nr % 2)
  1366. rev[i] = rev[2 * i];
  1367. rev_nr = DIV_ROUND_UP(rev_nr, 2);
  1368. }
  1369. if (!in_merge_bases(base, rev[0])) {
  1370. if (die_on_failure) {
  1371. die(_("base commit should be the ancestor of revision list"));
  1372. } else {
  1373. free(rev);
  1374. return NULL;
  1375. }
  1376. }
  1377. for (i = 0; i < total; i++) {
  1378. if (base == list[i]) {
  1379. if (die_on_failure) {
  1380. die(_("base commit shouldn't be in revision list"));
  1381. } else {
  1382. free(rev);
  1383. return NULL;
  1384. }
  1385. }
  1386. }
  1387. free(rev);
  1388. return base;
  1389. }
  1390. define_commit_slab(commit_base, int);
  1391. static void prepare_bases(struct base_tree_info *bases,
  1392. struct commit *base,
  1393. struct commit **list,
  1394. int total)
  1395. {
  1396. struct commit *commit;
  1397. struct rev_info revs;
  1398. struct diff_options diffopt;
  1399. struct commit_base commit_base;
  1400. int i;
  1401. if (!base)
  1402. return;
  1403. init_commit_base(&commit_base);
  1404. repo_diff_setup(the_repository, &diffopt);
  1405. diffopt.flags.recursive = 1;
  1406. diff_setup_done(&diffopt);
  1407. oidcpy(&bases->base_commit, &base->object.oid);
  1408. repo_init_revisions(the_repository, &revs, NULL);
  1409. revs.max_parents = 1;
  1410. revs.topo_order = 1;
  1411. for (i = 0; i < total; i++) {
  1412. list[i]->object.flags &= ~UNINTERESTING;
  1413. add_pending_object(&revs, &list[i]->object, "rev_list");
  1414. *commit_base_at(&commit_base, list[i]) = 1;
  1415. }
  1416. base->object.flags |= UNINTERESTING;
  1417. add_pending_object(&revs, &base->object, "base");
  1418. if (prepare_revision_walk(&revs))
  1419. die(_("revision walk setup failed"));
  1420. /*
  1421. * Traverse the commits list, get prerequisite patch ids
  1422. * and stuff them in bases structure.
  1423. */
  1424. while ((commit = get_revision(&revs)) != NULL) {
  1425. struct object_id oid;
  1426. struct object_id *patch_id;
  1427. if (*commit_base_at(&commit_base, commit))
  1428. continue;
  1429. if (commit_patch_id(commit, &diffopt, &oid, 0, 1))
  1430. die(_("cannot get patch id"));
  1431. ALLOC_GROW(bases->patch_id, bases->nr_patch_id + 1, bases->alloc_patch_id);
  1432. patch_id = bases->patch_id + bases->nr_patch_id;
  1433. oidcpy(patch_id, &oid);
  1434. bases->nr_patch_id++;
  1435. }
  1436. clear_commit_base(&commit_base);
  1437. }
  1438. static void print_bases(struct base_tree_info *bases, FILE *file)
  1439. {
  1440. int i;
  1441. /* Only do this once, either for the cover or for the first one */
  1442. if (is_null_oid(&bases->base_commit))
  1443. return;
  1444. /* Show the base commit */
  1445. fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit));
  1446. /* Show the prerequisite patches */
  1447. for (i = bases->nr_patch_id - 1; i >= 0; i--)
  1448. fprintf(file, "prerequisite-patch-id: %s\n", oid_to_hex(&bases->patch_id[i]));
  1449. free(bases->patch_id);
  1450. bases->nr_patch_id = 0;
  1451. bases->alloc_patch_id = 0;
  1452. oidclr(&bases->base_commit);
  1453. }
  1454. static const char *diff_title(struct strbuf *sb, int reroll_count,
  1455. const char *generic, const char *rerolled)
  1456. {
  1457. if (reroll_count <= 0)
  1458. strbuf_addstr(sb, generic);
  1459. else /* RFC may be v0, so allow -v1 to diff against v0 */
  1460. strbuf_addf(sb, rerolled, reroll_count - 1);
  1461. return sb->buf;
  1462. }
  1463. static void infer_range_diff_ranges(struct strbuf *r1,
  1464. struct strbuf *r2,
  1465. const char *prev,
  1466. struct commit *origin,
  1467. struct commit *head)
  1468. {
  1469. const char *head_oid = oid_to_hex(&head->object.oid);
  1470. int prev_is_range = !!strstr(prev, "..");
  1471. if (prev_is_range)
  1472. strbuf_addstr(r1, prev);
  1473. else
  1474. strbuf_addf(r1, "%s..%s", head_oid, prev);
  1475. if (origin)
  1476. strbuf_addf(r2, "%s..%s", oid_to_hex(&origin->object.oid), head_oid);
  1477. else if (prev_is_range)
  1478. die(_("failed to infer range-diff origin of current series"));
  1479. else {
  1480. warning(_("using '%s' as range-diff origin of current series"), prev);
  1481. strbuf_addf(r2, "%s..%s", prev, head_oid);
  1482. }
  1483. }
  1484. int cmd_format_patch(int argc, const char **argv, const char *prefix)
  1485. {
  1486. struct commit *commit;
  1487. struct commit **list = NULL;
  1488. struct rev_info rev;
  1489. struct setup_revision_opt s_r_opt;
  1490. int nr = 0, total, i;
  1491. int use_stdout = 0;
  1492. int start_number = -1;
  1493. int just_numbers = 0;
  1494. int ignore_if_in_upstream = 0;
  1495. int cover_letter = -1;
  1496. int boundary_count = 0;
  1497. int no_binary_diff = 0;
  1498. int zero_commit = 0;
  1499. struct commit *origin = NULL;
  1500. const char *in_reply_to = NULL;
  1501. struct patch_ids ids;
  1502. struct strbuf buf = STRBUF_INIT;
  1503. int use_patch_format = 0;
  1504. int quiet = 0;
  1505. int reroll_count = -1;
  1506. char *cover_from_description_arg = NULL;
  1507. char *branch_name = NULL;
  1508. char *base_commit = NULL;
  1509. struct base_tree_info bases;
  1510. struct commit *base;
  1511. int show_progress = 0;
  1512. struct progress *progress = NULL;
  1513. struct oid_array idiff_prev = OID_ARRAY_INIT;
  1514. struct strbuf idiff_title = STRBUF_INIT;
  1515. const char *rdiff_prev = NULL;
  1516. struct strbuf rdiff1 = STRBUF_INIT;
  1517. struct strbuf rdiff2 = STRBUF_INIT;
  1518. struct strbuf rdiff_title = STRBUF_INIT;
  1519. int creation_factor = -1;
  1520. const struct option builtin_format_patch_options[] = {
  1521. OPT_CALLBACK_F('n', "numbered", &numbered, NULL,
  1522. N_("use [PATCH n/m] even with a single patch"),
  1523. PARSE_OPT_NOARG, numbered_callback),
  1524. OPT_CALLBACK_F('N', "no-numbered", &numbered, NULL,
  1525. N_("use [PATCH] even with multiple patches"),
  1526. PARSE_OPT_NOARG | PARSE_OPT_NONEG, no_numbered_callback),
  1527. OPT_BOOL('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
  1528. OPT_BOOL(0, "stdout", &use_stdout,
  1529. N_("print patches to standard out")),
  1530. OPT_BOOL(0, "cover-letter", &cover_letter,
  1531. N_("generate a cover letter")),
  1532. OPT_BOOL(0, "numbered-files", &just_numbers,
  1533. N_("use simple number sequence for output file names")),
  1534. OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
  1535. N_("use <sfx> instead of '.patch'")),
  1536. OPT_INTEGER(0, "start-number", &start_number,
  1537. N_("start numbering patches at <n> instead of 1")),
  1538. OPT_INTEGER('v', "reroll-count", &reroll_count,
  1539. N_("mark the series as Nth re-roll")),
  1540. OPT_CALLBACK_F(0, "rfc", &rev, NULL,
  1541. N_("Use [RFC PATCH] instead of [PATCH]"),
  1542. PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback),
  1543. OPT_STRING(0, "cover-from-description", &cover_from_description_arg,
  1544. N_("cover-from-description-mode"),
  1545. N_("generate parts of a cover letter based on a branch's description")),
  1546. OPT_CALLBACK_F(0, "subject-prefix", &rev, N_("prefix"),
  1547. N_("Use [<prefix>] instead of [PATCH]"),
  1548. PARSE_OPT_NONEG, subject_prefix_callback),
  1549. OPT_CALLBACK_F('o', "output-directory", &output_directory,
  1550. N_("dir"), N_("store resulting files in <dir>"),
  1551. PARSE_OPT_NONEG, output_directory_callback),
  1552. OPT_CALLBACK_F('k', "keep-subject", &rev, NULL,
  1553. N_("don't strip/add [PATCH]"),
  1554. PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback),
  1555. OPT_BOOL(0, "no-binary", &no_binary_diff,
  1556. N_("don't output binary diffs")),
  1557. OPT_BOOL(0, "zero-commit", &zero_commit,
  1558. N_("output all-zero hash in From header")),
  1559. OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
  1560. N_("don't include a patch matching a commit upstream")),
  1561. OPT_SET_INT_F('p', "no-stat", &use_patch_format,
  1562. N_("show patch format instead of default (patch + stat)"),
  1563. 1, PARSE_OPT_NONEG),
  1564. OPT_GROUP(N_("Messaging")),
  1565. OPT_CALLBACK(0, "add-header", NULL, N_("header"),
  1566. N_("add email header"), header_callback),
  1567. OPT_CALLBACK(0, "to", NULL, N_("email"), N_("add To: header"), to_callback),
  1568. OPT_CALLBACK(0, "cc", NULL, N_("email"), N_("add Cc: header"), cc_callback),
  1569. OPT_CALLBACK_F(0, "from", &from, N_("ident"),
  1570. N_("set From address to <ident> (or committer ident if absent)"),
  1571. PARSE_OPT_OPTARG, from_callback),
  1572. OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"),
  1573. N_("make first mail a reply to <message-id>")),
  1574. OPT_CALLBACK_F(0, "attach", &rev, N_("boundary"),
  1575. N_("attach the patch"), PARSE_OPT_OPTARG,
  1576. attach_callback),
  1577. OPT_CALLBACK_F(0, "inline", &rev, N_("boundary"),
  1578. N_("inline the patch"),
  1579. PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
  1580. inline_callback),
  1581. OPT_CALLBACK_F(0, "thread", &thread, N_("style"),
  1582. N_("enable message threading, styles: shallow, deep"),
  1583. PARSE_OPT_OPTARG, thread_callback),
  1584. OPT_STRING(0, "signature", &signature, N_("signature"),
  1585. N_("add a signature")),
  1586. OPT_CALLBACK_F(0, "base", &base_commit, N_("base-commit"),
  1587. N_("add prerequisite tree info to the patch series"),
  1588. 0, base_callback),
  1589. OPT_FILENAME(0, "signature-file", &signature_file,
  1590. N_("add a signature from a file")),
  1591. OPT__QUIET(&quiet, N_("don't print the patch filenames")),
  1592. OPT_BOOL(0, "progress", &show_progress,
  1593. N_("show progress while generating patches")),
  1594. OPT_CALLBACK(0, "interdiff", &idiff_prev, N_("rev"),
  1595. N_("show changes against <rev> in cover letter or single patch"),
  1596. parse_opt_object_name),
  1597. OPT_STRING(0, "range-diff", &rdiff_prev, N_("refspec"),
  1598. N_("show changes against <refspec> in cover letter or single patch")),
  1599. OPT_INTEGER(0, "creation-factor", &creation_factor,
  1600. N_("percentage by which creation is weighted")),
  1601. OPT_END()
  1602. };
  1603. extra_hdr.strdup_strings = 1;
  1604. extra_to.strdup_strings = 1;
  1605. extra_cc.strdup_strings = 1;
  1606. init_log_defaults();
  1607. init_display_notes(&notes_opt);
  1608. git_config(git_format_config, NULL);
  1609. repo_init_revisions(the_repository, &rev, prefix);
  1610. rev.show_notes = show_notes;
  1611. memcpy(&rev.notes_opt, &notes_opt, sizeof(notes_opt));
  1612. rev.commit_format = CMIT_FMT_EMAIL;
  1613. rev.encode_email_headers = default_encode_email_headers;
  1614. rev.expand_tabs_in_log_default = 0;
  1615. rev.verbose_header = 1;
  1616. rev.diff = 1;
  1617. rev.max_parents = 1;
  1618. rev.diffopt.flags.recursive = 1;
  1619. rev.subject_prefix = fmt_patch_subject_prefix;
  1620. memset(&s_r_opt, 0, sizeof(s_r_opt));
  1621. s_r_opt.def = "HEAD";
  1622. s_r_opt.revarg_opt = REVARG_COMMITTISH;
  1623. if (default_attach) {
  1624. rev.mime_boundary = default_attach;
  1625. rev.no_inline = 1;
  1626. }
  1627. /*
  1628. * Parse the arguments before setup_revisions(), or something
  1629. * like "git format-patch -o a123 HEAD^.." may fail; a123 is
  1630. * possibly a valid SHA1.
  1631. */
  1632. argc = parse_options(argc, argv, prefix, builtin_format_patch_options,
  1633. builtin_format_patch_usage,
  1634. PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
  1635. PARSE_OPT_KEEP_DASHDASH);
  1636. if (cover_from_description_arg)
  1637. cover_from_description_mode = parse_cover_from_description(cover_from_description_arg);
  1638. if (0 < reroll_count) {
  1639. struct strbuf sprefix = STRBUF_INIT;
  1640. strbuf_addf(&sprefix, "%s v%d",
  1641. rev.subject_prefix, reroll_count);
  1642. rev.reroll_count = reroll_count;
  1643. rev.subject_prefix = strbuf_detach(&sprefix, NULL);
  1644. }
  1645. for (i = 0; i < extra_hdr.nr; i++) {
  1646. strbuf_addstr(&buf, extra_hdr.items[i].string);
  1647. strbuf_addch(&buf, '\n');
  1648. }
  1649. if (extra_to.nr)
  1650. strbuf_addstr(&buf, "To: ");
  1651. for (i = 0; i < extra_to.nr; i++) {
  1652. if (i)
  1653. strbuf_addstr(&buf, " ");
  1654. strbuf_addstr(&buf, extra_to.items[i].string);
  1655. if (i + 1 < extra_to.nr)
  1656. strbuf_addch(&buf, ',');
  1657. strbuf_addch(&buf, '\n');
  1658. }
  1659. if (extra_cc.nr)
  1660. strbuf_addstr(&buf, "Cc: ");
  1661. for (i = 0; i < extra_cc.nr; i++) {
  1662. if (i)
  1663. strbuf_addstr(&buf, " ");
  1664. strbuf_addstr(&buf, extra_cc.items[i].string);
  1665. if (i + 1 < extra_cc.nr)
  1666. strbuf_addch(&buf, ',');
  1667. strbuf_addch(&buf, '\n');
  1668. }
  1669. rev.extra_headers = strbuf_detach(&buf, NULL);
  1670. if (from) {
  1671. if (split_ident_line(&rev.from_ident, from, strlen(from)))
  1672. die(_("invalid ident line: %s"), from);
  1673. }
  1674. if (start_number < 0)
  1675. start_number = 1;
  1676. /*
  1677. * If numbered is set solely due to format.numbered in config,
  1678. * and it would conflict with --keep-subject (-k) from the
  1679. * command line, reset "numbered".
  1680. */
  1681. if (numbered && keep_subject && !numbered_cmdline_opt)
  1682. numbered = 0;
  1683. if (numbered && keep_subject)
  1684. die(_("-n and -k are mutually exclusive"));
  1685. if (keep_subject && subject_prefix)
  1686. die(_("--subject-prefix/--rfc and -k are mutually exclusive"));
  1687. rev.preserve_subject = keep_subject;
  1688. argc = setup_revisions(argc, argv, &rev, &s_r_opt);
  1689. if (argc > 1)
  1690. die(_("unrecognized argument: %s"), argv[1]);
  1691. if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
  1692. die(_("--name-only does not make sense"));
  1693. if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS)
  1694. die(_("--name-status does not make sense"));
  1695. if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF)
  1696. die(_("--check does not make sense"));
  1697. if (!use_patch_format &&
  1698. (!rev.diffopt.output_format ||
  1699. rev.diffopt.output_format == DIFF_FORMAT_PATCH))
  1700. rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY;
  1701. if (!rev.diffopt.stat_width)
  1702. rev.diffopt.stat_width = MAIL_DEFAULT_WRAP;
  1703. /* Always generate a patch */
  1704. rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
  1705. rev.zero_commit = zero_commit;
  1706. if (!rev.diffopt.flags.text && !no_binary_diff)
  1707. rev.diffopt.flags.binary = 1;
  1708. if (rev.show_notes)
  1709. load_display_notes(&rev.notes_opt);
  1710. if (!output_directory && !use_stdout)
  1711. output_directory = config_output_directory;
  1712. if (!use_stdout)
  1713. output_directory = set_outdir(prefix, output_directory);
  1714. else
  1715. setup_pager();
  1716. if (output_directory) {
  1717. int saved;
  1718. if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
  1719. rev.diffopt.use_color = GIT_COLOR_NEVER;
  1720. if (use_stdout)
  1721. die(_("standard output, or directory, which one?"));
  1722. /*
  1723. * We consider <outdir> as 'outside of gitdir', therefore avoid
  1724. * applying adjust_shared_perm in s-c-l-d.
  1725. */
  1726. saved = get_shared_repository();
  1727. set_shared_repository(0);
  1728. switch (safe_create_leading_directories_const(output_directory)) {
  1729. case SCLD_OK:
  1730. case SCLD_EXISTS:
  1731. break;
  1732. default:
  1733. die(_("could not create leading directories "
  1734. "of '%s'"), output_directory);
  1735. }
  1736. set_shared_repository(saved);
  1737. if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
  1738. die_errno(_("could not create directory '%s'"),
  1739. output_directory);
  1740. }
  1741. if (rev.pending.nr == 1) {
  1742. int check_head = 0;
  1743. if (rev.max_count < 0 && !rev.show_root_diff) {
  1744. /*
  1745. * This is traditional behaviour of "git format-patch
  1746. * origin" that prepares what the origin side still
  1747. * does not have.
  1748. */
  1749. rev.pending.objects[0].item->flags |= UNINTERESTING;
  1750. add_head_to_pending(&rev);
  1751. check_head = 1;
  1752. }
  1753. /*
  1754. * Otherwise, it is "format-patch -22 HEAD", and/or
  1755. * "format-patch --root HEAD". The user wants
  1756. * get_revision() to do the usual traversal.
  1757. */
  1758. if (!strcmp(rev.pending.objects[0].name, "HEAD"))
  1759. check_head = 1;
  1760. if (check_head) {
  1761. const char *ref, *v;
  1762. ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
  1763. NULL, NULL);
  1764. if (ref && skip_prefix(ref, "refs/heads/", &v))
  1765. branch_name = xstrdup(v);
  1766. else
  1767. branch_name = xstrdup(""); /* no branch */
  1768. }
  1769. }
  1770. /*
  1771. * We cannot move this anywhere earlier because we do want to
  1772. * know if --root was given explicitly from the command line.
  1773. */
  1774. rev.show_root_diff = 1;
  1775. if (ignore_if_in_upstream) {
  1776. /* Don't say anything if head and upstream are the same. */
  1777. if (rev.pending.nr == 2) {
  1778. struct object_array_entry *o = rev.pending.objects;
  1779. if (oideq(&o[0].item->oid, &o[1].item->oid))
  1780. goto done;
  1781. }
  1782. get_patch_ids(&rev, &ids);
  1783. }
  1784. if (prepare_revision_walk(&rev))
  1785. die(_("revision walk setup failed"));
  1786. rev.boundary = 1;
  1787. while ((commit = get_revision(&rev)) != NULL) {
  1788. if (commit->object.flags & BOUNDARY) {
  1789. boundary_count++;
  1790. origin = (boundary_count == 1) ? commit : NULL;
  1791. continue;
  1792. }
  1793. if (ignore_if_in_upstream && has_commit_patch_id(commit, &ids))
  1794. continue;
  1795. nr++;
  1796. REALLOC_ARRAY(list, nr);
  1797. list[nr - 1] = commit;
  1798. }
  1799. if (nr == 0)
  1800. /* nothing to do */
  1801. goto done;
  1802. total = nr;
  1803. if (cover_letter == -1) {
  1804. if (config_cover_letter == COVER_AUTO)
  1805. cover_letter = (total > 1);
  1806. else
  1807. cover_letter = (config_cover_letter == COVER_ON);
  1808. }
  1809. if (!keep_subject && auto_number && (total > 1 || cover_letter))
  1810. numbered = 1;
  1811. if (numbered)
  1812. rev.total = total + start_number - 1;
  1813. if (idiff_prev.nr) {
  1814. if (!cover_letter && total != 1)
  1815. die(_("--interdiff requires --cover-letter or single patch"));
  1816. rev.idiff_oid1 = &idiff_prev.oid[idiff_prev.nr - 1];
  1817. rev.idiff_oid2 = get_commit_tree_oid(list[0]);
  1818. rev.idiff_title = diff_title(&idiff_title, reroll_count,
  1819. _("Interdiff:"),
  1820. _("Interdiff against v%d:"));
  1821. }
  1822. if (creation_factor < 0)
  1823. creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
  1824. else if (!rdiff_prev)
  1825. die(_("--creation-factor requires --range-diff"));
  1826. if (rdiff_prev) {
  1827. if (!cover_letter && total != 1)
  1828. die(_("--range-diff requires --cover-letter or single patch"));
  1829. infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
  1830. origin, list[0]);
  1831. rev.rdiff1 = rdiff1.buf;
  1832. rev.rdiff2 = rdiff2.buf;
  1833. rev.creation_factor = creation_factor;
  1834. rev.rdiff_title = diff_title(&rdiff_title, reroll_count,
  1835. _("Range-diff:"),
  1836. _("Range-diff against v%d:"));
  1837. }
  1838. if (!signature) {
  1839. ; /* --no-signature inhibits all signatures */
  1840. } else if (signature && signature != git_version_string) {
  1841. ; /* non-default signature already set */
  1842. } else if (signature_file) {
  1843. struct strbuf buf = STRBUF_INIT;
  1844. if (strbuf_read_file(&buf, signature_file, 128) < 0)
  1845. die_errno(_("unable to read signature file '%s'"), signature_file);
  1846. signature = strbuf_detach(&buf, NULL);
  1847. }
  1848. memset(&bases, 0, sizeof(bases));
  1849. base = get_base_commit(base_commit, list, nr);
  1850. if (base) {
  1851. reset_revision_walk();
  1852. clear_object_flags(UNINTERESTING);
  1853. prepare_bases(&bases, base, list, nr);
  1854. }
  1855. if (in_reply_to || thread || cover_letter)
  1856. rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
  1857. if (in_reply_to) {
  1858. const char *msgid = clean_message_id(in_reply_to);
  1859. string_list_append(rev.ref_message_ids, msgid);
  1860. }
  1861. rev.numbered_files = just_numbers;
  1862. rev.patch_suffix = fmt_patch_suffix;
  1863. if (cover_letter) {
  1864. if (thread)
  1865. gen_message_id(&rev, "cover");
  1866. make_cover_letter(&rev, use_stdout,
  1867. origin, nr, list, branch_name, quiet);
  1868. print_bases(&bases, rev.diffopt.file);
  1869. print_signature(rev.diffopt.file);
  1870. total++;
  1871. start_number--;
  1872. /* interdiff/range-diff in cover-letter; omit from patches */
  1873. rev.idiff_oid1 = NULL;
  1874. rev.rdiff1 = NULL;
  1875. }
  1876. rev.add_signoff = do_signoff;
  1877. if (show_progress)
  1878. progress = start_delayed_progress(_("Generating patches"), total);
  1879. while (0 <= --nr) {
  1880. int shown;
  1881. display_progress(progress, total - nr);
  1882. commit = list[nr];
  1883. rev.nr = total - nr + (start_number - 1);
  1884. /* Make the second and subsequent mails replies to the first */
  1885. if (thread) {
  1886. /* Have we already had a message ID? */
  1887. if (rev.message_id) {
  1888. /*
  1889. * For deep threading: make every mail
  1890. * a reply to the previous one, no
  1891. * matter what other options are set.
  1892. *
  1893. * For shallow threading:
  1894. *
  1895. * Without --cover-letter and
  1896. * --in-reply-to, make every mail a
  1897. * reply to the one before.
  1898. *
  1899. * With --in-reply-to but no
  1900. * --cover-letter, make every mail a
  1901. * reply to the <reply-to>.
  1902. *
  1903. * With --cover-letter, make every
  1904. * mail but the cover letter a reply
  1905. * to the cover letter. The cover
  1906. * letter is a reply to the
  1907. * --in-reply-to, if specified.
  1908. */
  1909. if (thread == THREAD_SHALLOW
  1910. && rev.ref_message_ids->nr > 0
  1911. && (!cover_letter || rev.nr > 1))
  1912. free(rev.message_id);
  1913. else
  1914. string_list_append(rev.ref_message_ids,
  1915. rev.message_id);
  1916. }
  1917. gen_message_id(&rev, oid_to_hex(&commit->object.oid));
  1918. }
  1919. if (!use_stdout &&
  1920. open_next_file(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
  1921. die(_("failed to create output files"));
  1922. shown = log_tree_commit(&rev, commit);
  1923. free_commit_buffer(the_repository->parsed_objects,
  1924. commit);
  1925. /* We put one extra blank line between formatted
  1926. * patches and this flag is used by log-tree code
  1927. * to see if it needs to emit a LF before showing
  1928. * the log; when using one file per patch, we do
  1929. * not want the extra blank line.
  1930. */
  1931. if (!use_stdout)
  1932. rev.shown_one = 0;
  1933. if (shown) {
  1934. print_bases(&bases, rev.diffopt.file);
  1935. if (rev.mime_boundary)
  1936. fprintf(rev.diffopt.file, "\n--%s%s--\n\n\n",
  1937. mime_boundary_leader,
  1938. rev.mime_boundary);
  1939. else
  1940. print_signature(rev.diffopt.file);
  1941. }
  1942. if (!use_stdout)
  1943. fclose(rev.diffopt.file);
  1944. }
  1945. stop_progress(&progress);
  1946. free(list);
  1947. free(branch_name);
  1948. string_list_clear(&extra_to, 0);
  1949. string_list_clear(&extra_cc, 0);
  1950. string_list_clear(&extra_hdr, 0);
  1951. if (ignore_if_in_upstream)
  1952. free_patch_ids(&ids);
  1953. done:
  1954. oid_array_clear(&idiff_prev);
  1955. strbuf_release(&idiff_title);
  1956. strbuf_release(&rdiff1);
  1957. strbuf_release(&rdiff2);
  1958. strbuf_release(&rdiff_title);
  1959. return 0;
  1960. }
  1961. static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)
  1962. {
  1963. struct object_id oid;
  1964. if (get_oid(arg, &oid) == 0) {
  1965. struct commit *commit = lookup_commit_reference(the_repository,
  1966. &oid);
  1967. if (commit) {
  1968. commit->object.flags |= flags;
  1969. add_pending_object(revs, &commit->object, arg);
  1970. return 0;
  1971. }
  1972. }
  1973. return -1;
  1974. }
  1975. static const char * const cherry_usage[] = {
  1976. N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
  1977. NULL
  1978. };
  1979. static void print_commit(char sign, struct commit *commit, int verbose,
  1980. int abbrev, FILE *file)
  1981. {
  1982. if (!verbose) {
  1983. fprintf(file, "%c %s\n", sign,
  1984. find_unique_abbrev(&commit->object.oid, abbrev));
  1985. } else {
  1986. struct strbuf buf = STRBUF_INIT;
  1987. pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
  1988. fprintf(file, "%c %s %s\n", sign,
  1989. find_unique_abbrev(&commit->object.oid, abbrev),
  1990. buf.buf);
  1991. strbuf_release(&buf);
  1992. }
  1993. }
  1994. int cmd_cherry(int argc, const char **argv, const char *prefix)
  1995. {
  1996. struct rev_info revs;
  1997. struct patch_ids ids;
  1998. struct commit *commit;
  1999. struct commit_list *list = NULL;
  2000. struct branch *current_branch;
  2001. const char *upstream;
  2002. const char *head = "HEAD";
  2003. const char *limit = NULL;
  2004. int verbose = 0, abbrev = 0;
  2005. struct option options[] = {
  2006. OPT__ABBREV(&abbrev),
  2007. OPT__VERBOSE(&verbose, N_("be verbose")),
  2008. OPT_END()
  2009. };
  2010. argc = parse_options(argc, argv, prefix, options, cherry_usage, 0);
  2011. switch (argc) {
  2012. case 3:
  2013. limit = argv[2];
  2014. /* FALLTHROUGH */
  2015. case 2:
  2016. head = argv[1];
  2017. /* FALLTHROUGH */
  2018. case 1:
  2019. upstream = argv[0];
  2020. break;
  2021. default:
  2022. current_branch = branch_get(NULL);
  2023. upstream = branch_get_upstream(current_branch, NULL);
  2024. if (!upstream) {
  2025. fprintf(stderr, _("Could not find a tracked"
  2026. " remote branch, please"
  2027. " specify <upstream> manually.\n"));
  2028. usage_with_options(cherry_usage, options);
  2029. }
  2030. }
  2031. repo_init_revisions(the_repository, &revs, prefix);
  2032. revs.max_parents = 1;
  2033. if (add_pending_commit(head, &revs, 0))
  2034. die(_("unknown commit %s"), head);
  2035. if (add_pending_commit(upstream, &revs, UNINTERESTING))
  2036. die(_("unknown commit %s"), upstream);
  2037. /* Don't say anything if head and upstream are the same. */
  2038. if (revs.pending.nr == 2) {
  2039. struct object_array_entry *o = revs.pending.objects;
  2040. if (oideq(&o[0].item->oid, &o[1].item->oid))
  2041. return 0;
  2042. }
  2043. get_patch_ids(&revs, &ids);
  2044. if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
  2045. die(_("unknown commit %s"), limit);
  2046. /* reverse the list of commits */
  2047. if (prepare_revision_walk(&revs))
  2048. die(_("revision walk setup failed"));
  2049. while ((commit = get_revision(&revs)) != NULL) {
  2050. commit_list_insert(commit, &list);
  2051. }
  2052. while (list) {
  2053. char sign = '+';
  2054. commit = list->item;
  2055. if (has_commit_patch_id(commit, &ids))
  2056. sign = '-';
  2057. print_commit(sign, commit, verbose, abbrev, revs.diffopt.file);
  2058. list = list->next;
  2059. }
  2060. free_patch_ids(&ids);
  2061. return 0;
  2062. }