diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-07-13 15:15:13 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-13 15:15:13 -0700 |
commit | fc062aa2e121d7976a741e7b8b5ba98f2e26056d (patch) | |
tree | acff80f8aed9b3b5424cd553bd3e1103596b9732 | |
parent | ef567fe70adced1a844088e04dc4b6dd4e83edfb (diff) | |
parent | f95ebf74296077d5fdccaa2668edc527841db521 (diff) | |
download | git-fc062aa2e121d7976a741e7b8b5ba98f2e26056d.tar.gz |
Merge branch 'js/pick-root'
* js/pick-root:
Allow cherry-picking root commits
-rw-r--r-- | builtin-revert.c | 26 | ||||
-rwxr-xr-x | t/t3503-cherry-pick-root.sh | 30 |
2 files changed, 46 insertions, 10 deletions
diff --git a/builtin-revert.c b/builtin-revert.c index 0270f9b85a..f3d452418c 100644 --- a/builtin-revert.c +++ b/builtin-revert.c @@ -206,6 +206,7 @@ static int merge_recursive(const char *base_sha1, { char buffer[256]; const char *argv[6]; + int i = 0; sprintf(buffer, "GITHEAD_%s", head_sha1); setenv(buffer, head_name, 1); @@ -218,12 +219,13 @@ static int merge_recursive(const char *base_sha1, * and $prev on top of us (when reverting), or the change between * $prev and $commit on top of us (when cherry-picking or replaying). */ - argv[0] = "merge-recursive"; - argv[1] = base_sha1; - argv[2] = "--"; - argv[3] = head_sha1; - argv[4] = next_sha1; - argv[5] = NULL; + argv[i++] = "merge-recursive"; + if (base_sha1) + argv[i++] = base_sha1; + argv[i++] = "--"; + argv[i++] = head_sha1; + argv[i++] = next_sha1; + argv[i++] = NULL; return run_command_v_opt(argv, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD); } @@ -297,9 +299,12 @@ static int revert_or_cherry_pick(int argc, const char **argv) discard_cache(); } - if (!commit->parents) - die ("Cannot %s a root commit", me); - if (commit->parents->next) { + if (!commit->parents) { + if (action == REVERT) + die ("Cannot revert a root commit"); + parent = NULL; + } + else if (commit->parents->next) { /* Reverting or cherry-picking a merge commit */ int cnt; struct commit_list *p; @@ -368,7 +373,8 @@ static int revert_or_cherry_pick(int argc, const char **argv) } } - if (merge_recursive(sha1_to_hex(base->object.sha1), + if (merge_recursive(base == NULL ? + NULL : sha1_to_hex(base->object.sha1), sha1_to_hex(head), "HEAD", sha1_to_hex(next->object.sha1), oneline) || write_cache_as_tree(head, 0, NULL)) { diff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh new file mode 100755 index 0000000000..b0faa29918 --- /dev/null +++ b/t/t3503-cherry-pick-root.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +test_description='test cherry-picking a root commit' + +. ./test-lib.sh + +test_expect_success setup ' + + echo first > file1 && + git add file1 && + test_tick && + git commit -m "first" && + + git symbolic-ref HEAD refs/heads/second && + rm .git/index file1 && + echo second > file2 && + git add file2 && + test_tick && + git commit -m "second" + +' + +test_expect_success 'cherry-pick a root commit' ' + + git cherry-pick master && + test first = $(cat file1) + +' + +test_done |