1#include"cache.h" 2#include"lockfile.h" 3#include"sequencer.h" 4#include"dir.h" 5#include"object.h" 6#include"commit.h" 7#include"tag.h" 8#include"run-command.h" 9#include"exec_cmd.h" 10#include"utf8.h" 11#include"cache-tree.h" 12#include"diff.h" 13#include"revision.h" 14#include"rerere.h" 15#include"merge-recursive.h" 16#include"refs.h" 17#include"argv-array.h" 18#include"quote.h" 19#include"trailer.h" 20#include"log-tree.h" 21#include"wt-status.h" 22 23#define GIT_REFLOG_ACTION"GIT_REFLOG_ACTION" 24 25const char sign_off_header[] ="Signed-off-by: "; 26static const char cherry_picked_prefix[] ="(cherry picked from commit "; 27 28GIT_PATH_FUNC(git_path_seq_dir,"sequencer") 29 30staticGIT_PATH_FUNC(git_path_todo_file,"sequencer/todo") 31staticGIT_PATH_FUNC(git_path_opts_file,"sequencer/opts") 32staticGIT_PATH_FUNC(git_path_head_file,"sequencer/head") 33staticGIT_PATH_FUNC(git_path_abort_safety_file,"sequencer/abort-safety") 34 35staticGIT_PATH_FUNC(rebase_path,"rebase-merge") 36/* 37 * The file containing rebase commands, comments, and empty lines. 38 * This file is created by "git rebase -i" then edited by the user. As 39 * the lines are processed, they are removed from the front of this 40 * file and written to the tail of 'done'. 41 */ 42staticGIT_PATH_FUNC(rebase_path_todo,"rebase-merge/git-rebase-todo") 43/* 44 * The rebase command lines that have already been processed. A line 45 * is moved here when it is first handled, before any associated user 46 * actions. 47 */ 48staticGIT_PATH_FUNC(rebase_path_done,"rebase-merge/done") 49/* 50 * The commit message that is planned to be used for any changes that 51 * need to be committed following a user interaction. 52 */ 53staticGIT_PATH_FUNC(rebase_path_message,"rebase-merge/message") 54/* 55 * The file into which is accumulated the suggested commit message for 56 * squash/fixup commands. When the first of a series of squash/fixups 57 * is seen, the file is created and the commit message from the 58 * previous commit and from the first squash/fixup commit are written 59 * to it. The commit message for each subsequent squash/fixup commit 60 * is appended to the file as it is processed. 61 * 62 * The first line of the file is of the form 63 * # This is a combination of $count commits. 64 * where $count is the number of commits whose messages have been 65 * written to the file so far (including the initial "pick" commit). 66 * Each time that a commit message is processed, this line is read and 67 * updated. It is deleted just before the combined commit is made. 68 */ 69staticGIT_PATH_FUNC(rebase_path_squash_msg,"rebase-merge/message-squash") 70/* 71 * If the current series of squash/fixups has not yet included a squash 72 * command, then this file exists and holds the commit message of the 73 * original "pick" commit. (If the series ends without a "squash" 74 * command, then this can be used as the commit message of the combined 75 * commit without opening the editor.) 76 */ 77staticGIT_PATH_FUNC(rebase_path_fixup_msg,"rebase-merge/message-fixup") 78/* 79 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and 80 * GIT_AUTHOR_DATE that will be used for the commit that is currently 81 * being rebased. 82 */ 83staticGIT_PATH_FUNC(rebase_path_author_script,"rebase-merge/author-script") 84/* 85 * When an "edit" rebase command is being processed, the SHA1 of the 86 * commit to be edited is recorded in this file. When "git rebase 87 * --continue" is executed, if there are any staged changes then they 88 * will be amended to the HEAD commit, but only provided the HEAD 89 * commit is still the commit to be edited. When any other rebase 90 * command is processed, this file is deleted. 91 */ 92staticGIT_PATH_FUNC(rebase_path_amend,"rebase-merge/amend") 93/* 94 * When we stop at a given patch via the "edit" command, this file contains 95 * the abbreviated commit name of the corresponding patch. 96 */ 97staticGIT_PATH_FUNC(rebase_path_stopped_sha,"rebase-merge/stopped-sha") 98/* 99 * The following files are written by git-rebase just after parsing the 100 * command-line (and are only consumed, not modified, by the sequencer). 101 */ 102staticGIT_PATH_FUNC(rebase_path_gpg_sign_opt,"rebase-merge/gpg_sign_opt") 103staticGIT_PATH_FUNC(rebase_path_orig_head,"rebase-merge/orig-head") 104staticGIT_PATH_FUNC(rebase_path_verbose,"rebase-merge/verbose") 105 106staticinlineintis_rebase_i(const struct replay_opts *opts) 107{ 108return opts->action == REPLAY_INTERACTIVE_REBASE; 109} 110 111static const char*get_dir(const struct replay_opts *opts) 112{ 113if(is_rebase_i(opts)) 114returnrebase_path(); 115returngit_path_seq_dir(); 116} 117 118static const char*get_todo_path(const struct replay_opts *opts) 119{ 120if(is_rebase_i(opts)) 121returnrebase_path_todo(); 122returngit_path_todo_file(); 123} 124 125/* 126 * Returns 0 for non-conforming footer 127 * Returns 1 for conforming footer 128 * Returns 2 when sob exists within conforming footer 129 * Returns 3 when sob exists within conforming footer as last entry 130 */ 131static inthas_conforming_footer(struct strbuf *sb,struct strbuf *sob, 132int ignore_footer) 133{ 134struct trailer_info info; 135int i; 136int found_sob =0, found_sob_last =0; 137 138trailer_info_get(&info, sb->buf); 139 140if(info.trailer_start == info.trailer_end) 141return0; 142 143for(i =0; i < info.trailer_nr; i++) 144if(sob && !strncmp(info.trailers[i], sob->buf, sob->len)) { 145 found_sob =1; 146if(i == info.trailer_nr -1) 147 found_sob_last =1; 148} 149 150trailer_info_release(&info); 151 152if(found_sob_last) 153return3; 154if(found_sob) 155return2; 156return1; 157} 158 159static const char*gpg_sign_opt_quoted(struct replay_opts *opts) 160{ 161static struct strbuf buf = STRBUF_INIT; 162 163strbuf_reset(&buf); 164if(opts->gpg_sign) 165sq_quotef(&buf,"-S%s", opts->gpg_sign); 166return buf.buf; 167} 168 169intsequencer_remove_state(struct replay_opts *opts) 170{ 171struct strbuf dir = STRBUF_INIT; 172int i; 173 174free(opts->gpg_sign); 175free(opts->strategy); 176for(i =0; i < opts->xopts_nr; i++) 177free(opts->xopts[i]); 178free(opts->xopts); 179 180strbuf_addf(&dir,"%s",get_dir(opts)); 181remove_dir_recursively(&dir,0); 182strbuf_release(&dir); 183 184return0; 185} 186 187static const char*action_name(const struct replay_opts *opts) 188{ 189switch(opts->action) { 190case REPLAY_REVERT: 191returnN_("revert"); 192case REPLAY_PICK: 193returnN_("cherry-pick"); 194case REPLAY_INTERACTIVE_REBASE: 195returnN_("rebase -i"); 196} 197die(_("Unknown action:%d"), opts->action); 198} 199 200struct commit_message { 201char*parent_label; 202char*label; 203char*subject; 204const char*message; 205}; 206 207static const char*short_commit_name(struct commit *commit) 208{ 209returnfind_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV); 210} 211 212static intget_message(struct commit *commit,struct commit_message *out) 213{ 214const char*abbrev, *subject; 215int subject_len; 216 217 out->message =logmsg_reencode(commit, NULL,get_commit_output_encoding()); 218 abbrev =short_commit_name(commit); 219 220 subject_len =find_commit_subject(out->message, &subject); 221 222 out->subject =xmemdupz(subject, subject_len); 223 out->label =xstrfmt("%s...%s", abbrev, out->subject); 224 out->parent_label =xstrfmt("parent of%s", out->label); 225 226return0; 227} 228 229static voidfree_message(struct commit *commit,struct commit_message *msg) 230{ 231free(msg->parent_label); 232free(msg->label); 233free(msg->subject); 234unuse_commit_buffer(commit, msg->message); 235} 236 237static voidprint_advice(int show_hint,struct replay_opts *opts) 238{ 239char*msg =getenv("GIT_CHERRY_PICK_HELP"); 240 241if(msg) { 242fprintf(stderr,"%s\n", msg); 243/* 244 * A conflict has occurred but the porcelain 245 * (typically rebase --interactive) wants to take care 246 * of the commit itself so remove CHERRY_PICK_HEAD 247 */ 248unlink(git_path_cherry_pick_head()); 249return; 250} 251 252if(show_hint) { 253if(opts->no_commit) 254advise(_("after resolving the conflicts, mark the corrected paths\n" 255"with 'git add <paths>' or 'git rm <paths>'")); 256else 257advise(_("after resolving the conflicts, mark the corrected paths\n" 258"with 'git add <paths>' or 'git rm <paths>'\n" 259"and commit the result with 'git commit'")); 260} 261} 262 263static intwrite_message(const void*buf,size_t len,const char*filename, 264int append_eol) 265{ 266static struct lock_file msg_file; 267 268int msg_fd =hold_lock_file_for_update(&msg_file, filename,0); 269if(msg_fd <0) 270returnerror_errno(_("could not lock '%s'"), filename); 271if(write_in_full(msg_fd, buf, len) <0) { 272rollback_lock_file(&msg_file); 273returnerror_errno(_("could not write to '%s'"), filename); 274} 275if(append_eol &&write(msg_fd,"\n",1) <0) { 276rollback_lock_file(&msg_file); 277returnerror_errno(_("could not write eol to '%s'"), filename); 278} 279if(commit_lock_file(&msg_file) <0) { 280rollback_lock_file(&msg_file); 281returnerror(_("failed to finalize '%s'."), filename); 282} 283 284return0; 285} 286 287/* 288 * Reads a file that was presumably written by a shell script, i.e. with an 289 * end-of-line marker that needs to be stripped. 290 * 291 * Note that only the last end-of-line marker is stripped, consistent with the 292 * behavior of "$(cat path)" in a shell script. 293 * 294 * Returns 1 if the file was read, 0 if it could not be read or does not exist. 295 */ 296static intread_oneliner(struct strbuf *buf, 297const char*path,int skip_if_empty) 298{ 299int orig_len = buf->len; 300 301if(!file_exists(path)) 302return0; 303 304if(strbuf_read_file(buf, path,0) <0) { 305warning_errno(_("could not read '%s'"), path); 306return0; 307} 308 309if(buf->len > orig_len && buf->buf[buf->len -1] =='\n') { 310if(--buf->len > orig_len && buf->buf[buf->len -1] =='\r') 311--buf->len; 312 buf->buf[buf->len] ='\0'; 313} 314 315if(skip_if_empty && buf->len == orig_len) 316return0; 317 318return1; 319} 320 321static struct tree *empty_tree(void) 322{ 323returnlookup_tree(EMPTY_TREE_SHA1_BIN); 324} 325 326static interror_dirty_index(struct replay_opts *opts) 327{ 328if(read_cache_unmerged()) 329returnerror_resolve_conflict(_(action_name(opts))); 330 331error(_("your local changes would be overwritten by%s."), 332_(action_name(opts))); 333 334if(advice_commit_before_merge) 335advise(_("commit your changes or stash them to proceed.")); 336return-1; 337} 338 339static voidupdate_abort_safety_file(void) 340{ 341struct object_id head; 342 343/* Do nothing on a single-pick */ 344if(!file_exists(git_path_seq_dir())) 345return; 346 347if(!get_oid("HEAD", &head)) 348write_file(git_path_abort_safety_file(),"%s",oid_to_hex(&head)); 349else 350write_file(git_path_abort_safety_file(),"%s",""); 351} 352 353static intfast_forward_to(const unsigned char*to,const unsigned char*from, 354int unborn,struct replay_opts *opts) 355{ 356struct ref_transaction *transaction; 357struct strbuf sb = STRBUF_INIT; 358struct strbuf err = STRBUF_INIT; 359 360read_cache(); 361if(checkout_fast_forward(from, to,1)) 362return-1;/* the callee should have complained already */ 363 364strbuf_addf(&sb,_("%s: fast-forward"),_(action_name(opts))); 365 366 transaction =ref_transaction_begin(&err); 367if(!transaction || 368ref_transaction_update(transaction,"HEAD", 369 to, unborn ? null_sha1 : from, 3700, sb.buf, &err) || 371ref_transaction_commit(transaction, &err)) { 372ref_transaction_free(transaction); 373error("%s", err.buf); 374strbuf_release(&sb); 375strbuf_release(&err); 376return-1; 377} 378 379strbuf_release(&sb); 380strbuf_release(&err); 381ref_transaction_free(transaction); 382update_abort_safety_file(); 383return0; 384} 385 386voidappend_conflicts_hint(struct strbuf *msgbuf) 387{ 388int i; 389 390strbuf_addch(msgbuf,'\n'); 391strbuf_commented_addf(msgbuf,"Conflicts:\n"); 392for(i =0; i < active_nr;) { 393const struct cache_entry *ce = active_cache[i++]; 394if(ce_stage(ce)) { 395strbuf_commented_addf(msgbuf,"\t%s\n", ce->name); 396while(i < active_nr && !strcmp(ce->name, 397 active_cache[i]->name)) 398 i++; 399} 400} 401} 402 403static intdo_recursive_merge(struct commit *base,struct commit *next, 404const char*base_label,const char*next_label, 405unsigned char*head,struct strbuf *msgbuf, 406struct replay_opts *opts) 407{ 408struct merge_options o; 409struct tree *result, *next_tree, *base_tree, *head_tree; 410int clean; 411char**xopt; 412static struct lock_file index_lock; 413 414hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR); 415 416read_cache(); 417 418init_merge_options(&o); 419 o.ancestor = base ? base_label :"(empty tree)"; 420 o.branch1 ="HEAD"; 421 o.branch2 = next ? next_label :"(empty tree)"; 422 423 head_tree =parse_tree_indirect(head); 424 next_tree = next ? next->tree :empty_tree(); 425 base_tree = base ? base->tree :empty_tree(); 426 427for(xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++) 428parse_merge_opt(&o, *xopt); 429 430 clean =merge_trees(&o, 431 head_tree, 432 next_tree, base_tree, &result); 433strbuf_release(&o.obuf); 434if(clean <0) 435return clean; 436 437if(active_cache_changed && 438write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) 439/* TRANSLATORS: %s will be "revert", "cherry-pick" or 440 * "rebase -i". 441 */ 442returnerror(_("%s: Unable to write new index file"), 443_(action_name(opts))); 444rollback_lock_file(&index_lock); 445 446if(opts->signoff) 447append_signoff(msgbuf,0,0); 448 449if(!clean) 450append_conflicts_hint(msgbuf); 451 452return!clean; 453} 454 455static intis_index_unchanged(void) 456{ 457unsigned char head_sha1[20]; 458struct commit *head_commit; 459 460if(!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL)) 461returnerror(_("could not resolve HEAD commit\n")); 462 463 head_commit =lookup_commit(head_sha1); 464 465/* 466 * If head_commit is NULL, check_commit, called from 467 * lookup_commit, would have indicated that head_commit is not 468 * a commit object already. parse_commit() will return failure 469 * without further complaints in such a case. Otherwise, if 470 * the commit is invalid, parse_commit() will complain. So 471 * there is nothing for us to say here. Just return failure. 472 */ 473if(parse_commit(head_commit)) 474return-1; 475 476if(!active_cache_tree) 477 active_cache_tree =cache_tree(); 478 479if(!cache_tree_fully_valid(active_cache_tree)) 480if(cache_tree_update(&the_index,0)) 481returnerror(_("unable to update cache tree\n")); 482 483return!hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash); 484} 485 486/* 487 * Read the author-script file into an environment block, ready for use in 488 * run_command(), that can be free()d afterwards. 489 */ 490static char**read_author_script(void) 491{ 492struct strbuf script = STRBUF_INIT; 493int i, count =0; 494char*p, *p2, **env; 495size_t env_size; 496 497if(strbuf_read_file(&script,rebase_path_author_script(),256) <=0) 498return NULL; 499 500for(p = script.buf; *p; p++) 501if(skip_prefix(p,"'\\\\''", (const char**)&p2)) 502strbuf_splice(&script, p - script.buf, p2 - p,"'",1); 503else if(*p =='\'') 504strbuf_splice(&script, p-- - script.buf,1,"",0); 505else if(*p =='\n') { 506*p ='\0'; 507 count++; 508} 509 510 env_size = (count +1) *sizeof(*env); 511strbuf_grow(&script, env_size); 512memmove(script.buf + env_size, script.buf, script.len); 513 p = script.buf + env_size; 514 env = (char**)strbuf_detach(&script, NULL); 515 516for(i =0; i < count; i++) { 517 env[i] = p; 518 p +=strlen(p) +1; 519} 520 env[count] = NULL; 521 522return env; 523} 524 525static const char staged_changes_advice[] = 526N_("you have staged changes in your working tree\n" 527"If these changes are meant to be squashed into the previous commit, run:\n" 528"\n" 529" git commit --amend%s\n" 530"\n" 531"If they are meant to go into a new commit, run:\n" 532"\n" 533" git commit%s\n" 534"\n" 535"In both cases, once you're done, continue with:\n" 536"\n" 537" git rebase --continue\n"); 538 539/* 540 * If we are cherry-pick, and if the merge did not result in 541 * hand-editing, we will hit this commit and inherit the original 542 * author date and name. 543 * 544 * If we are revert, or if our cherry-pick results in a hand merge, 545 * we had better say that the current user is responsible for that. 546 * 547 * An exception is when run_git_commit() is called during an 548 * interactive rebase: in that case, we will want to retain the 549 * author metadata. 550 */ 551static intrun_git_commit(const char*defmsg,struct replay_opts *opts, 552int allow_empty,int edit,int amend, 553int cleanup_commit_message) 554{ 555char**env = NULL; 556struct argv_array array; 557int rc; 558const char*value; 559 560if(is_rebase_i(opts)) { 561 env =read_author_script(); 562if(!env) { 563const char*gpg_opt =gpg_sign_opt_quoted(opts); 564 565returnerror(_(staged_changes_advice), 566 gpg_opt, gpg_opt); 567} 568} 569 570argv_array_init(&array); 571argv_array_push(&array,"commit"); 572argv_array_push(&array,"-n"); 573 574if(amend) 575argv_array_push(&array,"--amend"); 576if(opts->gpg_sign) 577argv_array_pushf(&array,"-S%s", opts->gpg_sign); 578if(opts->signoff) 579argv_array_push(&array,"-s"); 580if(defmsg) 581argv_array_pushl(&array,"-F", defmsg, NULL); 582if(cleanup_commit_message) 583argv_array_push(&array,"--cleanup=strip"); 584if(edit) 585argv_array_push(&array,"-e"); 586else if(!cleanup_commit_message && 587!opts->signoff && !opts->record_origin && 588git_config_get_value("commit.cleanup", &value)) 589argv_array_push(&array,"--cleanup=verbatim"); 590 591if(allow_empty) 592argv_array_push(&array,"--allow-empty"); 593 594if(opts->allow_empty_message) 595argv_array_push(&array,"--allow-empty-message"); 596 597 rc =run_command_v_opt_cd_env(array.argv, RUN_GIT_CMD, NULL, 598(const char*const*)env); 599argv_array_clear(&array); 600free(env); 601 602return rc; 603} 604 605static intis_original_commit_empty(struct commit *commit) 606{ 607const unsigned char*ptree_sha1; 608 609if(parse_commit(commit)) 610returnerror(_("could not parse commit%s\n"), 611oid_to_hex(&commit->object.oid)); 612if(commit->parents) { 613struct commit *parent = commit->parents->item; 614if(parse_commit(parent)) 615returnerror(_("could not parse parent commit%s\n"), 616oid_to_hex(&parent->object.oid)); 617 ptree_sha1 = parent->tree->object.oid.hash; 618}else{ 619 ptree_sha1 = EMPTY_TREE_SHA1_BIN;/* commit is root */ 620} 621 622return!hashcmp(ptree_sha1, commit->tree->object.oid.hash); 623} 624 625/* 626 * Do we run "git commit" with "--allow-empty"? 627 */ 628static intallow_empty(struct replay_opts *opts,struct commit *commit) 629{ 630int index_unchanged, empty_commit; 631 632/* 633 * Three cases: 634 * 635 * (1) we do not allow empty at all and error out. 636 * 637 * (2) we allow ones that were initially empty, but 638 * forbid the ones that become empty; 639 * 640 * (3) we allow both. 641 */ 642if(!opts->allow_empty) 643return0;/* let "git commit" barf as necessary */ 644 645 index_unchanged =is_index_unchanged(); 646if(index_unchanged <0) 647return index_unchanged; 648if(!index_unchanged) 649return0;/* we do not have to say --allow-empty */ 650 651if(opts->keep_redundant_commits) 652return1; 653 654 empty_commit =is_original_commit_empty(commit); 655if(empty_commit <0) 656return empty_commit; 657if(!empty_commit) 658return0; 659else 660return1; 661} 662 663/* 664 * Note that ordering matters in this enum. Not only must it match the mapping 665 * below, it is also divided into several sections that matter. When adding 666 * new commands, make sure you add it in the right section. 667 */ 668enum todo_command { 669/* commands that handle commits */ 670 TODO_PICK =0, 671 TODO_REVERT, 672 TODO_EDIT, 673 TODO_FIXUP, 674 TODO_SQUASH, 675/* commands that do something else than handling a single commit */ 676 TODO_EXEC, 677/* commands that do nothing but are counted for reporting progress */ 678 TODO_NOOP 679}; 680 681static const char*todo_command_strings[] = { 682"pick", 683"revert", 684"edit", 685"fixup", 686"squash", 687"exec", 688"noop" 689}; 690 691static const char*command_to_string(const enum todo_command command) 692{ 693if((size_t)command <ARRAY_SIZE(todo_command_strings)) 694return todo_command_strings[command]; 695die("Unknown command:%d", command); 696} 697 698static intis_noop(const enum todo_command command) 699{ 700return TODO_NOOP <= (size_t)command; 701} 702 703static intis_fixup(enum todo_command command) 704{ 705return command == TODO_FIXUP || command == TODO_SQUASH; 706} 707 708static intupdate_squash_messages(enum todo_command command, 709struct commit *commit,struct replay_opts *opts) 710{ 711struct strbuf buf = STRBUF_INIT; 712int count, res; 713const char*message, *body; 714 715if(file_exists(rebase_path_squash_msg())) { 716struct strbuf header = STRBUF_INIT; 717char*eol, *p; 718 719if(strbuf_read_file(&buf,rebase_path_squash_msg(),2048) <=0) 720returnerror(_("could not read '%s'"), 721rebase_path_squash_msg()); 722 723 p = buf.buf +1; 724 eol =strchrnul(buf.buf,'\n'); 725if(buf.buf[0] != comment_line_char || 726(p +=strcspn(p,"0123456789\n")) == eol) 727returnerror(_("unexpected 1st line of squash message:" 728"\n\n\t%.*s"), 729(int)(eol - buf.buf), buf.buf); 730 count =strtol(p, NULL,10); 731 732if(count <1) 733returnerror(_("invalid 1st line of squash message:\n" 734"\n\t%.*s"), 735(int)(eol - buf.buf), buf.buf); 736 737strbuf_addf(&header,"%c", comment_line_char); 738strbuf_addf(&header, 739_("This is a combination of%dcommits."), ++count); 740strbuf_splice(&buf,0, eol - buf.buf, header.buf, header.len); 741strbuf_release(&header); 742}else{ 743unsigned char head[20]; 744struct commit *head_commit; 745const char*head_message, *body; 746 747if(get_sha1("HEAD", head)) 748returnerror(_("need a HEAD to fixup")); 749if(!(head_commit =lookup_commit_reference(head))) 750returnerror(_("could not read HEAD")); 751if(!(head_message =get_commit_buffer(head_commit, NULL))) 752returnerror(_("could not read HEAD's commit message")); 753 754find_commit_subject(head_message, &body); 755if(write_message(body,strlen(body), 756rebase_path_fixup_msg(),0)) { 757unuse_commit_buffer(head_commit, head_message); 758returnerror(_("cannot write '%s'"), 759rebase_path_fixup_msg()); 760} 761 762 count =2; 763strbuf_addf(&buf,"%c", comment_line_char); 764strbuf_addf(&buf,_("This is a combination of%dcommits."), 765 count); 766strbuf_addf(&buf,"\n%c", comment_line_char); 767strbuf_addstr(&buf,_("This is the 1st commit message:")); 768strbuf_addstr(&buf,"\n\n"); 769strbuf_addstr(&buf, body); 770 771unuse_commit_buffer(head_commit, head_message); 772} 773 774if(!(message =get_commit_buffer(commit, NULL))) 775returnerror(_("could not read commit message of%s"), 776oid_to_hex(&commit->object.oid)); 777find_commit_subject(message, &body); 778 779if(command == TODO_SQUASH) { 780unlink(rebase_path_fixup_msg()); 781strbuf_addf(&buf,"\n%c", comment_line_char); 782strbuf_addf(&buf,_("This is the commit message #%d:"), count); 783strbuf_addstr(&buf,"\n\n"); 784strbuf_addstr(&buf, body); 785}else if(command == TODO_FIXUP) { 786strbuf_addf(&buf,"\n%c", comment_line_char); 787strbuf_addf(&buf,_("The commit message #%dwill be skipped:"), 788 count); 789strbuf_addstr(&buf,"\n\n"); 790strbuf_add_commented_lines(&buf, body,strlen(body)); 791}else 792returnerror(_("unknown command:%d"), command); 793unuse_commit_buffer(commit, message); 794 795 res =write_message(buf.buf, buf.len,rebase_path_squash_msg(),0); 796strbuf_release(&buf); 797return res; 798} 799 800static intdo_pick_commit(enum todo_command command,struct commit *commit, 801struct replay_opts *opts,int final_fixup) 802{ 803int edit = opts->edit, cleanup_commit_message =0; 804const char*msg_file = edit ? NULL :git_path_merge_msg(); 805unsigned char head[20]; 806struct commit *base, *next, *parent; 807const char*base_label, *next_label; 808struct commit_message msg = { NULL, NULL, NULL, NULL }; 809struct strbuf msgbuf = STRBUF_INIT; 810int res, unborn =0, amend =0, allow; 811 812if(opts->no_commit) { 813/* 814 * We do not intend to commit immediately. We just want to 815 * merge the differences in, so let's compute the tree 816 * that represents the "current" state for merge-recursive 817 * to work on. 818 */ 819if(write_cache_as_tree(head,0, NULL)) 820returnerror(_("your index file is unmerged.")); 821}else{ 822 unborn =get_sha1("HEAD", head); 823if(unborn) 824hashcpy(head, EMPTY_TREE_SHA1_BIN); 825if(index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX :"HEAD",0,0)) 826returnerror_dirty_index(opts); 827} 828discard_cache(); 829 830if(!commit->parents) 831 parent = NULL; 832else if(commit->parents->next) { 833/* Reverting or cherry-picking a merge commit */ 834int cnt; 835struct commit_list *p; 836 837if(!opts->mainline) 838returnerror(_("commit%sis a merge but no -m option was given."), 839oid_to_hex(&commit->object.oid)); 840 841for(cnt =1, p = commit->parents; 842 cnt != opts->mainline && p; 843 cnt++) 844 p = p->next; 845if(cnt != opts->mainline || !p) 846returnerror(_("commit%sdoes not have parent%d"), 847oid_to_hex(&commit->object.oid), opts->mainline); 848 parent = p->item; 849}else if(0< opts->mainline) 850returnerror(_("mainline was specified but commit%sis not a merge."), 851oid_to_hex(&commit->object.oid)); 852else 853 parent = commit->parents->item; 854 855if(opts->allow_ff && !is_fixup(command) && 856((parent && !hashcmp(parent->object.oid.hash, head)) || 857(!parent && unborn))) 858returnfast_forward_to(commit->object.oid.hash, head, unborn, opts); 859 860if(parent &&parse_commit(parent) <0) 861/* TRANSLATORS: The first %s will be a "todo" command like 862 "revert" or "pick", the second %s a SHA1. */ 863returnerror(_("%s: cannot parse parent commit%s"), 864command_to_string(command), 865oid_to_hex(&parent->object.oid)); 866 867if(get_message(commit, &msg) !=0) 868returnerror(_("cannot get commit message for%s"), 869oid_to_hex(&commit->object.oid)); 870 871/* 872 * "commit" is an existing commit. We would want to apply 873 * the difference it introduces since its first parent "prev" 874 * on top of the current HEAD if we are cherry-pick. Or the 875 * reverse of it if we are revert. 876 */ 877 878if(command == TODO_REVERT) { 879 base = commit; 880 base_label = msg.label; 881 next = parent; 882 next_label = msg.parent_label; 883strbuf_addstr(&msgbuf,"Revert\""); 884strbuf_addstr(&msgbuf, msg.subject); 885strbuf_addstr(&msgbuf,"\"\n\nThis reverts commit "); 886strbuf_addstr(&msgbuf,oid_to_hex(&commit->object.oid)); 887 888if(commit->parents && commit->parents->next) { 889strbuf_addstr(&msgbuf,", reversing\nchanges made to "); 890strbuf_addstr(&msgbuf,oid_to_hex(&parent->object.oid)); 891} 892strbuf_addstr(&msgbuf,".\n"); 893}else{ 894const char*p; 895 896 base = parent; 897 base_label = msg.parent_label; 898 next = commit; 899 next_label = msg.label; 900 901/* Append the commit log message to msgbuf. */ 902if(find_commit_subject(msg.message, &p)) 903strbuf_addstr(&msgbuf, p); 904 905if(opts->record_origin) { 906if(!has_conforming_footer(&msgbuf, NULL,0)) 907strbuf_addch(&msgbuf,'\n'); 908strbuf_addstr(&msgbuf, cherry_picked_prefix); 909strbuf_addstr(&msgbuf,oid_to_hex(&commit->object.oid)); 910strbuf_addstr(&msgbuf,")\n"); 911} 912} 913 914if(is_fixup(command)) { 915if(update_squash_messages(command, commit, opts)) 916return-1; 917 amend =1; 918if(!final_fixup) 919 msg_file =rebase_path_squash_msg(); 920else if(file_exists(rebase_path_fixup_msg())) { 921 cleanup_commit_message =1; 922 msg_file =rebase_path_fixup_msg(); 923}else{ 924const char*dest =git_path("SQUASH_MSG"); 925unlink(dest); 926if(copy_file(dest,rebase_path_squash_msg(),0666)) 927returnerror(_("could not rename '%s' to '%s'"), 928rebase_path_squash_msg(), dest); 929unlink(git_path("MERGE_MSG")); 930 msg_file = dest; 931 edit =1; 932} 933} 934 935if(!opts->strategy || !strcmp(opts->strategy,"recursive") || command == TODO_REVERT) { 936 res =do_recursive_merge(base, next, base_label, next_label, 937 head, &msgbuf, opts); 938if(res <0) 939return res; 940 res |=write_message(msgbuf.buf, msgbuf.len, 941git_path_merge_msg(),0); 942}else{ 943struct commit_list *common = NULL; 944struct commit_list *remotes = NULL; 945 946 res =write_message(msgbuf.buf, msgbuf.len, 947git_path_merge_msg(),0); 948 949commit_list_insert(base, &common); 950commit_list_insert(next, &remotes); 951 res |=try_merge_command(opts->strategy, 952 opts->xopts_nr, (const char**)opts->xopts, 953 common,sha1_to_hex(head), remotes); 954free_commit_list(common); 955free_commit_list(remotes); 956} 957strbuf_release(&msgbuf); 958 959/* 960 * If the merge was clean or if it failed due to conflict, we write 961 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use. 962 * However, if the merge did not even start, then we don't want to 963 * write it at all. 964 */ 965if(command == TODO_PICK && !opts->no_commit && (res ==0|| res ==1) && 966update_ref(NULL,"CHERRY_PICK_HEAD", commit->object.oid.hash, NULL, 967 REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) 968 res = -1; 969if(command == TODO_REVERT && ((opts->no_commit && res ==0) || res ==1) && 970update_ref(NULL,"REVERT_HEAD", commit->object.oid.hash, NULL, 971 REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) 972 res = -1; 973 974if(res) { 975error(command == TODO_REVERT 976?_("could not revert%s...%s") 977:_("could not apply%s...%s"), 978short_commit_name(commit), msg.subject); 979print_advice(res ==1, opts); 980rerere(opts->allow_rerere_auto); 981goto leave; 982} 983 984 allow =allow_empty(opts, commit); 985if(allow <0) { 986 res = allow; 987goto leave; 988} 989if(!opts->no_commit) 990 res =run_git_commit(msg_file, opts, allow, edit, amend, 991 cleanup_commit_message); 992 993if(!res && final_fixup) { 994unlink(rebase_path_fixup_msg()); 995unlink(rebase_path_squash_msg()); 996} 997 998leave: 999free_message(commit, &msg);1000update_abort_safety_file();10011002return res;1003}10041005static intprepare_revs(struct replay_opts *opts)1006{1007/*1008 * picking (but not reverting) ranges (but not individual revisions)1009 * should be done in reverse1010 */1011if(opts->action == REPLAY_PICK && !opts->revs->no_walk)1012 opts->revs->reverse ^=1;10131014if(prepare_revision_walk(opts->revs))1015returnerror(_("revision walk setup failed"));10161017if(!opts->revs->commits)1018returnerror(_("empty commit set passed"));1019return0;1020}10211022static intread_and_refresh_cache(struct replay_opts *opts)1023{1024static struct lock_file index_lock;1025int index_fd =hold_locked_index(&index_lock,0);1026if(read_index_preload(&the_index, NULL) <0) {1027rollback_lock_file(&index_lock);1028returnerror(_("git%s: failed to read the index"),1029_(action_name(opts)));1030}1031refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);1032if(the_index.cache_changed && index_fd >=0) {1033if(write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) {1034rollback_lock_file(&index_lock);1035returnerror(_("git%s: failed to refresh the index"),1036_(action_name(opts)));1037}1038}1039rollback_lock_file(&index_lock);1040return0;1041}10421043struct todo_item {1044enum todo_command command;1045struct commit *commit;1046const char*arg;1047int arg_len;1048size_t offset_in_buf;1049};10501051struct todo_list {1052struct strbuf buf;1053struct todo_item *items;1054int nr, alloc, current;1055};10561057#define TODO_LIST_INIT { STRBUF_INIT }10581059static voidtodo_list_release(struct todo_list *todo_list)1060{1061strbuf_release(&todo_list->buf);1062free(todo_list->items);1063 todo_list->items = NULL;1064 todo_list->nr = todo_list->alloc =0;1065}10661067static struct todo_item *append_new_todo(struct todo_list *todo_list)1068{1069ALLOC_GROW(todo_list->items, todo_list->nr +1, todo_list->alloc);1070return todo_list->items + todo_list->nr++;1071}10721073static intparse_insn_line(struct todo_item *item,const char*bol,char*eol)1074{1075unsigned char commit_sha1[20];1076char*end_of_object_name;1077int i, saved, status, padding;10781079/* left-trim */1080 bol +=strspn(bol,"\t");10811082if(bol == eol || *bol =='\r'|| *bol == comment_line_char) {1083 item->command = TODO_NOOP;1084 item->commit = NULL;1085 item->arg = bol;1086 item->arg_len = eol - bol;1087return0;1088}10891090for(i =0; i <ARRAY_SIZE(todo_command_strings); i++)1091if(skip_prefix(bol, todo_command_strings[i], &bol)) {1092 item->command = i;1093break;1094}1095if(i >=ARRAY_SIZE(todo_command_strings))1096return-1;10971098if(item->command == TODO_NOOP) {1099 item->commit = NULL;1100 item->arg = bol;1101 item->arg_len = eol - bol;1102return0;1103}11041105/* Eat up extra spaces/ tabs before object name */1106 padding =strspn(bol,"\t");1107if(!padding)1108return-1;1109 bol += padding;11101111if(item->command == TODO_EXEC) {1112 item->arg = bol;1113 item->arg_len = (int)(eol - bol);1114return0;1115}11161117 end_of_object_name = (char*) bol +strcspn(bol,"\t\n");1118 saved = *end_of_object_name;1119*end_of_object_name ='\0';1120 status =get_sha1(bol, commit_sha1);1121*end_of_object_name = saved;11221123 item->arg = end_of_object_name +strspn(end_of_object_name,"\t");1124 item->arg_len = (int)(eol - item->arg);11251126if(status <0)1127return-1;11281129 item->commit =lookup_commit_reference(commit_sha1);1130return!item->commit;1131}11321133static intparse_insn_buffer(char*buf,struct todo_list *todo_list)1134{1135struct todo_item *item;1136char*p = buf, *next_p;1137int i, res =0, fixup_okay =file_exists(rebase_path_done());11381139for(i =1; *p; i++, p = next_p) {1140char*eol =strchrnul(p,'\n');11411142 next_p = *eol ? eol +1/* skip LF */: eol;11431144if(p != eol && eol[-1] =='\r')1145 eol--;/* strip Carriage Return */11461147 item =append_new_todo(todo_list);1148 item->offset_in_buf = p - todo_list->buf.buf;1149if(parse_insn_line(item, p, eol)) {1150 res =error(_("invalid line%d: %.*s"),1151 i, (int)(eol - p), p);1152 item->command = TODO_NOOP;1153}11541155if(fixup_okay)1156;/* do nothing */1157else if(is_fixup(item->command))1158returnerror(_("cannot '%s' without a previous commit"),1159command_to_string(item->command));1160else if(!is_noop(item->command))1161 fixup_okay =1;1162}1163if(!todo_list->nr)1164returnerror(_("no commits parsed."));1165return res;1166}11671168static intread_populate_todo(struct todo_list *todo_list,1169struct replay_opts *opts)1170{1171const char*todo_file =get_todo_path(opts);1172int fd, res;11731174strbuf_reset(&todo_list->buf);1175 fd =open(todo_file, O_RDONLY);1176if(fd <0)1177returnerror_errno(_("could not open '%s'"), todo_file);1178if(strbuf_read(&todo_list->buf, fd,0) <0) {1179close(fd);1180returnerror(_("could not read '%s'."), todo_file);1181}1182close(fd);11831184 res =parse_insn_buffer(todo_list->buf.buf, todo_list);1185if(res)1186returnerror(_("unusable instruction sheet: '%s'"), todo_file);11871188if(!is_rebase_i(opts)) {1189enum todo_command valid =1190 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;1191int i;11921193for(i =0; i < todo_list->nr; i++)1194if(valid == todo_list->items[i].command)1195continue;1196else if(valid == TODO_PICK)1197returnerror(_("cannot cherry-pick during a revert."));1198else1199returnerror(_("cannot revert during a cherry-pick."));1200}12011202return0;1203}12041205static intgit_config_string_dup(char**dest,1206const char*var,const char*value)1207{1208if(!value)1209returnconfig_error_nonbool(var);1210free(*dest);1211*dest =xstrdup(value);1212return0;1213}12141215static intpopulate_opts_cb(const char*key,const char*value,void*data)1216{1217struct replay_opts *opts = data;1218int error_flag =1;12191220if(!value)1221 error_flag =0;1222else if(!strcmp(key,"options.no-commit"))1223 opts->no_commit =git_config_bool_or_int(key, value, &error_flag);1224else if(!strcmp(key,"options.edit"))1225 opts->edit =git_config_bool_or_int(key, value, &error_flag);1226else if(!strcmp(key,"options.signoff"))1227 opts->signoff =git_config_bool_or_int(key, value, &error_flag);1228else if(!strcmp(key,"options.record-origin"))1229 opts->record_origin =git_config_bool_or_int(key, value, &error_flag);1230else if(!strcmp(key,"options.allow-ff"))1231 opts->allow_ff =git_config_bool_or_int(key, value, &error_flag);1232else if(!strcmp(key,"options.mainline"))1233 opts->mainline =git_config_int(key, value);1234else if(!strcmp(key,"options.strategy"))1235git_config_string_dup(&opts->strategy, key, value);1236else if(!strcmp(key,"options.gpg-sign"))1237git_config_string_dup(&opts->gpg_sign, key, value);1238else if(!strcmp(key,"options.strategy-option")) {1239ALLOC_GROW(opts->xopts, opts->xopts_nr +1, opts->xopts_alloc);1240 opts->xopts[opts->xopts_nr++] =xstrdup(value);1241}else1242returnerror(_("invalid key:%s"), key);12431244if(!error_flag)1245returnerror(_("invalid value for%s:%s"), key, value);12461247return0;1248}12491250static intread_populate_opts(struct replay_opts *opts)1251{1252if(is_rebase_i(opts)) {1253struct strbuf buf = STRBUF_INIT;12541255if(read_oneliner(&buf,rebase_path_gpg_sign_opt(),1)) {1256if(!starts_with(buf.buf,"-S"))1257strbuf_reset(&buf);1258else{1259free(opts->gpg_sign);1260 opts->gpg_sign =xstrdup(buf.buf +2);1261}1262}1263strbuf_release(&buf);12641265if(file_exists(rebase_path_verbose()))1266 opts->verbose =1;12671268return0;1269}12701271if(!file_exists(git_path_opts_file()))1272return0;1273/*1274 * The function git_parse_source(), called from git_config_from_file(),1275 * may die() in case of a syntactically incorrect file. We do not care1276 * about this case, though, because we wrote that file ourselves, so we1277 * are pretty certain that it is syntactically correct.1278 */1279if(git_config_from_file(populate_opts_cb,git_path_opts_file(), opts) <0)1280returnerror(_("malformed options sheet: '%s'"),1281git_path_opts_file());1282return0;1283}12841285static intwalk_revs_populate_todo(struct todo_list *todo_list,1286struct replay_opts *opts)1287{1288enum todo_command command = opts->action == REPLAY_PICK ?1289 TODO_PICK : TODO_REVERT;1290const char*command_string = todo_command_strings[command];1291struct commit *commit;12921293if(prepare_revs(opts))1294return-1;12951296while((commit =get_revision(opts->revs))) {1297struct todo_item *item =append_new_todo(todo_list);1298const char*commit_buffer =get_commit_buffer(commit, NULL);1299const char*subject;1300int subject_len;13011302 item->command = command;1303 item->commit = commit;1304 item->arg = NULL;1305 item->arg_len =0;1306 item->offset_in_buf = todo_list->buf.len;1307 subject_len =find_commit_subject(commit_buffer, &subject);1308strbuf_addf(&todo_list->buf,"%s %s%.*s\n", command_string,1309short_commit_name(commit), subject_len, subject);1310unuse_commit_buffer(commit, commit_buffer);1311}1312return0;1313}13141315static intcreate_seq_dir(void)1316{1317if(file_exists(git_path_seq_dir())) {1318error(_("a cherry-pick or revert is already in progress"));1319advise(_("try\"git cherry-pick (--continue | --quit | --abort)\""));1320return-1;1321}else if(mkdir(git_path_seq_dir(),0777) <0)1322returnerror_errno(_("could not create sequencer directory '%s'"),1323git_path_seq_dir());1324return0;1325}13261327static intsave_head(const char*head)1328{1329static struct lock_file head_lock;1330struct strbuf buf = STRBUF_INIT;1331int fd;13321333 fd =hold_lock_file_for_update(&head_lock,git_path_head_file(),0);1334if(fd <0) {1335rollback_lock_file(&head_lock);1336returnerror_errno(_("could not lock HEAD"));1337}1338strbuf_addf(&buf,"%s\n", head);1339if(write_in_full(fd, buf.buf, buf.len) <0) {1340rollback_lock_file(&head_lock);1341returnerror_errno(_("could not write to '%s'"),1342git_path_head_file());1343}1344if(commit_lock_file(&head_lock) <0) {1345rollback_lock_file(&head_lock);1346returnerror(_("failed to finalize '%s'."),git_path_head_file());1347}1348return0;1349}13501351static introllback_is_safe(void)1352{1353struct strbuf sb = STRBUF_INIT;1354struct object_id expected_head, actual_head;13551356if(strbuf_read_file(&sb,git_path_abort_safety_file(),0) >=0) {1357strbuf_trim(&sb);1358if(get_oid_hex(sb.buf, &expected_head)) {1359strbuf_release(&sb);1360die(_("could not parse%s"),git_path_abort_safety_file());1361}1362strbuf_release(&sb);1363}1364else if(errno == ENOENT)1365oidclr(&expected_head);1366else1367die_errno(_("could not read '%s'"),git_path_abort_safety_file());13681369if(get_oid("HEAD", &actual_head))1370oidclr(&actual_head);13711372return!oidcmp(&actual_head, &expected_head);1373}13741375static intreset_for_rollback(const unsigned char*sha1)1376{1377const char*argv[4];/* reset --merge <arg> + NULL */13781379 argv[0] ="reset";1380 argv[1] ="--merge";1381 argv[2] =sha1_to_hex(sha1);1382 argv[3] = NULL;1383returnrun_command_v_opt(argv, RUN_GIT_CMD);1384}13851386static introllback_single_pick(void)1387{1388unsigned char head_sha1[20];13891390if(!file_exists(git_path_cherry_pick_head()) &&1391!file_exists(git_path_revert_head()))1392returnerror(_("no cherry-pick or revert in progress"));1393if(read_ref_full("HEAD",0, head_sha1, NULL))1394returnerror(_("cannot resolve HEAD"));1395if(is_null_sha1(head_sha1))1396returnerror(_("cannot abort from a branch yet to be born"));1397returnreset_for_rollback(head_sha1);1398}13991400intsequencer_rollback(struct replay_opts *opts)1401{1402FILE*f;1403unsigned char sha1[20];1404struct strbuf buf = STRBUF_INIT;14051406 f =fopen(git_path_head_file(),"r");1407if(!f && errno == ENOENT) {1408/*1409 * There is no multiple-cherry-pick in progress.1410 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates1411 * a single-cherry-pick in progress, abort that.1412 */1413returnrollback_single_pick();1414}1415if(!f)1416returnerror_errno(_("cannot open '%s'"),git_path_head_file());1417if(strbuf_getline_lf(&buf, f)) {1418error(_("cannot read '%s':%s"),git_path_head_file(),1419ferror(f) ?strerror(errno) :_("unexpected end of file"));1420fclose(f);1421goto fail;1422}1423fclose(f);1424if(get_sha1_hex(buf.buf, sha1) || buf.buf[40] !='\0') {1425error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),1426git_path_head_file());1427goto fail;1428}1429if(is_null_sha1(sha1)) {1430error(_("cannot abort from a branch yet to be born"));1431goto fail;1432}14331434if(!rollback_is_safe()) {1435/* Do not error, just do not rollback */1436warning(_("You seem to have moved HEAD. "1437"Not rewinding, check your HEAD!"));1438}else1439if(reset_for_rollback(sha1))1440goto fail;1441strbuf_release(&buf);1442returnsequencer_remove_state(opts);1443fail:1444strbuf_release(&buf);1445return-1;1446}14471448static intsave_todo(struct todo_list *todo_list,struct replay_opts *opts)1449{1450static struct lock_file todo_lock;1451const char*todo_path =get_todo_path(opts);1452int next = todo_list->current, offset, fd;14531454/*1455 * rebase -i writes "git-rebase-todo" without the currently executing1456 * command, appending it to "done" instead.1457 */1458if(is_rebase_i(opts))1459 next++;14601461 fd =hold_lock_file_for_update(&todo_lock, todo_path,0);1462if(fd <0)1463returnerror_errno(_("could not lock '%s'"), todo_path);1464 offset = next < todo_list->nr ?1465 todo_list->items[next].offset_in_buf : todo_list->buf.len;1466if(write_in_full(fd, todo_list->buf.buf + offset,1467 todo_list->buf.len - offset) <0)1468returnerror_errno(_("could not write to '%s'"), todo_path);1469if(commit_lock_file(&todo_lock) <0)1470returnerror(_("failed to finalize '%s'."), todo_path);14711472if(is_rebase_i(opts)) {1473const char*done_path =rebase_path_done();1474int fd =open(done_path, O_CREAT | O_WRONLY | O_APPEND,0666);1475int prev_offset = !next ?0:1476 todo_list->items[next -1].offset_in_buf;14771478if(fd >=0&& offset > prev_offset &&1479write_in_full(fd, todo_list->buf.buf + prev_offset,1480 offset - prev_offset) <0) {1481close(fd);1482returnerror_errno(_("could not write to '%s'"),1483 done_path);1484}1485if(fd >=0)1486close(fd);1487}1488return0;1489}14901491static intsave_opts(struct replay_opts *opts)1492{1493const char*opts_file =git_path_opts_file();1494int res =0;14951496if(opts->no_commit)1497 res |=git_config_set_in_file_gently(opts_file,"options.no-commit","true");1498if(opts->edit)1499 res |=git_config_set_in_file_gently(opts_file,"options.edit","true");1500if(opts->signoff)1501 res |=git_config_set_in_file_gently(opts_file,"options.signoff","true");1502if(opts->record_origin)1503 res |=git_config_set_in_file_gently(opts_file,"options.record-origin","true");1504if(opts->allow_ff)1505 res |=git_config_set_in_file_gently(opts_file,"options.allow-ff","true");1506if(opts->mainline) {1507struct strbuf buf = STRBUF_INIT;1508strbuf_addf(&buf,"%d", opts->mainline);1509 res |=git_config_set_in_file_gently(opts_file,"options.mainline", buf.buf);1510strbuf_release(&buf);1511}1512if(opts->strategy)1513 res |=git_config_set_in_file_gently(opts_file,"options.strategy", opts->strategy);1514if(opts->gpg_sign)1515 res |=git_config_set_in_file_gently(opts_file,"options.gpg-sign", opts->gpg_sign);1516if(opts->xopts) {1517int i;1518for(i =0; i < opts->xopts_nr; i++)1519 res |=git_config_set_multivar_in_file_gently(opts_file,1520"options.strategy-option",1521 opts->xopts[i],"^$",0);1522}1523return res;1524}15251526static intmake_patch(struct commit *commit,struct replay_opts *opts)1527{1528struct strbuf buf = STRBUF_INIT;1529struct rev_info log_tree_opt;1530const char*subject, *p;1531int res =0;15321533 p =short_commit_name(commit);1534if(write_message(p,strlen(p),rebase_path_stopped_sha(),1) <0)1535return-1;15361537strbuf_addf(&buf,"%s/patch",get_dir(opts));1538memset(&log_tree_opt,0,sizeof(log_tree_opt));1539init_revisions(&log_tree_opt, NULL);1540 log_tree_opt.abbrev =0;1541 log_tree_opt.diff =1;1542 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;1543 log_tree_opt.disable_stdin =1;1544 log_tree_opt.no_commit_id =1;1545 log_tree_opt.diffopt.file =fopen(buf.buf,"w");1546 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;1547if(!log_tree_opt.diffopt.file)1548 res |=error_errno(_("could not open '%s'"), buf.buf);1549else{1550 res |=log_tree_commit(&log_tree_opt, commit);1551fclose(log_tree_opt.diffopt.file);1552}1553strbuf_reset(&buf);15541555strbuf_addf(&buf,"%s/message",get_dir(opts));1556if(!file_exists(buf.buf)) {1557const char*commit_buffer =get_commit_buffer(commit, NULL);1558find_commit_subject(commit_buffer, &subject);1559 res |=write_message(subject,strlen(subject), buf.buf,1);1560unuse_commit_buffer(commit, commit_buffer);1561}1562strbuf_release(&buf);15631564return res;1565}15661567static intintend_to_amend(void)1568{1569unsigned char head[20];1570char*p;15711572if(get_sha1("HEAD", head))1573returnerror(_("cannot read HEAD"));15741575 p =sha1_to_hex(head);1576returnwrite_message(p,strlen(p),rebase_path_amend(),1);1577}15781579static interror_with_patch(struct commit *commit,1580const char*subject,int subject_len,1581struct replay_opts *opts,int exit_code,int to_amend)1582{1583if(make_patch(commit, opts))1584return-1;15851586if(to_amend) {1587if(intend_to_amend())1588return-1;15891590fprintf(stderr,"You can amend the commit now, with\n"1591"\n"1592" git commit --amend%s\n"1593"\n"1594"Once you are satisfied with your changes, run\n"1595"\n"1596" git rebase --continue\n",gpg_sign_opt_quoted(opts));1597}else if(exit_code)1598fprintf(stderr,"Could not apply%s... %.*s\n",1599short_commit_name(commit), subject_len, subject);16001601return exit_code;1602}16031604static interror_failed_squash(struct commit *commit,1605struct replay_opts *opts,int subject_len,const char*subject)1606{1607if(rename(rebase_path_squash_msg(),rebase_path_message()))1608returnerror(_("could not rename '%s' to '%s'"),1609rebase_path_squash_msg(),rebase_path_message());1610unlink(rebase_path_fixup_msg());1611unlink(git_path("MERGE_MSG"));1612if(copy_file(git_path("MERGE_MSG"),rebase_path_message(),0666))1613returnerror(_("could not copy '%s' to '%s'"),1614rebase_path_message(),git_path("MERGE_MSG"));1615returnerror_with_patch(commit, subject, subject_len, opts,1,0);1616}16171618static intdo_exec(const char*command_line)1619{1620const char*child_argv[] = { NULL, NULL };1621int dirty, status;16221623fprintf(stderr,"Executing:%s\n", command_line);1624 child_argv[0] = command_line;1625 status =run_command_v_opt(child_argv, RUN_USING_SHELL);16261627/* force re-reading of the cache */1628if(discard_cache() <0||read_cache() <0)1629returnerror(_("could not read index"));16301631 dirty =require_clean_work_tree("rebase", NULL,1,1);16321633if(status) {1634warning(_("execution failed:%s\n%s"1635"You can fix the problem, and then run\n"1636"\n"1637" git rebase --continue\n"1638"\n"),1639 command_line,1640 dirty ?N_("and made changes to the index and/or the "1641"working tree\n") :"");1642if(status ==127)1643/* command not found */1644 status =1;1645}else if(dirty) {1646warning(_("execution succeeded:%s\nbut "1647"left changes to the index and/or the working tree\n"1648"Commit or stash your changes, and then run\n"1649"\n"1650" git rebase --continue\n"1651"\n"), command_line);1652 status =1;1653}16541655return status;1656}16571658static intis_final_fixup(struct todo_list *todo_list)1659{1660int i = todo_list->current;16611662if(!is_fixup(todo_list->items[i].command))1663return0;16641665while(++i < todo_list->nr)1666if(is_fixup(todo_list->items[i].command))1667return0;1668else if(!is_noop(todo_list->items[i].command))1669break;1670return1;1671}16721673static intpick_commits(struct todo_list *todo_list,struct replay_opts *opts)1674{1675int res =0;16761677setenv(GIT_REFLOG_ACTION,action_name(opts),0);1678if(opts->allow_ff)1679assert(!(opts->signoff || opts->no_commit ||1680 opts->record_origin || opts->edit));1681if(read_and_refresh_cache(opts))1682return-1;16831684while(todo_list->current < todo_list->nr) {1685struct todo_item *item = todo_list->items + todo_list->current;1686if(save_todo(todo_list, opts))1687return-1;1688if(is_rebase_i(opts)) {1689unlink(rebase_path_message());1690unlink(rebase_path_author_script());1691unlink(rebase_path_stopped_sha());1692unlink(rebase_path_amend());1693}1694if(item->command <= TODO_SQUASH) {1695 res =do_pick_commit(item->command, item->commit,1696 opts,is_final_fixup(todo_list));1697if(item->command == TODO_EDIT) {1698struct commit *commit = item->commit;1699if(!res)1700warning(_("stopped at%s... %.*s"),1701short_commit_name(commit),1702 item->arg_len, item->arg);1703returnerror_with_patch(commit,1704 item->arg, item->arg_len, opts, res,1705!res);1706}1707if(res &&is_fixup(item->command)) {1708if(res ==1)1709intend_to_amend();1710returnerror_failed_squash(item->commit, opts,1711 item->arg_len, item->arg);1712}1713}else if(item->command == TODO_EXEC) {1714char*end_of_arg = (char*)(item->arg + item->arg_len);1715int saved = *end_of_arg;17161717*end_of_arg ='\0';1718 res =do_exec(item->arg);1719*end_of_arg = saved;1720}else if(!is_noop(item->command))1721returnerror(_("unknown command%d"), item->command);17221723 todo_list->current++;1724if(res)1725return res;1726}17271728if(is_rebase_i(opts)) {1729struct strbuf buf = STRBUF_INIT;17301731/* Stopped in the middle, as planned? */1732if(todo_list->current < todo_list->nr)1733return0;17341735if(opts->verbose) {1736struct rev_info log_tree_opt;1737struct object_id orig, head;17381739memset(&log_tree_opt,0,sizeof(log_tree_opt));1740init_revisions(&log_tree_opt, NULL);1741 log_tree_opt.diff =1;1742 log_tree_opt.diffopt.output_format =1743 DIFF_FORMAT_DIFFSTAT;1744 log_tree_opt.disable_stdin =1;17451746if(read_oneliner(&buf,rebase_path_orig_head(),0) &&1747!get_sha1(buf.buf, orig.hash) &&1748!get_sha1("HEAD", head.hash)) {1749diff_tree_sha1(orig.hash, head.hash,1750"", &log_tree_opt.diffopt);1751log_tree_diff_flush(&log_tree_opt);1752}1753}1754strbuf_release(&buf);1755}17561757/*1758 * Sequence of picks finished successfully; cleanup by1759 * removing the .git/sequencer directory1760 */1761returnsequencer_remove_state(opts);1762}17631764static intcontinue_single_pick(void)1765{1766const char*argv[] = {"commit", NULL };17671768if(!file_exists(git_path_cherry_pick_head()) &&1769!file_exists(git_path_revert_head()))1770returnerror(_("no cherry-pick or revert in progress"));1771returnrun_command_v_opt(argv, RUN_GIT_CMD);1772}17731774intsequencer_continue(struct replay_opts *opts)1775{1776struct todo_list todo_list = TODO_LIST_INIT;1777int res;17781779if(read_and_refresh_cache(opts))1780return-1;17811782if(!file_exists(get_todo_path(opts)))1783returncontinue_single_pick();1784if(read_populate_opts(opts))1785return-1;1786if((res =read_populate_todo(&todo_list, opts)))1787goto release_todo_list;17881789/* Verify that the conflict has been resolved */1790if(file_exists(git_path_cherry_pick_head()) ||1791file_exists(git_path_revert_head())) {1792 res =continue_single_pick();1793if(res)1794goto release_todo_list;1795}1796if(index_differs_from("HEAD",0,0)) {1797 res =error_dirty_index(opts);1798goto release_todo_list;1799}1800 todo_list.current++;1801 res =pick_commits(&todo_list, opts);1802release_todo_list:1803todo_list_release(&todo_list);1804return res;1805}18061807static intsingle_pick(struct commit *cmit,struct replay_opts *opts)1808{1809setenv(GIT_REFLOG_ACTION,action_name(opts),0);1810returndo_pick_commit(opts->action == REPLAY_PICK ?1811 TODO_PICK : TODO_REVERT, cmit, opts,0);1812}18131814intsequencer_pick_revisions(struct replay_opts *opts)1815{1816struct todo_list todo_list = TODO_LIST_INIT;1817unsigned char sha1[20];1818int i, res;18191820assert(opts->revs);1821if(read_and_refresh_cache(opts))1822return-1;18231824for(i =0; i < opts->revs->pending.nr; i++) {1825unsigned char sha1[20];1826const char*name = opts->revs->pending.objects[i].name;18271828/* This happens when using --stdin. */1829if(!strlen(name))1830continue;18311832if(!get_sha1(name, sha1)) {1833if(!lookup_commit_reference_gently(sha1,1)) {1834enum object_type type =sha1_object_info(sha1, NULL);1835returnerror(_("%s: can't cherry-pick a%s"),1836 name,typename(type));1837}1838}else1839returnerror(_("%s: bad revision"), name);1840}18411842/*1843 * If we were called as "git cherry-pick <commit>", just1844 * cherry-pick/revert it, set CHERRY_PICK_HEAD /1845 * REVERT_HEAD, and don't touch the sequencer state.1846 * This means it is possible to cherry-pick in the middle1847 * of a cherry-pick sequence.1848 */1849if(opts->revs->cmdline.nr ==1&&1850 opts->revs->cmdline.rev->whence == REV_CMD_REV &&1851 opts->revs->no_walk &&1852!opts->revs->cmdline.rev->flags) {1853struct commit *cmit;1854if(prepare_revision_walk(opts->revs))1855returnerror(_("revision walk setup failed"));1856 cmit =get_revision(opts->revs);1857if(!cmit ||get_revision(opts->revs))1858returnerror("BUG: expected exactly one commit from walk");1859returnsingle_pick(cmit, opts);1860}18611862/*1863 * Start a new cherry-pick/ revert sequence; but1864 * first, make sure that an existing one isn't in1865 * progress1866 */18671868if(walk_revs_populate_todo(&todo_list, opts) ||1869create_seq_dir() <0)1870return-1;1871if(get_sha1("HEAD", sha1) && (opts->action == REPLAY_REVERT))1872returnerror(_("can't revert as initial commit"));1873if(save_head(sha1_to_hex(sha1)))1874return-1;1875if(save_opts(opts))1876return-1;1877update_abort_safety_file();1878 res =pick_commits(&todo_list, opts);1879todo_list_release(&todo_list);1880return res;1881}18821883voidappend_signoff(struct strbuf *msgbuf,int ignore_footer,unsigned flag)1884{1885unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;1886struct strbuf sob = STRBUF_INIT;1887int has_footer;18881889strbuf_addstr(&sob, sign_off_header);1890strbuf_addstr(&sob,fmt_name(getenv("GIT_COMMITTER_NAME"),1891getenv("GIT_COMMITTER_EMAIL")));1892strbuf_addch(&sob,'\n');18931894/*1895 * If the whole message buffer is equal to the sob, pretend that we1896 * found a conforming footer with a matching sob1897 */1898if(msgbuf->len - ignore_footer == sob.len &&1899!strncmp(msgbuf->buf, sob.buf, sob.len))1900 has_footer =3;1901else1902 has_footer =has_conforming_footer(msgbuf, &sob, ignore_footer);19031904if(!has_footer) {1905const char*append_newlines = NULL;1906size_t len = msgbuf->len - ignore_footer;19071908if(!len) {1909/*1910 * The buffer is completely empty. Leave foom for1911 * the title and body to be filled in by the user.1912 */1913 append_newlines ="\n\n";1914}else if(msgbuf->buf[len -1] !='\n') {1915/*1916 * Incomplete line. Complete the line and add a1917 * blank one so that there is an empty line between1918 * the message body and the sob.1919 */1920 append_newlines ="\n\n";1921}else if(len ==1) {1922/*1923 * Buffer contains a single newline. Add another1924 * so that we leave room for the title and body.1925 */1926 append_newlines ="\n";1927}else if(msgbuf->buf[len -2] !='\n') {1928/*1929 * Buffer ends with a single newline. Add another1930 * so that there is an empty line between the message1931 * body and the sob.1932 */1933 append_newlines ="\n";1934}/* else, the buffer already ends with two newlines. */19351936if(append_newlines)1937strbuf_splice(msgbuf, msgbuf->len - ignore_footer,0,1938 append_newlines,strlen(append_newlines));1939}19401941if(has_footer !=3&& (!no_dup_sob || has_footer !=2))1942strbuf_splice(msgbuf, msgbuf->len - ignore_footer,0,1943 sob.buf, sob.len);19441945strbuf_release(&sob);1946}