git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Johannes Schindelin <johannes.schindelin@gmx.de>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 3/9] Prepare the builtins for a libified merge_recursive()
Date: Wed, 29 Jun 2016 11:56:21 -0700	[thread overview]
Message-ID: <xmqqziq33ju2.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <753eabc5193c148c67e64ed5d070b6ff08f51d82.1467199553.git.johannes.schindelin@gmx.de> (Johannes Schindelin's message of "Wed, 29 Jun 2016 13:36:48 +0200 (CEST)")

Johannes Schindelin <johannes.schindelin@gmx.de> writes:

> A truly libified function does not die() just for fun.

The sentence is wasting bits.  After all, a helper function in
run-once-and-exit program does not die() just for fun, either.

So what's more interesting to know for the readers?

> As such, the
> recursive merge will convert all die() calls to return -1 instead in the
> next commits, giving the caller a chance at least to print some helpful
> message.
>
> Let's prepare the builtins for this fatal error condition, even if we do
> not really do more than imitating the previous die()'s exit(128): this is
> what callers of e.g. `git merge` have come to expect.

One thing missing is your design decision and justification.

For example, the above explanation hints that the original code in
this hunk expected merge_trees() to die() with some useful message
when there is an error condition, but merge_trees() is going to be
improved not to die() itself and return -1 instead to signal an
error, so that the caller can react more flexibly, and this is a
step to prepare for the version of merge_trees() that no longer
dies.

> -			merge_trees(&o, new->commit->tree, work,
> +			ret = merge_trees(&o, new->commit->tree, work,
>  				old->commit->tree, &result);
> +			if (ret < 0)
> +				exit(128);

The postimage of the patch tells us that the caller is now
responsible for exiting with status 128, but neither the proposed
log message nor the above hunk tells us where the message the
original code must have given to the end user from die() inside
merge_trees().  The updated caller just exits, so a natural guess is
that the calls to die() have been changed to fprintf(stderr) with
the patch.

But that does not mesh very well with the stated objective of the
patch.  The callers want flexibility to do their own error handling,
including giving their own message, so letting merge_trees() to
still write the same message to the standard error stream would not
work well for them.  A caller may want to do merge_trees() just to
see if it succeeds, without wanting to give _any_ indication of that
is happening to the user, because it has an alternate/fallback code
if merge_trees() fails, for example (analogy: "am -3" first tries a
straight patch application before fallking back to 3-way merge; it
may not want to show the error from the first attempt).

The reader _can_ guess that this step ignores the error-message
issue, and improving it later (or keep ignoring that issue) might be
OK in the context of this patch series, but it is necessary to be
upfront to the readers what the design choices were and which one of
those choices the proposed patch adopted as its design for them to
be able to evaluate the patch series correctly.

One design alternative we've seen used in our code to help callers
who want no default messages is to pass struct strbuf &err down the
callchain and collect the default messages without emitting them
directly to the standard error stream when an error is diagnosed.  I
do not know if that pattern is applicable or should be applied to
this codepath.

> Note that the callers of the sequencer (revert and cherry-pick) already
> fail fast even for the return value -1; The only difference is that they
> now get a chance to say "<command> failed".
>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  builtin/checkout.c | 4 +++-
>  builtin/merge.c    | 4 ++++
>  sequencer.c        | 4 ++++
>  3 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index c3486bd..14312f7 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -567,8 +567,10 @@ static int merge_working_tree(const struct checkout_opts *opts,
>  			o.ancestor = old->name;
>  			o.branch1 = new->name;
>  			o.branch2 = "local";
> -			merge_trees(&o, new->commit->tree, work,
> +			ret = merge_trees(&o, new->commit->tree, work,
>  				old->commit->tree, &result);
> +			if (ret < 0)
> +				exit(128);
>  			ret = reset_tree(new->commit->tree, opts, 0,
>  					 writeout_error);
>  			if (ret)
> diff --git a/builtin/merge.c b/builtin/merge.c
> index b555a1b..133b853 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -682,6 +682,8 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
>  		hold_locked_index(&lock, 1);
>  		clean = merge_recursive(&o, head,
>  				remoteheads->item, reversed, &result);
> +		if (clean < 0)
> +			exit(128);
>  		if (active_cache_changed &&
>  		    write_locked_index(&the_index, &lock, COMMIT_LOCK))
>  			die (_("unable to write %s"), get_index_file());
> @@ -1550,6 +1552,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
>  		ret = try_merge_strategy(use_strategies[i]->name,
>  					 common, remoteheads,
>  					 head_commit, head_arg);
> +		if (ret < 0)
> +			exit(128);
>  		if (!option_commit && !ret) {
>  			merge_was_ok = 1;
>  			/*
> diff --git a/sequencer.c b/sequencer.c
> index c6362d6..13b794a 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -293,6 +293,8 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
>  	clean = merge_trees(&o,
>  			    head_tree,
>  			    next_tree, base_tree, &result);
> +	if (clean < 0)
> +		return clean;
>  
>  	if (active_cache_changed &&
>  	    write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
> @@ -561,6 +563,8 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
>  	if (!opts->strategy || !strcmp(opts->strategy, "recursive") || opts->action == REPLAY_REVERT) {
>  		res = do_recursive_merge(base, next, base_label, next_label,
>  					 head, &msgbuf, opts);
> +		if (res < 0)
> +			return res;
>  		write_message(&msgbuf, git_path_merge_msg());
>  	} else {
>  		struct commit_list *common = NULL;

  reply	other threads:[~2016-06-29 19:04 UTC|newest]

Thread overview: 262+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-29 11:36 [PATCH 0/9] Use merge_recursive() directly in the builtin am Johannes Schindelin
2016-06-29 11:36 ` [PATCH 1/9] Report bugs consistently Johannes Schindelin
2016-06-29 15:11   ` Johannes Schindelin
2016-06-29 18:12   ` Eric Sunshine
2016-06-30  8:41     ` Johannes Schindelin
2016-06-29 20:50   ` Junio C Hamano
2016-06-30  8:42     ` Johannes Schindelin
2016-06-30  9:23       ` Jeff King
2016-07-01 13:51         ` Johannes Schindelin
2016-07-01 18:16           ` Jeff King
2016-06-30  5:38   ` Johannes Sixt
2016-06-30  8:45     ` Johannes Schindelin
2016-07-02  5:11   ` Duy Nguyen
2016-07-02  7:25     ` Johannes Schindelin
2016-07-02  8:01       ` Duy Nguyen
2016-07-05 11:32         ` Johannes Schindelin
2016-06-29 11:36 ` [PATCH 2/9] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-06-29 18:35   ` Junio C Hamano
2016-07-01  9:23     ` Johannes Schindelin
2016-07-01 15:31       ` Junio C Hamano
2016-07-02  7:20         ` Johannes Schindelin
2016-07-06 15:30           ` Junio C Hamano
2016-07-07 11:17             ` Johannes Schindelin
2016-06-29 11:36 ` [PATCH 3/9] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-06-29 18:56   ` Junio C Hamano [this message]
2016-07-01 10:14     ` Johannes Schindelin
2016-07-01 15:43       ` Junio C Hamano
2016-07-02  7:24         ` Johannes Schindelin
2016-06-29 11:36 ` [PATCH 4/9] merge_recursive: abort properly upon errors Johannes Schindelin
2016-06-29 20:08   ` Junio C Hamano
2016-07-01 10:16     ` Johannes Schindelin
2016-07-01 15:56       ` Junio C Hamano
2016-07-02 11:30         ` Johannes Schindelin
2016-06-29 11:36 ` [PATCH 5/9] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-06-29 20:21   ` Junio C Hamano
2016-07-01 13:48     ` Johannes Schindelin
2016-07-01 15:02       ` Eric Wong
2016-06-29 11:37 ` [PATCH 6/9] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-06-29 11:37 ` [PATCH 7/9] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-06-29 21:06   ` Junio C Hamano
2016-07-01 11:08     ` Johannes Schindelin
2016-06-29 11:37 ` [PATCH 8/9] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-06-29 21:19   ` Junio C Hamano
2016-07-01 11:14     ` Johannes Schindelin
2016-06-29 11:38 ` [PATCH 9/9] am: make a direct call to merge_recursive Johannes Schindelin
2016-06-29 17:45   ` Junio C Hamano
2016-06-30  8:38     ` Johannes Schindelin
2016-07-01 16:03       ` Junio C Hamano
2016-06-29 21:23   ` Junio C Hamano
2016-07-01 12:46     ` Johannes Schindelin
2016-07-05 11:22 ` [PATCH v2 00/17] Use merge_recursive() directly in the builtin am Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 01/17] Verify that `git pull --rebase` shows the helpful advice when failing Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 02/17] Report bugs consistently Johannes Schindelin
2016-07-05 13:05     ` Jakub Narębski
2016-07-05 13:38       ` Johannes Schindelin
2016-07-06 15:30     ` Duy Nguyen
2016-07-07 11:23       ` Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 03/17] Avoid translating bug messages Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 04/17] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 05/17] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 06/17] merge_recursive: abort properly upon errors Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 07/17] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 08/17] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 09/17] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 10/17] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-07-05 11:23   ` [PATCH v2 11/17] am: counteract gender bias Johannes Schindelin
2016-07-06 21:22     ` Junio C Hamano
2016-07-07 11:30       ` Johannes Schindelin
2016-07-07 15:26         ` Junio C Hamano
2016-07-07 15:54           ` Johannes Schindelin
2016-07-07 16:03             ` Junio C Hamano
2016-07-05 11:24   ` [PATCH v2 12/17] am -3: use merge_recursive() directly again Johannes Schindelin
2016-07-05 11:24   ` [PATCH v2 13/17] merge-recursive: flush output buffer before printing error messages Johannes Schindelin
2016-07-05 11:24   ` [PATCH v2 14/17] merge-recursive: write the commit title in one go Johannes Schindelin
2016-07-05 11:24   ` [PATCH v2 15/17] merge-recursive: offer an option to retain the output in 'obuf' Johannes Schindelin
2016-07-05 11:24   ` [PATCH v2 16/17] Ensure that the output buffer is released after calling merge_trees() Johannes Schindelin
2016-07-05 11:24   ` [PATCH v2 17/17] merge-recursive: flush output buffer even when erroring out Johannes Schindelin
2016-07-06 21:26   ` [PATCH v2 00/17] Use merge_recursive() directly in the builtin am Junio C Hamano
2016-07-07 11:16     ` Johannes Schindelin
2016-07-07 14:35   ` [PATCH v3 00/16] " Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 01/16] Verify that `git pull --rebase` shows the helpful advice when failing Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 02/16] Report bugs consistently Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 03/16] Avoid translating bug messages Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 04/16] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 05/16] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 06/16] merge_recursive: abort properly upon errors Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 07/16] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 08/16] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 09/16] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 10/16] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-07-07 14:35     ` [PATCH v3 11/16] am -3: use merge_recursive() directly again Johannes Schindelin
2016-07-07 14:36     ` [PATCH v3 12/16] merge-recursive: flush output buffer before printing error messages Johannes Schindelin
2016-07-07 14:36     ` [PATCH v3 13/16] merge-recursive: write the commit title in one go Johannes Schindelin
2016-07-07 14:36     ` [PATCH v3 14/16] merge-recursive: offer an option to retain the output in 'obuf' Johannes Schindelin
2016-07-07 14:36     ` [PATCH v3 15/16] Ensure that the output buffer is released after calling merge_trees() Johannes Schindelin
2016-07-07 14:36     ` [PATCH v3 16/16] merge-recursive: flush output buffer even when erroring out Johannes Schindelin
2016-07-12 21:27     ` [PATCH v3 00/16] Use merge_recursive() directly in the builtin am Junio C Hamano
2016-07-14 14:03       ` Johannes Schindelin
2016-07-14 19:39         ` Junio C Hamano
2016-07-19  0:17           ` Junio C Hamano
2016-07-19 12:31             ` Johannes Schindelin
2016-07-19 14:28               ` Johannes Schindelin
2016-07-19 19:33                 ` Junio C Hamano
2016-07-22 12:23     ` [PATCH v4 " Johannes Schindelin
2016-07-22 12:24       ` [PATCH v4 01/16] Verify that `git pull --rebase` shows the helpful advice when failing Johannes Schindelin
2016-07-25 21:39         ` Junio C Hamano
2016-07-26 12:21           ` Johannes Schindelin
2016-07-22 12:24       ` [PATCH v4 02/16] Report bugs consistently Johannes Schindelin
2016-07-25 21:44         ` Junio C Hamano
2016-07-25 22:17           ` Jeff King
2016-07-25 22:36             ` Junio C Hamano
2016-07-26 12:24               ` Johannes Schindelin
2016-07-22 12:24       ` [PATCH v4 03/16] Avoid translating bug messages Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 04/16] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 05/16] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 06/16] merge_recursive: abort properly upon errors Johannes Schindelin
2016-07-25 22:09         ` Junio C Hamano
2016-07-26 12:26           ` Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 07/16] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 08/16] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 09/16] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 10/16] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 11/16] am -3: use merge_recursive() directly again Johannes Schindelin
2016-07-25 22:19         ` Junio C Hamano
2016-07-26 12:30           ` Johannes Schindelin
2016-07-26 17:12             ` Junio C Hamano
2016-07-22 12:25       ` [PATCH v4 12/16] merge-recursive: flush output buffer before printing error messages Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 13/16] merge-recursive: write the commit title in one go Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 14/16] merge-recursive: offer an option to retain the output in 'obuf' Johannes Schindelin
2016-07-22 12:25       ` [PATCH v4 15/16] Ensure that the output buffer is released after calling merge_trees() Johannes Schindelin
2016-07-22 12:26       ` [PATCH v4 16/16] merge-recursive: flush output buffer even when erroring out Johannes Schindelin
2016-07-26 16:05       ` [PATCH v5 00/16] Use merge_recursive() directly in the builtin am Johannes Schindelin
2016-07-26 16:05         ` [PATCH v5 01/16] t5520: verify that `pull --rebase` shows the helpful advice when failing Johannes Schindelin
2016-07-26 16:05         ` [PATCH v5 02/16] Report bugs consistently Johannes Schindelin
2016-07-26 16:05         ` [PATCH v5 03/16] Avoid translating bug messages Johannes Schindelin
2016-07-26 16:05         ` [PATCH v5 04/16] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 05/16] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 06/16] merge_recursive: abort properly upon errors Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 07/16] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 08/16] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 09/16] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 10/16] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 11/16] am -3: use merge_recursive() directly again Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 12/16] merge-recursive: flush output buffer before printing error messages Johannes Schindelin
2016-07-27 21:37           ` Junio C Hamano
2016-07-27 21:53             ` Junio C Hamano
2016-08-01  9:18             ` Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 13/16] merge-recursive: write the commit title in one go Johannes Schindelin
2016-07-27 22:36           ` Junio C Hamano
2016-08-01  9:53             ` Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 14/16] merge-recursive: offer an option to retain the output in 'obuf' Johannes Schindelin
2016-07-27 22:09           ` Junio C Hamano
2016-07-28  0:17             ` Junio C Hamano
2016-08-01  9:34               ` Johannes Schindelin
2016-08-01 19:09                 ` Junio C Hamano
2016-08-02  8:01                   ` Johannes Schindelin
2016-08-02 21:19                     ` Junio C Hamano
2016-08-01  9:35             ` Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 15/16] Ensure that the output buffer is released after calling merge_trees() Johannes Schindelin
2016-07-27 22:15           ` Junio C Hamano
2016-08-01  9:40             ` Johannes Schindelin
2016-07-26 16:06         ` [PATCH v5 16/16] merge-recursive: flush output buffer even when erroring out Johannes Schindelin
2016-07-27 22:20           ` Junio C Hamano
2016-08-01  9:49             ` Johannes Schindelin
2016-08-01 18:32               ` Junio C Hamano
2016-08-01 11:36         ` [PATCH v6 00/16] Use merge_recursive() directly in the builtin am Johannes Schindelin
2016-08-01 11:36           ` [PATCH v6 01/16] t5520: verify that `pull --rebase` shows the helpful advice when failing Johannes Schindelin
2016-08-01 11:36           ` [PATCH v6 02/16] Report bugs consistently Johannes Schindelin
2016-08-01 11:43           ` [PATCH v6 03/16] Avoid translating bug messages Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 04/16] merge-recursive: clarify code in was_tracked() Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 05/16] Prepare the builtins for a libified merge_recursive() Johannes Schindelin
2016-08-01 18:40             ` Junio C Hamano
2016-08-02  8:02               ` Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 06/16] merge_recursive: abort properly upon errors Johannes Schindelin
2016-08-01 18:41             ` Junio C Hamano
2016-08-02  8:12               ` Johannes Schindelin
2016-08-02 21:26                 ` Junio C Hamano
2016-08-03 11:59                   ` patch submission process, was " Johannes Schindelin
2016-08-03 15:33                     ` Junio C Hamano
2016-08-03 16:07                       ` Johannes Schindelin
2016-08-03 17:47                         ` Stefan Beller
2016-08-04 15:58                           ` Johannes Schindelin
2016-08-04 16:42                             ` Stefan Beller
2016-08-04 20:17                               ` Eric Wong
2016-08-05  8:24                                 ` Johannes Schindelin
2016-08-05  8:50                                   ` Eric Wong
2016-08-05  8:20                               ` Johannes Schindelin
2016-08-05 17:59                                 ` Stefan Beller
2016-08-05 19:21                                   ` Josh Triplett
2016-08-05 21:01                                   ` Eric Wong
2016-08-06  8:58                                   ` Johannes Schindelin
2016-08-06 18:33                                     ` Junio C Hamano
2016-08-06 21:43                                       ` Eric Wong
2016-08-07  8:46                                         ` Johannes Schindelin
2016-08-08 17:22                                           ` Junio C Hamano
2016-08-09 11:48                                             ` Johannes Schindelin
2016-08-07 11:09                                     ` Lars Schneider
2016-08-08 17:29                                       ` Junio C Hamano
2016-08-09 11:41                                         ` Johannes Schindelin
2016-08-09 17:25                                           ` Junio C Hamano
2016-08-05 18:46                                 ` Eric Wong
2016-08-06  8:44                                   ` Johannes Schindelin
2016-08-05 11:59                               ` Richard Ipsum
2016-08-05 15:24                                 ` Johannes Schindelin
2016-08-06 16:45                                   ` Richard Ipsum
2016-08-08 22:20                             ` Michael Haggerty
2016-08-08 22:36                               ` Junio C Hamano
2016-08-08 23:20                                 ` Michael Haggerty
2016-08-09  8:11                                   ` Michael J Gruber
2016-08-09 10:57                                     ` Jeff King
2016-08-10  0:46                                       ` Josh Triplett
2016-08-09 11:37                                   ` Jeff King
2016-08-09 17:34                                     ` Junio C Hamano
2016-08-09 17:50                                       ` Jeff King
2016-08-09 19:19                                         ` Junio C Hamano
2016-08-09 18:43                                     ` Duy Nguyen
2016-08-09 18:50                                       ` Stefan Beller
2016-08-09 18:58                                         ` Jeff King
2016-08-09 18:55                                       ` Jeff King
2016-08-09 18:36                                   ` Duy Nguyen
2016-08-09 18:38                                     ` Duy Nguyen
2016-08-09  4:22                               ` Duy Nguyen
2016-08-09  9:17                                 ` Richard Ipsum
2016-08-09 10:34                                   ` Jeff King
2016-08-09 10:19                                 ` Michael Haggerty
2016-08-09 12:07                               ` Johannes Schindelin
2016-08-09 18:28                               ` Eric Wong
2016-08-10  0:55                                 ` Josh Triplett
2016-08-10  1:57                                   ` Eric Wong
2016-08-10  7:30                                   ` Jakub Narębski
2016-08-10 19:30                                     ` Josh Triplett
2016-08-10 21:14                                       ` Junio C Hamano
2016-08-05 14:55                         ` Duy Nguyen
2016-08-05 15:13                           ` Johannes Schindelin
2016-08-05 18:42                           ` Philip Oakley
2016-08-06  8:38                             ` Johannes Schindelin
2016-08-06 17:45                               ` Philip Oakley
2016-08-03 16:34                       ` Jeff King
2016-08-03 16:53                         ` Junio C Hamano
2016-08-03 16:56                           ` Jeff King
2016-08-04 15:29                             ` Johannes Schindelin
2016-08-04 18:07                               ` Jeff King
2016-08-04 21:12                                 ` Junio C Hamano
2016-08-05  8:17                                   ` Jeff King
2016-08-05 15:51                                   ` Johannes Schindelin
2016-08-02 22:28                 ` Junio C Hamano
2016-08-01 11:44           ` [PATCH v6 07/16] merge-recursive: avoid returning a wholesale struct Johannes Schindelin
2016-08-04 18:09             ` Junio C Hamano
2016-08-01 11:44           ` [PATCH v6 08/16] merge-recursive: allow write_tree_from_memory() to error out Johannes Schindelin
2016-08-04 18:14             ` Junio C Hamano
2016-08-01 11:44           ` [PATCH v6 09/16] merge-recursive: handle return values indicating errors Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 10/16] merge-recursive: switch to returning errors instead of dying Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 11/16] am -3: use merge_recursive() directly again Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 12/16] merge-recursive: flush output buffer before printing error messages Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 13/16] merge-recursive: write the commit title in one go Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 14/16] merge-recursive: offer an option to retain the output in 'obuf' Johannes Schindelin
2016-08-01 11:44           ` [PATCH v6 15/16] Ensure that the output buffer is released after calling merge_trees() Johannes Schindelin
2016-08-04 18:18             ` Junio C Hamano
2016-08-01 11:44           ` [PATCH v6 16/16] merge-recursive: flush output buffer even when erroring out Johannes Schindelin
2016-08-04 18:20             ` Junio C Hamano
2016-08-05 15:41               ` Johannes Schindelin
2016-08-06 16:37                 ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqziq33ju2.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=johannes.schindelin@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).