99#include "compat/terminal.h"
1010
1111enum prompt_mode_type {
12- PROMPT_MODE_CHANGE = 0 , PROMPT_DELETION , PROMPT_HUNK ,
12+ PROMPT_MODE_CHANGE = 0 , PROMPT_DELETION , PROMPT_ADDITION , PROMPT_HUNK ,
1313 PROMPT_MODE_MAX , /* must be last */
1414};
1515
@@ -32,6 +32,7 @@ static struct patch_mode patch_mode_add = {
3232 .prompt_mode = {
3333 N_ ("Stage mode change [y,n,q,a,d%s,?]? " ),
3434 N_ ("Stage deletion [y,n,q,a,d%s,?]? " ),
35+ N_ ("Stage addition [y,n,q,a,d%s,?]? " ),
3536 N_ ("Stage this hunk [y,n,q,a,d%s,?]? " )
3637 },
3738 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -53,6 +54,7 @@ static struct patch_mode patch_mode_stash = {
5354 .prompt_mode = {
5455 N_ ("Stash mode change [y,n,q,a,d%s,?]? " ),
5556 N_ ("Stash deletion [y,n,q,a,d%s,?]? " ),
57+ N_ ("Stash addition [y,n,q,a,d%s,?]? " ),
5658 N_ ("Stash this hunk [y,n,q,a,d%s,?]? " ),
5759 },
5860 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -76,6 +78,7 @@ static struct patch_mode patch_mode_reset_head = {
7678 .prompt_mode = {
7779 N_ ("Unstage mode change [y,n,q,a,d%s,?]? " ),
7880 N_ ("Unstage deletion [y,n,q,a,d%s,?]? " ),
81+ N_ ("Unstage addition [y,n,q,a,d%s,?]? " ),
7982 N_ ("Unstage this hunk [y,n,q,a,d%s,?]? " ),
8083 },
8184 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -98,6 +101,7 @@ static struct patch_mode patch_mode_reset_nothead = {
98101 .prompt_mode = {
99102 N_ ("Apply mode change to index [y,n,q,a,d%s,?]? " ),
100103 N_ ("Apply deletion to index [y,n,q,a,d%s,?]? " ),
104+ N_ ("Apply addition to index [y,n,q,a,d%s,?]? " ),
101105 N_ ("Apply this hunk to index [y,n,q,a,d%s,?]? " ),
102106 },
103107 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -120,6 +124,7 @@ static struct patch_mode patch_mode_checkout_index = {
120124 .prompt_mode = {
121125 N_ ("Discard mode change from worktree [y,n,q,a,d%s,?]? " ),
122126 N_ ("Discard deletion from worktree [y,n,q,a,d%s,?]? " ),
127+ N_ ("Discard addition from worktree [y,n,q,a,d%s,?]? " ),
123128 N_ ("Discard this hunk from worktree [y,n,q,a,d%s,?]? " ),
124129 },
125130 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -142,6 +147,7 @@ static struct patch_mode patch_mode_checkout_head = {
142147 .prompt_mode = {
143148 N_ ("Discard mode change from index and worktree [y,n,q,a,d%s,?]? " ),
144149 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,?]? " ),
145151 N_ ("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? " ),
146152 },
147153 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -163,6 +169,7 @@ static struct patch_mode patch_mode_checkout_nothead = {
163169 .prompt_mode = {
164170 N_ ("Apply mode change to index and worktree [y,n,q,a,d%s,?]? " ),
165171 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,?]? " ),
166173 N_ ("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? " ),
167174 },
168175 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -185,6 +192,7 @@ static struct patch_mode patch_mode_worktree_head = {
185192 .prompt_mode = {
186193 N_ ("Discard mode change from index and worktree [y,n,q,a,d%s,?]? " ),
187194 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,?]? " ),
188196 N_ ("Discard this hunk from index and worktree [y,n,q,a,d%s,?]? " ),
189197 },
190198 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -206,6 +214,7 @@ static struct patch_mode patch_mode_worktree_nothead = {
206214 .prompt_mode = {
207215 N_ ("Apply mode change to index and worktree [y,n,q,a,d%s,?]? " ),
208216 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,?]? " ),
209218 N_ ("Apply this hunk to index and worktree [y,n,q,a,d%s,?]? " ),
210219 },
211220 .edit_hunk_hint = N_ ("If the patch applies cleanly, the edited hunk "
@@ -247,7 +256,7 @@ struct add_p_state {
247256 struct hunk head ;
248257 struct hunk * hunk ;
249258 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 ;
251260 } * file_diff ;
252261 size_t file_diff_nr ;
253262
@@ -441,7 +450,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
441450 pend = p + plain -> len ;
442451 while (p != pend ) {
443452 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 ;
445454
446455 if (!eol )
447456 eol = pend ;
@@ -460,11 +469,12 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
460469 } else if (p == plain -> buf )
461470 BUG ("diff starts with unexpected line:\n"
462471 "%.*s\n" , (int )(eol - p ), p );
463- else if (file_diff -> deleted )
472+ else if (file_diff -> deleted || file_diff -> added )
464473 ; /* keep the rest of the file in a single "hunk" */
465474 else if (starts_with (p , "@@ " ) ||
466475 (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 )))) {
468478 if (marker == '-' || marker == '+' )
469479 /*
470480 * Should not happen; previous hunk did not end
@@ -484,6 +494,8 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
484494
485495 if (deleted )
486496 file_diff -> deleted = 1 ;
497+ else if (added )
498+ file_diff -> added = 1 ;
487499 else if (parse_hunk_header (s , hunk ) < 0 )
488500 return -1 ;
489501
@@ -536,8 +548,10 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
536548 starts_with (p , "Binary files " ))
537549 file_diff -> binary = 1 ;
538550
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" ,
541555 (int )(eol - (plain -> buf + file_diff -> head .start )),
542556 plain -> buf + file_diff -> head .start );
543557
@@ -1397,6 +1411,8 @@ static int patch_update_file(struct add_p_state *s,
13971411
13981412 if (file_diff -> deleted )
13991413 prompt_mode_type = PROMPT_DELETION ;
1414+ else if (file_diff -> added )
1415+ prompt_mode_type = PROMPT_ADDITION ;
14001416 else if (file_diff -> mode_change && !hunk_index )
14011417 prompt_mode_type = PROMPT_MODE_CHANGE ;
14021418 else
0 commit comments