* [PATCH 0/2] User-friendly error messages for merge failure on fast-forward. @ 2009-11-29 12:18 Matthieu Moy 2009-11-29 12:18 ` [PATCH 1/2] merge-recursive: make the error-message generation an extern function Matthieu Moy 2009-11-29 12:18 ` [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too Matthieu Moy 0 siblings, 2 replies; 5+ messages in thread From: Matthieu Moy @ 2009-11-29 12:18 UTC (permalink / raw) To: git; +Cc: Matthieu Moy I noticed that failures of fast-forward merges were still using the plumbing error message: $ git merge master Updating 1fdeef9..e248dad error: Entry 'foo.txt' not uptodate. Cannot merge. I'm not 100% sure that my patch doesn't trigger the porcelain behavior for plumbing. Someone more familiar than me with the codebase should confirm/infirm this. Matthieu Moy (2): merge-recursive: make the error-message generation an extern function builtin-merge: show user-friendly error messages for fast-forward too. builtin-merge.c | 1 + merge-recursive.c | 41 +++++++++++++++++++++++------------------ merge-recursive.h | 3 +++ 3 files changed, 27 insertions(+), 18 deletions(-) ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] merge-recursive: make the error-message generation an extern function 2009-11-29 12:18 [PATCH 0/2] User-friendly error messages for merge failure on fast-forward Matthieu Moy @ 2009-11-29 12:18 ` Matthieu Moy 2009-11-29 12:18 ` [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too Matthieu Moy 1 sibling, 0 replies; 5+ messages in thread From: Matthieu Moy @ 2009-11-29 12:18 UTC (permalink / raw) To: git; +Cc: Matthieu Moy The construction of the struct unpack_trees_error_msgs was done within git_merge_trees(), which prevented using the same messages easily from another function. Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> --- merge-recursive.c | 41 +++++++++++++++++++++++------------------ merge-recursive.h | 3 +++ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/merge-recursive.c b/merge-recursive.c index a91208f..70cd6cc 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -172,23 +172,6 @@ static int git_merge_trees(int index_only, int rc; struct tree_desc t[3]; struct unpack_trees_options opts; - struct unpack_trees_error_msgs msgs = { - /* would_overwrite */ - "Your local changes to '%s' would be overwritten by merge. Aborting.", - /* not_uptodate_file */ - "Your local changes to '%s' would be overwritten by merge. Aborting.", - /* not_uptodate_dir */ - "Updating '%s' would lose untracked files in it. Aborting.", - /* would_lose_untracked */ - "Untracked working tree file '%s' would be %s by merge. Aborting", - /* bind_overlap -- will not happen here */ - NULL, - }; - if (advice_commit_before_merge) { - msgs.would_overwrite = msgs.not_uptodate_file = - "Your local changes to '%s' would be overwritten by merge. Aborting.\n" - "Please, commit your changes or stash them before you can merge."; - } memset(&opts, 0, sizeof(opts)); if (index_only) @@ -200,7 +183,7 @@ static int git_merge_trees(int index_only, opts.fn = threeway_merge; opts.src_index = &the_index; opts.dst_index = &the_index; - opts.msgs = msgs; + opts.msgs = get_porcelain_error_msgs(); init_tree_desc_from_tree(t+0, common); init_tree_desc_from_tree(t+1, head); @@ -1188,6 +1171,28 @@ static int process_entry(struct merge_options *o, return clean_merge; } +struct unpack_trees_error_msgs get_porcelain_error_msgs() +{ + struct unpack_trees_error_msgs msgs = { + /* would_overwrite */ + "Your local changes to '%s' would be overwritten by merge. Aborting.", + /* not_uptodate_file */ + "Your local changes to '%s' would be overwritten by merge. Aborting.", + /* not_uptodate_dir */ + "Updating '%s' would lose untracked files in it. Aborting.", + /* would_lose_untracked */ + "Untracked working tree file '%s' would be %s by merge. Aborting", + /* bind_overlap -- will not happen here */ + NULL, + }; + if (advice_commit_before_merge) { + msgs.would_overwrite = msgs.not_uptodate_file = + "Your local changes to '%s' would be overwritten by merge. Aborting.\n" + "Please, commit your changes or stash them before you can merge."; + } + return msgs; +} + int merge_trees(struct merge_options *o, struct tree *head, struct tree *merge, diff --git a/merge-recursive.h b/merge-recursive.h index fd138ca..f4b7f57 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -17,6 +17,9 @@ struct merge_options { struct string_list current_directory_set; }; +/* Return a list of user-friendly error messages to be used by merge */ +struct unpack_trees_error_msgs get_porcelain_error_msgs(); + /* merge_trees() but with recursive ancestor consolidation */ int merge_recursive(struct merge_options *o, struct commit *h1, -- 1.6.5.3.435.g5f2e3.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too. 2009-11-29 12:18 [PATCH 0/2] User-friendly error messages for merge failure on fast-forward Matthieu Moy 2009-11-29 12:18 ` [PATCH 1/2] merge-recursive: make the error-message generation an extern function Matthieu Moy @ 2009-11-29 12:18 ` Matthieu Moy 2009-11-30 2:23 ` Junio C Hamano 1 sibling, 1 reply; 5+ messages in thread From: Matthieu Moy @ 2009-11-29 12:18 UTC (permalink / raw) To: git; +Cc: Matthieu Moy fadd069d03 (merge-recursive: give less scary messages when merge did not start, Sep 7 2009) introduced some friendlier error message for merge failure, but the messages were shown only for non-fast forward merges. This patch uses the same for fast-forward. Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> --- This is where I'm not 100% sure I'm not breaking some plumbing. builtin-merge.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/builtin-merge.c b/builtin-merge.c index 57eedd4..0dd363f 100644 --- a/builtin-merge.c +++ b/builtin-merge.c @@ -656,6 +656,7 @@ static int checkout_fast_forward(unsigned char *head, unsigned char *remote) opts.verbose_update = 1; opts.merge = 1; opts.fn = twoway_merge; + opts.msgs = get_porcelain_error_msgs(); trees[nr_trees] = parse_tree_indirect(head); if (!trees[nr_trees++]) -- 1.6.5.3.435.g5f2e3.dirty ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too. 2009-11-29 12:18 ` [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too Matthieu Moy @ 2009-11-30 2:23 ` Junio C Hamano 2009-11-30 8:42 ` Matthieu Moy 0 siblings, 1 reply; 5+ messages in thread From: Junio C Hamano @ 2009-11-30 2:23 UTC (permalink / raw) To: Matthieu Moy; +Cc: git Matthieu Moy <Matthieu.Moy@imag.fr> writes: > This is where I'm not 100% sure I'm not breaking some plumbing. I think this change is safe for the current codebase, as the only caller of checkout_fast_forward() is cmd_merge(), which is an implementation of "git merge". Even if there were a plumbing implementation that internally runs "git merge", either by calling cmd_merge() or via run_command() interface (there isn't as far as I know), or if somebody adds such a thing in the future, such a "plumbing" will get Porcelain messages from other codepaths in cmd_merge() anyway. You are not introducing a new problem. Or did you have something a lot more subtle in mind? Side note. checkout_fast_forward() switches between two commits (the one that matches HEAD) to another (given as remote), which is the same as what "git checkout other-branch" and "git checkout -b new-branch" do. We might want to replace it with the main part of merge_working_tree() from builtin-checkout.c eventually, which would teach the "checkout -m" logic that carries the local changes forward to fast-forward of "git merge". > builtin-merge.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/builtin-merge.c b/builtin-merge.c > index 57eedd4..0dd363f 100644 > --- a/builtin-merge.c > +++ b/builtin-merge.c > @@ -656,6 +656,7 @@ static int checkout_fast_forward(unsigned char *head, unsigned char *remote) > opts.verbose_update = 1; > opts.merge = 1; > opts.fn = twoway_merge; > + opts.msgs = get_porcelain_error_msgs(); > > trees[nr_trees] = parse_tree_indirect(head); > if (!trees[nr_trees++]) ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too. 2009-11-30 2:23 ` Junio C Hamano @ 2009-11-30 8:42 ` Matthieu Moy 0 siblings, 0 replies; 5+ messages in thread From: Matthieu Moy @ 2009-11-30 8:42 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > Matthieu Moy <Matthieu.Moy@imag.fr> writes: > >> This is where I'm not 100% sure I'm not breaking some plumbing. > > I think this change is safe [...] > > Or did you have something a lot more subtle in mind? Not at all. But since I found the place to add my code more or less randomly with gdb, I feel safer with your comment ;-). Thanks, -- Matthieu Moy http://www-verimag.imag.fr/~moy/ ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-11-30 8:43 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-11-29 12:18 [PATCH 0/2] User-friendly error messages for merge failure on fast-forward Matthieu Moy 2009-11-29 12:18 ` [PATCH 1/2] merge-recursive: make the error-message generation an extern function Matthieu Moy 2009-11-29 12:18 ` [RFC/PATCH 2/2] builtin-merge: show user-friendly error messages for fast-forward too Matthieu Moy 2009-11-30 2:23 ` Junio C Hamano 2009-11-30 8:42 ` Matthieu Moy
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).