From 08353ebbab2dfdee50a6daa616ec8b6483cb07c8 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Wed, 11 Aug 2010 10:38:04 +0200 Subject: [PATCH] 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 --- builtin/checkout.c | 2 +- builtin/merge.c | 2 +- merge-recursive.c | 29 +++++++++++------------------ merge-recursive.h | 4 ++-- unpack-trees.c | 42 +++++++++++++++++++++--------------------- unpack-trees.h | 19 ++++++++++--------- 6 files changed, 46 insertions(+), 52 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index 1994be92c..7d1706e0f 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -373,7 +373,7 @@ static int merge_working_tree(struct checkout_opts *opts, topts.src_index = &the_index; topts.dst_index = &the_index; - topts.msgs.not_uptodate_file = "You have local changes to '%s'; cannot switch branches."; + topts.msgs[ERROR_NOT_UPTODATE_FILE] = "You have local changes to '%s'; cannot switch branches."; refresh_cache(REFRESH_QUIET); diff --git a/builtin/merge.c b/builtin/merge.c index 37ce4f589..115a28854 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -704,7 +704,7 @@ int checkout_fast_forward(const unsigned char *head, const unsigned char *remote opts.verbose_update = 1; opts.merge = 1; opts.fn = twoway_merge; - opts.msgs = get_porcelain_error_msgs(); + set_porcelain_error_msgs(opts.msgs); trees[nr_trees] = parse_tree_indirect(head); if (!trees[nr_trees++]) diff --git a/merge-recursive.c b/merge-recursive.c index fb6aa4a55..d3bd96389 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, diff --git a/merge-recursive.h b/merge-recursive.h index b831293b3..8412db87e 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -23,8 +23,8 @@ 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(void); +/* Sets the list of user-friendly error messages to be used by merge */ +void set_porcelain_error_msgs(const char **msgs); /* merge_trees() but with recursive ancestor consolidation */ int merge_recursive(struct merge_options *o, diff --git a/unpack-trees.c b/unpack-trees.c index 8cf0da317..304e59a5b 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -13,37 +13,37 @@ * Error messages expected by scripts out of plumbing commands such as * read-tree. Non-scripted Porcelain is not required to use these messages * and in fact are encouraged to reword them to better suit their particular - * situation better. See how "git checkout" replaces not_uptodate_file to + * situation better. See how "git checkout" replaces ERROR_NOT_UPTODATE_FILE to * explain why it does not allow switching between branches when you have * local changes, for example. */ -static struct unpack_trees_error_msgs unpack_plumbing_errors = { - /* would_overwrite */ +const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = { + /* ERROR_WOULD_OVERWRITE */ "Entry '%s' would be overwritten by merge. Cannot merge.", - /* not_uptodate_file */ + /* ERROR_NOT_UPTODATE_FILE */ "Entry '%s' not uptodate. Cannot merge.", - /* not_uptodate_dir */ + /* ERROR_NOT_UPTODATE_DIR */ "Updating '%s' would lose untracked files in it", - /* would_lose_untracked */ + /* ERROR_WOULD_LOSE_UNTRACKED */ "Untracked working tree file '%s' would be %s by merge.", - /* bind_overlap */ + /* ERROR_BIND_OVERLAP */ "Entry '%s' overlaps with '%s'. Cannot bind.", - /* sparse_not_uptodate_file */ + /* ERROR_SPARSE_NOT_UPTODATE_FILE */ "Entry '%s' not uptodate. Cannot update sparse checkout.", - /* would_lose_orphaned */ + /* ERROR_WOULD_LOSE_ORPHANED */ "Working tree file '%s' would be %s by sparse checkout update.", }; -#define ERRORMSG(o,fld) \ - ( ((o) && (o)->msgs.fld) \ - ? ((o)->msgs.fld) \ - : (unpack_plumbing_errors.fld) ) +#define ERRORMSG(o,type) \ + ( ((o) && (o)->msgs[(type)]) \ + ? ((o)->msgs[(type)]) \ + : (unpack_plumbing_errors[(type)]) ) static void add_entry(struct unpack_trees_options *o, struct cache_entry *ce, unsigned int set, unsigned int clear) @@ -838,7 +838,7 @@ return_failed: static int reject_merge(struct cache_entry *ce, struct unpack_trees_options *o) { - return error(ERRORMSG(o, would_overwrite), ce->name); + return error(ERRORMSG(o, ERROR_WOULD_OVERWRITE), ce->name); } static int same(struct cache_entry *a, struct cache_entry *b) @@ -893,13 +893,13 @@ static int verify_uptodate(struct cache_entry *ce, { if (!o->skip_sparse_checkout && will_have_skip_worktree(ce, o)) return 0; - return verify_uptodate_1(ce, o, ERRORMSG(o, not_uptodate_file)); + return verify_uptodate_1(ce, o, ERRORMSG(o, ERROR_NOT_UPTODATE_FILE)); } static int verify_uptodate_sparse(struct cache_entry *ce, struct unpack_trees_options *o) { - return verify_uptodate_1(ce, o, ERRORMSG(o, sparse_not_uptodate_file)); + return verify_uptodate_1(ce, o, ERRORMSG(o, ERROR_SPARSE_NOT_UPTODATE_FILE)); } static void invalidate_ce_path(struct cache_entry *ce, struct unpack_trees_options *o) @@ -986,7 +986,7 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action, i = read_directory(&d, pathbuf, namelen+1, NULL); if (i) return o->gently ? -1 : - error(ERRORMSG(o, not_uptodate_dir), ce->name); + error(ERRORMSG(o, ERROR_NOT_UPTODATE_DIR), ce->name); free(pathbuf); return cnt; } @@ -1068,7 +1068,7 @@ static int verify_absent_1(struct cache_entry *ce, const char *action, } return o->gently ? -1 : - error(ERRORMSG(o, would_lose_untracked), ce->name, action); + error(ERRORMSG(o, ERROR_WOULD_LOSE_UNTRACKED), ce->name, action); } return 0; } @@ -1077,13 +1077,13 @@ static int verify_absent(struct cache_entry *ce, const char *action, { if (!o->skip_sparse_checkout && will_have_skip_worktree(ce, o)) return 0; - return verify_absent_1(ce, action, o, ERRORMSG(o, would_lose_untracked)); + return verify_absent_1(ce, action, o, ERRORMSG(o, ERROR_WOULD_LOSE_UNTRACKED)); } static int verify_absent_sparse(struct cache_entry *ce, const char *action, struct unpack_trees_options *o) { - return verify_absent_1(ce, action, o, ERRORMSG(o, would_lose_orphaned)); + return verify_absent_1(ce, action, o, ERRORMSG(o, ERROR_WOULD_LOSE_ORPHANED)); } static int merged_entry(struct cache_entry *merge, struct cache_entry *old, @@ -1412,7 +1412,7 @@ int bind_merge(struct cache_entry **src, o->merge_size); if (a && old) return o->gently ? -1 : - error(ERRORMSG(o, bind_overlap), a->name, old->name); + error(ERRORMSG(o, ERROR_BIND_OVERLAP), a->name, old->name); if (!a) return keep_entry(old, o); else diff --git a/unpack-trees.h b/unpack-trees.h index ef70eab39..09e22522f 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -9,14 +9,15 @@ struct exclude_list; typedef int (*merge_fn_t)(struct cache_entry **src, struct unpack_trees_options *options); -struct unpack_trees_error_msgs { - const char *would_overwrite; - const char *not_uptodate_file; - const char *not_uptodate_dir; - const char *would_lose_untracked; - const char *bind_overlap; - const char *sparse_not_uptodate_file; - const char *would_lose_orphaned; +enum unpack_trees_error_types { + ERROR_WOULD_OVERWRITE = 0, + ERROR_NOT_UPTODATE_FILE, + ERROR_NOT_UPTODATE_DIR, + ERROR_WOULD_LOSE_UNTRACKED, + ERROR_BIND_OVERLAP, + ERROR_SPARSE_NOT_UPTODATE_FILE, + ERROR_WOULD_LOSE_ORPHANED, + NB_UNPACK_TREES_ERROR_TYPES }; struct unpack_trees_options { @@ -38,7 +39,7 @@ struct unpack_trees_options { int cache_bottom; struct dir_struct *dir; merge_fn_t fn; - struct unpack_trees_error_msgs msgs; + const char *msgs[NB_UNPACK_TREES_ERROR_TYPES]; int head_idx; int merge_size; -- 2.26.2