3
#include "git-compat-util.h"
4
#include "add-interactive.h"
5
#include "color.h"
6
-#include "config.h"
6
#include "diffcore.h"
7
#include "gettext.h"
8
#include "hash.h"
19
#include "prompt.h"
20
#include "tree.h"
21
23
-static void init_color(struct repository *r, enum git_colorbool use_color,
24
- const char *section_and_slot, char *dst,
25
- const char *default_color)
26
-{
27
- char *key = xstrfmt("color.%s", section_and_slot);
28
- const char *value;
29
-
30
- if (!want_color(use_color))
31
- dst[0] = '\0';
32
- else if (repo_config_get_value(r, key, &value) ||
33
- color_parse(value, dst))
34
- strlcpy(dst, default_color, COLOR_MAXLEN);
35
-
36
- free(key);
37
-}
38
-
39
-static enum git_colorbool check_color_config(struct repository *r, const char *var)
40
-{
41
- const char *value;
42
- enum git_colorbool ret;
43
-
44
- if (repo_config_get_value(r, var, &value))
45
- ret = GIT_COLOR_UNKNOWN;
46
- else
47
- ret = git_config_colorbool(var, value);
48
-
49
- /*
50
- * Do not rely on want_color() to fall back to color.ui for us. It uses
51
- * the value parsed by git_color_config(), which may not have been
52
- * called by the main command.
53
- */
54
- if (ret == GIT_COLOR_UNKNOWN &&
55
- !repo_config_get_value(r, "color.ui", &value))
56
- ret = git_config_colorbool("color.ui", value);
57
-
58
- return ret;
59
-}
60
-
22
void init_add_i_state(struct add_i_state *s, struct repository *r,
62
- struct add_p_opt *add_p_opt)
23
+ struct interactive_options *opts)
24
{
25
s->r = r;
65
- s->context = -1;
66
- s->interhunkcontext = -1;
67
- s->auto_advance = add_p_opt->auto_advance;
68
-
69
- s->use_color_interactive = check_color_config(r, "color.interactive");
70
-
71
- init_color(r, s->use_color_interactive, "interactive.header",
72
- s->header_color, GIT_COLOR_BOLD);
73
- init_color(r, s->use_color_interactive, "interactive.help",
74
- s->help_color, GIT_COLOR_BOLD_RED);
75
- init_color(r, s->use_color_interactive, "interactive.prompt",
76
- s->prompt_color, GIT_COLOR_BOLD_BLUE);
77
- init_color(r, s->use_color_interactive, "interactive.error",
78
- s->error_color, GIT_COLOR_BOLD_RED);
79
- strlcpy(s->reset_color_interactive,
80
- want_color(s->use_color_interactive) ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
81
-
82
- s->use_color_diff = check_color_config(r, "color.diff");
83
-
84
- init_color(r, s->use_color_diff, "diff.frag", s->fraginfo_color,
85
- diff_get_color(s->use_color_diff, DIFF_FRAGINFO));
86
- init_color(r, s->use_color_diff, "diff.context", s->context_color,
87
- "fall back");
88
- if (!strcmp(s->context_color, "fall back"))
89
- init_color(r, s->use_color_diff, "diff.plain",
90
- s->context_color,
91
- diff_get_color(s->use_color_diff, DIFF_CONTEXT));
92
- init_color(r, s->use_color_diff, "diff.old", s->file_old_color,
93
- diff_get_color(s->use_color_diff, DIFF_FILE_OLD));
94
- init_color(r, s->use_color_diff, "diff.new", s->file_new_color,
95
- diff_get_color(s->use_color_diff, DIFF_FILE_NEW));
96
- strlcpy(s->reset_color_diff,
97
- want_color(s->use_color_diff) ? GIT_COLOR_RESET : "", COLOR_MAXLEN);
98
-
99
- FREE_AND_NULL(s->interactive_diff_filter);
100
- repo_config_get_string(r, "interactive.difffilter",
101
- &s->interactive_diff_filter);
102
-
103
- FREE_AND_NULL(s->interactive_diff_algorithm);
104
- repo_config_get_string(r, "diff.algorithm",
105
- &s->interactive_diff_algorithm);
106
-
107
- if (!repo_config_get_int(r, "diff.context", &s->context))
108
- if (s->context < 0)
109
- die(_("%s cannot be negative"), "diff.context");
110
- if (!repo_config_get_int(r, "diff.interHunkContext", &s->interhunkcontext))
111
- if (s->interhunkcontext < 0)
112
- die(_("%s cannot be negative"), "diff.interHunkContext");
113
-
114
- repo_config_get_bool(r, "interactive.singlekey", &s->use_single_key);
115
- if (s->use_single_key)
116
- setbuf(stdin, NULL);
117
-
118
- if (add_p_opt->context != -1) {
119
- if (add_p_opt->context < 0)
120
- die(_("%s cannot be negative"), "--unified");
121
- s->context = add_p_opt->context;
122
- }
123
- if (add_p_opt->interhunkcontext != -1) {
124
- if (add_p_opt->interhunkcontext < 0)
125
- die(_("%s cannot be negative"), "--inter-hunk-context");
126
- s->interhunkcontext = add_p_opt->interhunkcontext;
127
- }
26
+ interactive_config_init(&s->cfg, r, opts);
27
}
28
29
void clear_add_i_state(struct add_i_state *s)
30
{
132
- FREE_AND_NULL(s->interactive_diff_filter);
133
- FREE_AND_NULL(s->interactive_diff_algorithm);
31
+ interactive_config_clear(&s->cfg);
32
memset(s, 0, sizeof(*s));
135
- s->use_color_interactive = GIT_COLOR_UNKNOWN;
136
- s->use_color_diff = GIT_COLOR_UNKNOWN;
33
+ interactive_config_clear(&s->cfg);
34
}
35
36
/*
184
return;
185
186
if (opts->header)
290
- color_fprintf_ln(stdout, s->header_color,
187
+ color_fprintf_ln(stdout, s->cfg.header_color,
188
"%s", opts->header);
189
190
for (i = 0; i < list->nr; i++) {
252
253
list(s, &items->items, items->selected, &opts->list_opts);
254
358
- color_fprintf(stdout, s->prompt_color, "%s", opts->prompt);
255
+ color_fprintf(stdout, s->cfg.prompt_color, "%s", opts->prompt);
256
fputs(singleton ? "> " : ">> ", stdout);
257
fflush(stdout);
258
330
331
if (from < 0 || from >= items->items.nr ||
332
(singleton && from + 1 != to)) {
436
- color_fprintf_ln(stderr, s->error_color,
333
+ color_fprintf_ln(stderr, s->cfg.error_color,
334
_("Huh (%s)?"), p);
335
break;
336
} else if (singleton) {
890
free(files->items.items[i].string);
891
} else if (item->index.unmerged ||
892
item->worktree.unmerged) {
996
- color_fprintf_ln(stderr, s->error_color,
893
+ color_fprintf_ln(stderr, s->cfg.error_color,
894
_("ignoring unmerged: %s"),
895
files->items.items[i].string);
896
free(item);
912
opts->prompt = N_("Patch update");
913
count = list_and_choose(s, files, opts);
914
if (count > 0) {
1018
- struct add_p_opt add_p_opt = {
1019
- .context = s->context,
1020
- .interhunkcontext = s->interhunkcontext,
1021
- .auto_advance = s->auto_advance
915
+ struct interactive_options opts = {
916
+ .context = s->cfg.context,
917
+ .interhunkcontext = s->cfg.interhunkcontext,
918
+ .auto_advance = s->cfg.auto_advance,
919
};
920
struct strvec args = STRVEC_INIT;
921
struct pathspec ps_selected = { 0 };
927
parse_pathspec(&ps_selected,
928
PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL,
929
PATHSPEC_LITERAL_PATH, "", args.v);
1033
- res = run_add_p(s->r, ADD_P_ADD, &add_p_opt, NULL, &ps_selected);
930
+ res = run_add_p(s->r, ADD_P_ADD, &opts, NULL, &ps_selected);
931
strvec_clear(&args);
932
clear_pathspec(&ps_selected);
933
}
963
struct child_process cmd = CHILD_PROCESS_INIT;
964
965
strvec_pushl(&cmd.args, "git", "diff", "-p", "--cached", NULL);
1069
- if (s->context != -1)
1070
- strvec_pushf(&cmd.args, "--unified=%i", s->context);
1071
- if (s->interhunkcontext != -1)
1072
- strvec_pushf(&cmd.args, "--inter-hunk-context=%i", s->interhunkcontext);
966
+ if (s->cfg.context != -1)
967
+ strvec_pushf(&cmd.args, "--unified=%i", s->cfg.context);
968
+ if (s->cfg.interhunkcontext != -1)
969
+ strvec_pushf(&cmd.args, "--inter-hunk-context=%i", s->cfg.interhunkcontext);
970
strvec_pushl(&cmd.args, oid_to_hex(!is_initial ? &oid :
971
s->r->hash_algo->empty_tree), "--", NULL);
972
for (i = 0; i < files->items.nr; i++)
984
struct prefix_item_list *files UNUSED,
985
struct list_and_choose_options *opts UNUSED)
986
{
1090
- color_fprintf_ln(stdout, s->help_color, "status - %s",
987
+ color_fprintf_ln(stdout, s->cfg.help_color, "status - %s",
988
_("show paths with changes"));
1092
- color_fprintf_ln(stdout, s->help_color, "update - %s",
989
+ color_fprintf_ln(stdout, s->cfg.help_color, "update - %s",
990
_("add working tree state to the staged set of changes"));
1094
- color_fprintf_ln(stdout, s->help_color, "revert - %s",
991
+ color_fprintf_ln(stdout, s->cfg.help_color, "revert - %s",
992
_("revert staged set of changes back to the HEAD version"));
1096
- color_fprintf_ln(stdout, s->help_color, "patch - %s",
993
+ color_fprintf_ln(stdout, s->cfg.help_color, "patch - %s",
994
_("pick hunks and update selectively"));
1098
- color_fprintf_ln(stdout, s->help_color, "diff - %s",
995
+ color_fprintf_ln(stdout, s->cfg.help_color, "diff - %s",
996
_("view diff between HEAD and index"));
1100
- color_fprintf_ln(stdout, s->help_color, "add untracked - %s",
997
+ color_fprintf_ln(stdout, s->cfg.help_color, "add untracked - %s",
998
_("add contents of untracked files to the staged set of changes"));
999
1000
return 0;
1002
1003
static void choose_prompt_help(struct add_i_state *s)
1004
{
1108
- color_fprintf_ln(stdout, s->help_color, "%s",
1005
+ color_fprintf_ln(stdout, s->cfg.help_color, "%s",
1006
_("Prompt help:"));
1110
- color_fprintf_ln(stdout, s->help_color, "1 - %s",
1007
+ color_fprintf_ln(stdout, s->cfg.help_color, "1 - %s",
1008
_("select a single item"));
1112
- color_fprintf_ln(stdout, s->help_color, "3-5 - %s",
1009
+ color_fprintf_ln(stdout, s->cfg.help_color, "3-5 - %s",
1010
_("select a range of items"));
1114
- color_fprintf_ln(stdout, s->help_color, "2-3,6-9 - %s",
1011
+ color_fprintf_ln(stdout, s->cfg.help_color, "2-3,6-9 - %s",
1012
_("select multiple ranges"));
1116
- color_fprintf_ln(stdout, s->help_color, "foo - %s",
1013
+ color_fprintf_ln(stdout, s->cfg.help_color, "foo - %s",
1014
_("select item based on unique prefix"));
1118
- color_fprintf_ln(stdout, s->help_color, "-... - %s",
1015
+ color_fprintf_ln(stdout, s->cfg.help_color, "-... - %s",
1016
_("unselect specified items"));
1120
- color_fprintf_ln(stdout, s->help_color, "* - %s",
1017
+ color_fprintf_ln(stdout, s->cfg.help_color, "* - %s",
1018
_("choose all items"));
1122
- color_fprintf_ln(stdout, s->help_color, " - %s",
1019
+ color_fprintf_ln(stdout, s->cfg.help_color, " - %s",
1020
_("(empty) finish selecting"));
1021
}
1022
1051
1052
static void command_prompt_help(struct add_i_state *s)
1053
{
1157
- const char *help_color = s->help_color;
1054
+ const char *help_color = s->cfg.help_color;
1055
color_fprintf_ln(stdout, help_color, "%s", _("Prompt help:"));
1056
color_fprintf_ln(stdout, help_color, "1 - %s",
1057
_("select a numbered item"));
1062
}
1063
1064
int run_add_i(struct repository *r, const struct pathspec *ps,
1168
- struct add_p_opt *add_p_opt)
1065
+ struct interactive_options *interactive_opts)
1066
{
1067
struct add_i_state s = { NULL };
1068
struct print_command_item_data data = { "[", "]" };
1105
->util = util;
1106
}
1107
1211
- init_add_i_state(&s, r, add_p_opt);
1108
+ init_add_i_state(&s, r, interactive_opts);
1109
1110
/*
1111
* When color was asked for, use the prompt color for
1112
* highlighting, otherwise use square brackets.
1113
*/
1217
- if (want_color(s.use_color_interactive)) {
1218
- data.color = s.prompt_color;
1219
- data.reset = s.reset_color_interactive;
1114
+ if (want_color(s.cfg.use_color_interactive)) {
1115
+ data.color = s.cfg.prompt_color;
1116
+ data.reset = s.cfg.reset_color_interactive;
1117
}
1118
print_file_item_data.color = data.color;
1119
print_file_item_data.reset = data.reset;