9
#include "compat/terminal.h"
10
11
enum prompt_mode_type {
12
- PROMPT_MODE_CHANGE = 0, PROMPT_DELETION, PROMPT_HUNK,
12
+ PROMPT_MODE_CHANGE = 0, PROMPT_DELETION, PROMPT_ADDITION, PROMPT_HUNK,
13
PROMPT_MODE_MAX, /* must be last */
14
};
15
32
.prompt_mode = {
33
N_("Stage mode change [y,n,q,a,d%s,?]? "),
34
N_("Stage deletion [y,n,q,a,d%s,?]? "),
35
+ N_("Stage addition [y,n,q,a,d%s,?]? "),
36
N_("Stage this hunk [y,n,q,a,d%s,?]? ")
37
},
38
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
54
.prompt_mode = {
55
N_("Stash mode change [y,n,q,a,d%s,?]? "),
56
N_("Stash deletion [y,n,q,a,d%s,?]? "),
57
+ N_("Stash addition [y,n,q,a,d%s,?]? "),
58
N_("Stash this hunk [y,n,q,a,d%s,?]? "),
59
},
60
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
78
.prompt_mode = {
79
N_("Unstage mode change [y,n,q,a,d%s,?]? "),
80
N_("Unstage deletion [y,n,q,a,d%s,?]? "),
81
+ N_("Unstage addition [y,n,q,a,d%s,?]? "),
82
N_("Unstage this hunk [y,n,q,a,d%s,?]? "),
83
},
84
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
101
.prompt_mode = {
102
N_("Apply mode change to index [y,n,q,a,d%s,?]? "),
103
N_("Apply deletion to index [y,n,q,a,d%s,?]? "),
104
+ N_("Apply addition to index [y,n,q,a,d%s,?]? "),
105
N_("Apply this hunk to index [y,n,q,a,d%s,?]? "),
106
},
107
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
124
.prompt_mode = {
125
N_("Discard mode change from worktree [y,n,q,a,d%s,?]? "),
126
N_("Discard deletion from worktree [y,n,q,a,d%s,?]? "),
127
+ N_("Discard addition from worktree [y,n,q,a,d%s,?]? "),
128
N_("Discard this hunk from worktree [y,n,q,a,d%s,?]? "),
129
},
130
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
147
.prompt_mode = {
148
N_("Discard mode change from index and worktree [y,n,q,a,d%s,?]? "),
149
N_("Discard deletion from index and worktree [y,n,q,a,d%s,?]? "),
150
+ N_("Discard addition from index and worktree [y,n,q,a,d%s,?]? "),
151
N_("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "),
152
},
153
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
169
.prompt_mode = {
170
N_("Apply mode change to index and worktree [y,n,q,a,d%s,?]? "),
171
N_("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
172
+ N_("Apply addition to index and worktree [y,n,q,a,d%s,?]? "),
173
N_("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
174
},
175
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
192
.prompt_mode = {
193
N_("Discard mode change from index and worktree [y,n,q,a,d%s,?]? "),
194
N_("Discard deletion from index and worktree [y,n,q,a,d%s,?]? "),
195
+ N_("Discard addition from index and worktree [y,n,q,a,d%s,?]? "),
196
N_("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "),
197
},
198
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
214
.prompt_mode = {
215
N_("Apply mode change to index and worktree [y,n,q,a,d%s,?]? "),
216
N_("Apply deletion to index and worktree [y,n,q,a,d%s,?]? "),
217
+ N_("Apply addition to index and worktree [y,n,q,a,d%s,?]? "),
218
N_("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "),
219
},
220
.edit_hunk_hint = N_("If the patch applies cleanly, the edited hunk "
256
struct hunk head;
257
struct hunk *hunk;
258
size_t hunk_nr, hunk_alloc;
250
- unsigned deleted:1, mode_change:1,binary:1;
259
+ unsigned deleted:1, added:1, mode_change:1,binary:1;
260
} *file_diff;
261
size_t file_diff_nr;
262
450
pend = p + plain->len;
451
while (p != pend) {
452
char *eol = memchr(p, '\n', pend - p);
444
- const char *deleted = NULL, *mode_change = NULL;
453
+ const char *deleted = NULL, *added = NULL, *mode_change = NULL;
454
455
if (!eol)
456
eol = pend;
469
} else if (p == plain->buf)
470
BUG("diff starts with unexpected line:\n"
471
"%.*s\n", (int)(eol - p), p);
463
- else if (file_diff->deleted)
472
+ else if (file_diff->deleted || file_diff->added)
473
; /* keep the rest of the file in a single "hunk" */
474
else if (starts_with(p, "@@ ") ||
475
(hunk == &file_diff->head &&
467
- skip_prefix(p, "deleted file", &deleted))) {
476
+ (skip_prefix(p, "deleted file", &deleted) ||
477
+ skip_prefix(p, "new file", &added)))) {
478
if (marker == '-' || marker == '+')
479
/*
480
* Should not happen; previous hunk did not end
494
495
if (deleted)
496
file_diff->deleted = 1;
497
+ else if (added)
498
+ file_diff->added = 1;
499
else if (parse_hunk_header(s, hunk) < 0)
500
return -1;
501
548
starts_with(p, "Binary files "))
549
file_diff->binary = 1;
550
539
- if (file_diff->deleted && file_diff->mode_change)
540
- BUG("diff contains delete *and* a mode change?!?\n%.*s",
551
+ if (!!file_diff->deleted + !!file_diff->added +
552
+ !!file_diff->mode_change > 1)
553
+ BUG("diff can only contain delete *or* add *or* a "
554
+ "mode change?!?\n%.*s",
555
(int)(eol - (plain->buf + file_diff->head.start)),
556
plain->buf + file_diff->head.start);
557
1411
1412
if (file_diff->deleted)
1413
prompt_mode_type = PROMPT_DELETION;
1414
+ else if (file_diff->added)
1415
+ prompt_mode_type = PROMPT_ADDITION;
1416
else if (file_diff->mode_change && !hunk_index)
1417
prompt_mode_type = PROMPT_MODE_CHANGE;
1418
else