From: Stephan Beyer <s-beyer@xxxxxxx> This patch adds some code that comes from the sequencer GSoC project: git://repo.or.cz/git/sbeyer.git (commit e7b8dab0c2a73ade92017a52bb1405ea1534ef20) Most of the code is taken from the insn_pick_act() function. Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin-sequencer--helper.c | 52 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 51 insertions(+), 1 deletions(-) diff --git a/builtin-sequencer--helper.c b/builtin-sequencer--helper.c index 61a8f2e..0f2255a 100644 --- a/builtin-sequencer--helper.c +++ b/builtin-sequencer--helper.c @@ -288,7 +288,7 @@ static int do_commit(unsigned char *parent_sha1) if (update_ref(reflog, "HEAD", commit_sha1, NULL, 0, 0)) return error("Could not update HEAD to %s.", - sha1_to_hex(commit_sha1)); + sha1_to_hex(commit_sha1)); return 0; } @@ -436,6 +436,7 @@ int cmd_sequencer__helper(int argc, const char **argv, const char *prefix) char *patch_commit = NULL; char *reset_commit = NULL; char *ff_commit = NULL; + char *cp_commit = NULL; struct option options[] = { OPT_STRING(0, "make-patch", &patch_commit, "commit", "create a patch from commit"), @@ -443,6 +444,8 @@ int cmd_sequencer__helper(int argc, const char **argv, const char *prefix) "reset to commit"), OPT_STRING(0, "fast-forward", &ff_commit, "commit", "fast forward to commit"), + OPT_STRING(0, "cherry-pick", &cp_commit, "commit", + "cherry pick commit"), OPT_END() }; @@ -488,5 +491,52 @@ int cmd_sequencer__helper(int argc, const char **argv, const char *prefix) return reset_almost_hard(sha1); } + if (cp_commit) { + struct commit *commit; + int failed; + const char *author; + int no_commit = 0; + + if (argc != 0 && argc != 1) + usage_with_options(git_sequencer_helper_usage, + options); + + if (argc == 1 && *argv[0] && strcmp(argv[0], "0")) + no_commit = 1; + + if (get_sha1("HEAD", head_sha1)) + return error("You do not have a valid HEAD."); + + commit = get_commit(cp_commit); + if (!commit) + return 1; + + set_pick_subject(cp_commit, commit); + + failed = pick_commit(commit, 0, 0, &next_commit.summary); + + set_message_source(sha1_to_hex(commit->object.sha1)); + author = strstr(commit->buffer, "\nauthor "); + if (author) + set_author_info(author + 8); + + /* We do not want extra Conflicts: lines on cherry-pick, + so just take the old commit message. */ + if (failed) { + strbuf_setlen(&next_commit.summary, 0); + strbuf_addstr(&next_commit.summary, + strstr(commit->buffer, "\n\n") + 2); + rerere(); + make_patch(commit); + write_commit_summary_into(MERGE_MSG); + return error(pick_help_msg(commit->object.sha1, 0)); + } + + if (!no_commit && do_commit(head_sha1)) + return error("Could not commit."); + + return 0; + } + usage_with_options(git_sequencer_helper_usage, options); } -- 1.6.4.271.ge010d -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html