* [PATCH 1/4] revert: report success when using option --strategy
@ 2010-07-13 23:28 Christian Couder
2010-07-15 22:37 ` Jonathan Nieder
0 siblings, 1 reply; 2+ messages in thread
From: Christian Couder @ 2010-07-13 23:28 UTC (permalink / raw)
To: Junio C Hamano
Cc: git, Johannes Schindelin, Sverre Rabbelier, Ramkumar Ramachandra,
Jonathan Nieder, Jeff King
"git cherry-pick foo" has always reported success with
"Finished one cherry-pick" but "cherry-pick --strategy"
does not print anything. So move the code to write that
message from do_recursive_merge() to do_cherry_pick()
so other strategies can share it.
This patch also refactors the code that prints a message
like "Automatic cherry-pick failed. <help message>". This
code was duplicated in both do_recursive_merge() and
do_pick_commit().
To do that, now do_recursive_merge() returns an int to signal
success or failure. And in case of failure we just return 1
from do_pick_commit() instead of doing "exit(1)" from either
do_recursive_merge() or do_pick_commit().
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
builtin/revert.c | 51 ++++++++++++++++++++---------------
t/t3508-cherry-pick-many-commits.sh | 26 +++++++++++++++++-
2 files changed, 54 insertions(+), 23 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 8b9d829..b082bb4 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -311,10 +311,9 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from)
return write_ref_sha1(ref_lock, to, "cherry-pick");
}
-static void do_recursive_merge(struct commit *base, struct commit *next,
- const char *base_label, const char *next_label,
- unsigned char *head, struct strbuf *msgbuf,
- char *defmsg)
+static int do_recursive_merge(struct commit *base, struct commit *next,
+ const char *base_label, const char *next_label,
+ unsigned char *head, struct strbuf *msgbuf)
{
struct merge_options o;
struct tree *result, *next_tree, *base_tree, *head_tree;
@@ -357,14 +356,9 @@ static void do_recursive_merge(struct commit *base, struct commit *next,
i++;
}
}
- write_message(msgbuf, defmsg);
- fprintf(stderr, "Automatic %s failed.%s\n",
- me, help_msg());
- rerere(allow_rerere_auto);
- exit(1);
}
- write_message(msgbuf, defmsg);
- fprintf(stderr, "Finished one %s.\n", me);
+
+ return !clean;
}
static int do_pick_commit(void)
@@ -375,6 +369,8 @@ static int do_pick_commit(void)
struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
char *defmsg = NULL;
struct strbuf msgbuf = STRBUF_INIT;
+ struct strbuf mebuf = STRBUF_INIT;
+ int res;
if (no_commit) {
/*
@@ -470,30 +466,41 @@ static int do_pick_commit(void)
}
}
- if (!strategy || !strcmp(strategy, "recursive") || action == REVERT)
- do_recursive_merge(base, next, base_label, next_label,
- head, &msgbuf, defmsg);
- else {
- int res;
+ strbuf_addstr(&mebuf, me);
+
+ if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) {
+ res = do_recursive_merge(base, next, base_label, next_label,
+ head, &msgbuf);
+ write_message(&msgbuf, defmsg);
+ } else {
struct commit_list *common = NULL;
struct commit_list *remotes = NULL;
+
+ strbuf_addf(&mebuf, " with strategy %s", strategy);
write_message(&msgbuf, defmsg);
+
commit_list_insert(base, &common);
commit_list_insert(next, &remotes);
res = try_merge_command(strategy, common,
sha1_to_hex(head), remotes);
free_commit_list(common);
free_commit_list(remotes);
- if (res) {
- fprintf(stderr, "Automatic %s with strategy %s failed.%s\n",
- me, strategy, help_msg());
- rerere(allow_rerere_auto);
- exit(1);
- }
}
+ if (res) {
+ fprintf(stderr, "Automatic %s failed.%s\n",
+ mebuf.buf, help_msg());
+ rerere(allow_rerere_auto);
+ } else {
+ fprintf(stderr, "Finished one %s.\n", mebuf.buf);
+ }
+
+ strbuf_release(&mebuf);
free_message(&msg);
+ if (res)
+ return 1;
+
/*
*
* If we are cherry-pick, and if the merge did not result in
diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh
index f90ed3d..6555f92 100755
--- a/t/t3508-cherry-pick-many-commits.sh
+++ b/t/t3508-cherry-pick-many-commits.sh
@@ -23,12 +23,36 @@ test_expect_success setup '
'
test_expect_success 'cherry-pick first..fourth works' '
+ cat <<-EOF > expected &&
+ Finished one cherry-pick.
+ Finished one cherry-pick.
+ Finished one cherry-pick.
+ EOF
+
+ git checkout -f master &&
+ git reset --hard first &&
+ test_tick &&
+ git cherry-pick first..fourth 2>actual &&
+ git diff --quiet other &&
+ git diff --quiet HEAD other &&
+ test_cmp expected actual &&
+ test "$(git rev-parse --verify HEAD)" != "$(git rev-parse --verify fourth)"
+'
+
+test_expect_success 'cherry-pick --strategy resolve first..fourth works' '
+ cat <<-EOF > expected &&
+ Finished one cherry-pick with strategy resolve.
+ Finished one cherry-pick with strategy resolve.
+ Finished one cherry-pick with strategy resolve.
+ EOF
+
git checkout -f master &&
git reset --hard first &&
test_tick &&
- git cherry-pick first..fourth &&
+ git cherry-pick --strategy resolve first..fourth 2>actual &&
git diff --quiet other &&
git diff --quiet HEAD other &&
+ test_cmp expected actual &&
test "$(git rev-parse --verify HEAD)" != "$(git rev-parse --verify fourth)"
'
--
1.7.2.rc1.215.g2dff2.dirty
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 1/4] revert: report success when using option --strategy
2010-07-13 23:28 [PATCH 1/4] revert: report success when using option --strategy Christian Couder
@ 2010-07-15 22:37 ` Jonathan Nieder
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Nieder @ 2010-07-15 22:37 UTC (permalink / raw)
To: Christian Couder
Cc: Junio C Hamano, git, Johannes Schindelin, Sverre Rabbelier,
Ramkumar Ramachandra, Jeff King
Christian Couder wrote:
> "git cherry-pick foo" has always reported success with
> "Finished one cherry-pick" but "cherry-pick --strategy"
> does not print anything.
[...]
> This patch also refactors the code that prints a message
> like "Automatic cherry-pick failed. <help message>". This
> code was duplicated in both do_recursive_merge() and
> do_pick_commit().
This is good. Nitpicks below.
> +++ b/builtin/revert.c
> diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh
> index f90ed3d..6555f92 100755
> --- a/t/t3508-cherry-pick-many-commits.sh
> +++ b/t/t3508-cherry-pick-many-commits.sh
> @@ -23,12 +23,36 @@ test_expect_success setup '
> '
>
> test_expect_success 'cherry-pick first..fourth works' '
> + cat <<-EOF > expected &&
Style:
cat <<-\EOF >expected &&
The \quoting lets reviewers skim through a message without looking
for characters that might be expanded. The decreased whitespace is
just for consistency.
> + Finished one cherry-pick.
> + Finished one cherry-pick.
> + Finished one cherry-pick.
> + EOF
> +
> + git checkout -f master &&
> + git reset --hard first &&
> + test_tick &&
> + git cherry-pick first..fourth 2>actual &&
> + git diff --quiet other &&
> + git diff --quiet HEAD other &&
> + test_cmp expected actual &&
> + test "$(git rev-parse --verify HEAD)" != "$(git rev-parse --verify fourth)"
The --verify here does not accomplish much, since the exit status of
git rev-parse is not propagated to test. So strictly speaking it
would be more robust to do something like
head=$(git rev-parse --verify HEAD) &&
fourth=$(git rev-parse --verify fourth) &&
test "$head" = "$fourth"
though I do not think it is worth changing.
With or without the following changes,
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Thanks.
---
diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh
index 6555f92..d90b365 100755
--- a/t/t3508-cherry-pick-many-commits.sh
+++ b/t/t3508-cherry-pick-many-commits.sh
@@ -23,7 +23,7 @@ test_expect_success setup '
'
test_expect_success 'cherry-pick first..fourth works' '
- cat <<-EOF > expected &&
+ cat <<-\EOF >expected &&
Finished one cherry-pick.
Finished one cherry-pick.
Finished one cherry-pick.
@@ -40,7 +40,7 @@ test_expect_success 'cherry-pick first..fourth works' '
'
test_expect_success 'cherry-pick --strategy resolve first..fourth works' '
- cat <<-EOF > expected &&
+ cat <<-\EOF >expected &&
Finished one cherry-pick with strategy resolve.
Finished one cherry-pick with strategy resolve.
Finished one cherry-pick with strategy resolve.
--
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-07-15 22:38 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-13 23:28 [PATCH 1/4] revert: report success when using option --strategy Christian Couder
2010-07-15 22:37 ` Jonathan Nieder
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).