From 08353ebbab2dfdee50a6daa616ec8b6483cb07c8 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Wed, 11 Aug 2010 10:38:04 +0200 Subject: Turn unpack_trees_options.msgs into an array + enum The list of error messages was introduced as a structure, but an array indexed over an enum is more flexible, since it allows one to store a type of error message (index in the array) in a variable. This change needs to rename would_lose_untracked -> would_lose_untracked_file to avoid a clash with the function would_lose_untracked in merge-recursive.c. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- merge-recursive.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) (limited to 'merge-recursive.c') diff --git a/merge-recursive.c b/merge-recursive.c index fb6aa4a551..d3bd963890 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -185,7 +185,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 = get_porcelain_error_msgs(); + set_porcelain_error_msgs(opts.msgs); init_tree_desc_from_tree(t+0, common); init_tree_desc_from_tree(t+1, head); @@ -1178,26 +1178,19 @@ static int process_entry(struct merge_options *o, return clean_merge; } -struct unpack_trees_error_msgs get_porcelain_error_msgs(void) +void set_porcelain_error_msgs(const char **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 = + if (advice_commit_before_merge) + msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_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; + else + msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] = + "Your local changes to '%s' would be overwritten by merge. Aborting."; + msgs[ERROR_NOT_UPTODATE_DIR] = + "Updating '%s' would lose untracked files in it. Aborting."; + msgs[ERROR_WOULD_LOSE_UNTRACKED] = + "Untracked working tree file '%s' would be %s by merge. Aborting"; } int merge_trees(struct merge_options *o, -- cgit v1.2.1 From 23cbf11b5c08c6d0ab0fd0d6f2dc5a32ca31c745 Mon Sep 17 00:00:00 2001 From: Diane Gasselin Date: Wed, 11 Aug 2010 10:38:05 +0200 Subject: merge-recursive: porcelain messages for checkout A porcelain message was first added in checkout.c in the commit 8ccba008 (Junio C Hamano, Sat May 17 21:03:49 2008, unpack-trees: allow Porcelain to give different error messages) to give better feedback in the case of merge errors. This patch adapts the porcelain messages for the case of checkout instead. This way, when having a checkout error, "merge" no longer appears in the error message. While we're there, we add an advice in the case of would_lose_untracked_file. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- merge-recursive.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'merge-recursive.c') diff --git a/merge-recursive.c b/merge-recursive.c index d3bd963890..b1e526b0d8 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -185,7 +185,7 @@ static int git_merge_trees(int index_only, opts.fn = threeway_merge; opts.src_index = &the_index; opts.dst_index = &the_index; - set_porcelain_error_msgs(opts.msgs); + set_porcelain_error_msgs(opts.msgs, "merge"); init_tree_desc_from_tree(t+0, common); init_tree_desc_from_tree(t+1, head); @@ -1178,19 +1178,32 @@ static int process_entry(struct merge_options *o, return clean_merge; } -void set_porcelain_error_msgs(const char **msgs) +void set_porcelain_error_msgs(const char **msgs, const char *cmd) { + const char *msg; + char *tmp; + const char *cmd2 = strcmp(cmd, "checkout") ? cmd : "switch branches"; if (advice_commit_before_merge) - msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_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."; + msg = "Your local changes to '%%s' would be overwritten by %s. Aborting.\n" + "Please, commit your changes or stash them before you can %s."; else - msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] = - "Your local changes to '%s' would be overwritten by merge. Aborting."; + msg = "Your local changes to '%%s' would be overwritten by %s. Aborting."; + tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 3); + sprintf(tmp, msg, cmd, cmd2); + msgs[ERROR_WOULD_OVERWRITE] = tmp; + msgs[ERROR_NOT_UPTODATE_FILE] = tmp; + msgs[ERROR_NOT_UPTODATE_DIR] = "Updating '%s' would lose untracked files in it. Aborting."; - msgs[ERROR_WOULD_LOSE_UNTRACKED] = - "Untracked working tree file '%s' would be %s by merge. Aborting"; + + if (advice_commit_before_merge) + msg = "Untracked working tree file '%%s' would be %%s by %s. Aborting" + "Please move or remove them before you can %s."; + else + msg = "Untracked working tree file '%%s' would be %%s by %s. Aborting"; + tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 3); + sprintf(tmp, msg, cmd, cmd2); + msgs[ERROR_WOULD_LOSE_UNTRACKED] = tmp; } int merge_trees(struct merge_options *o, -- cgit v1.2.1 From 08402b0409bc501deb97cf4388a78ee9f87092c6 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Wed, 11 Aug 2010 10:38:06 +0200 Subject: merge-recursive: distinguish "removed" and "overwritten" messages To limit the number of possible error messages, the error messages for the case would_lose_untracked_file and would_lose_orphaned in unpack_trees_options.msgs were handled with a single string, parameterized by an action string ("overwritten" or "removed"). Instead, we consider them as two different cases, with unparameterized string. This will make it easier to make separate lists sorted by error types later. Only the bind_overlap case still takes two %s parameters, but that's unavoidable. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- merge-recursive.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'merge-recursive.c') diff --git a/merge-recursive.c b/merge-recursive.c index b1e526b0d8..697d948e85 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1197,13 +1197,16 @@ void set_porcelain_error_msgs(const char **msgs, const char *cmd) "Updating '%s' would lose untracked files in it. Aborting."; if (advice_commit_before_merge) - msg = "Untracked working tree file '%%s' would be %%s by %s. Aborting" + msg = "Untracked working tree file '%%s' would be %s by %s. Aborting" "Please move or remove them before you can %s."; else - msg = "Untracked working tree file '%%s' would be %%s by %s. Aborting"; - tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 3); - sprintf(tmp, msg, cmd, cmd2); - msgs[ERROR_WOULD_LOSE_UNTRACKED] = tmp; + msg = "Untracked working tree file '%%s' would be %s by %s. Aborting"; + tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("removed") + strlen(cmd2) - 4); + sprintf(tmp, msg, "removed", cmd, cmd2); + msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = tmp; + tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("overwritten") + strlen(cmd2) - 4); + sprintf(tmp, msg, "overwritten", cmd, cmd2); + msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = tmp; } int merge_trees(struct merge_options *o, -- cgit v1.2.1 From e6c111b4c092c0dd24c541b9721f5bc04641dcb0 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Wed, 11 Aug 2010 10:38:07 +0200 Subject: unpack_trees: group error messages by type When an error is encountered, it calls add_rejected_file() which either - directly displays the error message and stops if in plumbing mode (i.e. if show_all_errors is not initialized at 1) - or stores it so that it will be displayed at the end with display_error_msgs(), Storing the files by error type permits to have a list of files for which there is the same error instead of having a serie of almost identical errors. As each bind_overlap error combines a file and an old file, a list cannot be done, therefore, theses errors are not stored but directly displayed. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- merge-recursive.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'merge-recursive.c') diff --git a/merge-recursive.c b/merge-recursive.c index 697d948e85..10392d9661 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1184,29 +1184,42 @@ void set_porcelain_error_msgs(const char **msgs, const char *cmd) char *tmp; const char *cmd2 = strcmp(cmd, "checkout") ? cmd : "switch branches"; if (advice_commit_before_merge) - msg = "Your local changes to '%%s' would be overwritten by %s. Aborting.\n" + msg = "Your local changes to the following files would be overwritten by %s:\n%%s" "Please, commit your changes or stash them before you can %s."; else - msg = "Your local changes to '%%s' would be overwritten by %s. Aborting."; - tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 3); + msg = "Your local changes to the following files would be overwritten by %s:\n%%s"; + tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 2); sprintf(tmp, msg, cmd, cmd2); msgs[ERROR_WOULD_OVERWRITE] = tmp; msgs[ERROR_NOT_UPTODATE_FILE] = tmp; msgs[ERROR_NOT_UPTODATE_DIR] = - "Updating '%s' would lose untracked files in it. Aborting."; + "Updating the following directories would lose untracked files in it:\n%s"; if (advice_commit_before_merge) - msg = "Untracked working tree file '%%s' would be %s by %s. Aborting" + msg = "The following untracked working tree files would be %s by %s:\n%%s" "Please move or remove them before you can %s."; else - msg = "Untracked working tree file '%%s' would be %s by %s. Aborting"; + msg = "The following untracked working tree files would be %s by %s:\n%%s"; tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("removed") + strlen(cmd2) - 4); sprintf(tmp, msg, "removed", cmd, cmd2); msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = tmp; tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("overwritten") + strlen(cmd2) - 4); sprintf(tmp, msg, "overwritten", cmd, cmd2); msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = tmp; + + /* + * Special case: ERROR_BIND_OVERLAP refers to a pair of paths, we + * cannot easily display it as a list. + */ + msgs[ERROR_BIND_OVERLAP] = "Entry '%s' overlaps with '%s'. Cannot bind."; + + msgs[ERROR_SPARSE_NOT_UPTODATE_FILE] = + "Cannot update sparse checkout: the following entries are not up-to-date:\n%s"; + msgs[ERROR_WOULD_LOSE_ORPHANED_OVERWRITTEN] = + "The following Working tree files would be overwritten by sparse checkout update:\n%s"; + msgs[ERROR_WOULD_LOSE_ORPHANED_REMOVED] = + "The following Working tree files would be removed by sparse checkout update:\n%s"; } int merge_trees(struct merge_options *o, -- cgit v1.2.1