@@ -1352,6 +1352,15 @@ static int patch_update_file(struct add_p_state *s,
1352
1352
struct child_process cp = CHILD_PROCESS_INIT ;
1353
1353
int colored = !!s -> colored .len , quit = 0 ;
1354
1354
enum prompt_mode_type prompt_mode_type ;
1355
+ enum {
1356
+ ALLOW_GOTO_PREVIOUS_HUNK = 1 << 0 ,
1357
+ ALLOW_GOTO_PREVIOUS_UNDECIDED_HUNK = 1 << 1 ,
1358
+ ALLOW_GOTO_NEXT_HUNK = 1 << 2 ,
1359
+ ALLOW_GOTO_NEXT_UNDECIDED_HUNK = 1 << 3 ,
1360
+ ALLOW_SEARCH_AND_GOTO = 1 << 4 ,
1361
+ ALLOW_SPLIT = 1 << 5 ,
1362
+ ALLOW_EDIT = 1 << 6
1363
+ } permitted = 0 ;
1355
1364
1356
1365
if (!file_diff -> hunk_nr )
1357
1366
return 0 ;
@@ -1388,22 +1397,35 @@ static int patch_update_file(struct add_p_state *s,
1388
1397
fputs (s -> buf .buf , stdout );
1389
1398
1390
1399
strbuf_reset (& s -> buf );
1391
- if (undecided_previous >= 0 )
1400
+ if (undecided_previous >= 0 ) {
1401
+ permitted |= ALLOW_GOTO_PREVIOUS_UNDECIDED_HUNK ;
1392
1402
strbuf_addstr (& s -> buf , ",k" );
1393
- if (hunk_index )
1403
+ }
1404
+ if (hunk_index ) {
1405
+ permitted |= ALLOW_GOTO_PREVIOUS_HUNK ;
1394
1406
strbuf_addstr (& s -> buf , ",K" );
1395
- if (undecided_next >= 0 )
1407
+ }
1408
+ if (undecided_next >= 0 ) {
1409
+ permitted |= ALLOW_GOTO_NEXT_UNDECIDED_HUNK ;
1396
1410
strbuf_addstr (& s -> buf , ",j" );
1397
- if (hunk_index + 1 < file_diff -> hunk_nr )
1411
+ }
1412
+ if (hunk_index + 1 < file_diff -> hunk_nr ) {
1413
+ permitted |= ALLOW_GOTO_NEXT_HUNK ;
1398
1414
strbuf_addstr (& s -> buf , ",J" );
1399
- if (file_diff -> hunk_nr > 1 )
1415
+ }
1416
+ if (file_diff -> hunk_nr > 1 ) {
1417
+ permitted |= ALLOW_SEARCH_AND_GOTO ;
1400
1418
strbuf_addstr (& s -> buf , ",g,/" );
1401
- if (hunk -> splittable_into > 1 )
1419
+ }
1420
+ if (hunk -> splittable_into > 1 ) {
1421
+ permitted |= ALLOW_SPLIT ;
1402
1422
strbuf_addstr (& s -> buf , ",s" );
1423
+ }
1403
1424
if (hunk_index + 1 > file_diff -> mode_change &&
1404
- !file_diff -> deleted )
1425
+ !file_diff -> deleted ) {
1426
+ permitted |= ALLOW_EDIT ;
1405
1427
strbuf_addstr (& s -> buf , ",e" );
1406
-
1428
+ }
1407
1429
if (file_diff -> deleted )
1408
1430
prompt_mode_type = PROMPT_DELETION ;
1409
1431
else if (file_diff -> added )
@@ -1452,30 +1474,30 @@ static int patch_update_file(struct add_p_state *s,
1452
1474
break ;
1453
1475
}
1454
1476
} else if (s -> answer .buf [0 ] == 'K' ) {
1455
- if (hunk_index )
1477
+ if (permitted & ALLOW_GOTO_PREVIOUS_HUNK )
1456
1478
hunk_index -- ;
1457
1479
else
1458
1480
err (s , _ ("No previous hunk" ));
1459
1481
} else if (s -> answer .buf [0 ] == 'J' ) {
1460
- if (hunk_index + 1 < file_diff -> hunk_nr )
1482
+ if (permitted & ALLOW_GOTO_NEXT_HUNK )
1461
1483
hunk_index ++ ;
1462
1484
else
1463
1485
err (s , _ ("No next hunk" ));
1464
1486
} else if (s -> answer .buf [0 ] == 'k' ) {
1465
- if (undecided_previous >= 0 )
1487
+ if (permitted & ALLOW_GOTO_PREVIOUS_UNDECIDED_HUNK )
1466
1488
hunk_index = undecided_previous ;
1467
1489
else
1468
1490
err (s , _ ("No previous hunk" ));
1469
1491
} else if (s -> answer .buf [0 ] == 'j' ) {
1470
- if (undecided_next >= 0 )
1492
+ if (permitted & ALLOW_GOTO_NEXT_UNDECIDED_HUNK )
1471
1493
hunk_index = undecided_next ;
1472
1494
else
1473
1495
err (s , _ ("No next hunk" ));
1474
1496
} else if (s -> answer .buf [0 ] == 'g' ) {
1475
1497
char * pend ;
1476
1498
unsigned long response ;
1477
1499
1478
- if (file_diff -> hunk_nr < 2 ) {
1500
+ if (!( permitted & ALLOW_SEARCH_AND_GOTO ) ) {
1479
1501
err (s , _ ("No other hunks to goto" ));
1480
1502
continue ;
1481
1503
}
@@ -1512,7 +1534,7 @@ static int patch_update_file(struct add_p_state *s,
1512
1534
regex_t regex ;
1513
1535
int ret ;
1514
1536
1515
- if (file_diff -> hunk_nr < 2 ) {
1537
+ if (!( permitted & ALLOW_SEARCH_AND_GOTO ) ) {
1516
1538
err (s , _ ("No other hunks to search" ));
1517
1539
continue ;
1518
1540
}
@@ -1557,15 +1579,15 @@ static int patch_update_file(struct add_p_state *s,
1557
1579
hunk_index = i ;
1558
1580
} else if (s -> answer .buf [0 ] == 's' ) {
1559
1581
size_t splittable_into = hunk -> splittable_into ;
1560
- if (splittable_into < 2 )
1582
+ if (!( permitted & ALLOW_SPLIT ) )
1561
1583
err (s , _ ("Sorry, cannot split this hunk" ));
1562
1584
else if (!split_hunk (s , file_diff ,
1563
1585
hunk - file_diff -> hunk ))
1564
1586
color_fprintf_ln (stdout , s -> s .header_color ,
1565
1587
_ ("Split into %d hunks." ),
1566
1588
(int )splittable_into );
1567
1589
} else if (s -> answer .buf [0 ] == 'e' ) {
1568
- if (hunk_index + 1 == file_diff -> mode_change )
1590
+ if (!( permitted & ALLOW_EDIT ) )
1569
1591
err (s , _ ("Sorry, cannot edit this hunk" ));
1570
1592
else if (edit_hunk_loop (s , file_diff , hunk ) >= 0 ) {
1571
1593
hunk -> use = USE_HUNK ;
0 commit comments