@@ -1340,15 +1340,17 @@ set HEAD {}
1340
1340
set PARENT {}
1341
1341
set MERGE_HEAD [ list ]
1342
1342
set commit_type {}
1343
+ set commit_type_is_amend 0
1343
1344
set empty_tree {}
1344
1345
set current_branch {}
1345
1346
set is_detached 0
1346
1347
set current_diff_path {}
1347
1348
set is_3way_diff 0
1348
1349
set is_submodule_diff 0
1349
1350
set is_conflict_diff 0
1350
- set selected_commit_type new
1351
1351
set diff_empty_count 0
1352
+ set last_revert {}
1353
+ set last_revert_enc {}
1352
1354
1353
1355
set nullid " 0000000000000000000000000000000000000000"
1354
1356
set nullid2 " 0000000000000000000000000000000000000001"
@@ -1434,7 +1436,7 @@ proc PARENT {} {
1434
1436
}
1435
1437
1436
1438
proc force_amend {} {
1437
- global selected_commit_type
1439
+ global commit_type_is_amend
1438
1440
global HEAD PARENT MERGE_HEAD commit_type
1439
1441
1440
1442
repository_state newType newHEAD newMERGE_HEAD
@@ -1443,7 +1445,7 @@ proc force_amend {} {
1443
1445
set MERGE_HEAD $newMERGE_HEAD
1444
1446
set commit_type $newType
1445
1447
1446
- set selected_commit_type amend
1448
+ set commit_type_is_amend 1
1447
1449
do_select_commit_type
1448
1450
}
1449
1451
@@ -2494,7 +2496,7 @@ proc force_first_diff {after} {
2494
2496
2495
2497
proc toggle_or_diff {mode w args} {
2496
2498
global file_states file_lists current_diff_path ui_index ui_workdir
2497
- global last_clicked selected_paths
2499
+ global last_clicked selected_paths file_lists_last_clicked
2498
2500
2499
2501
if {$mode eq " click" } {
2500
2502
foreach {x y} $args break
@@ -2551,6 +2553,8 @@ proc toggle_or_diff {mode w args} {
2551
2553
$ui_index tag remove in_sel 0.0 end
2552
2554
$ui_workdir tag remove in_sel 0.0 end
2553
2555
2556
+ set file_lists_last_clicked($w ) $path
2557
+
2554
2558
# Determine the state of the file
2555
2559
if {[ info exists file_states($path )] } {
2556
2560
set state [ lindex $file_states($path) 0]
@@ -2664,6 +2668,32 @@ proc show_less_context {} {
2664
2668
}
2665
2669
}
2666
2670
2671
+ proc focus_widget {widget} {
2672
+ global file_lists last_clicked selected_paths
2673
+ global file_lists_last_clicked
2674
+
2675
+ if {[ llength $file_lists($widget) ] > 0} {
2676
+ set path $file_lists_last_clicked($widget)
2677
+ set index [ lsearch -sorted -exact $file_lists($widget) $path ]
2678
+ if {$index < 0} {
2679
+ set index 0
2680
+ set path [ lindex $file_lists($widget) $index ]
2681
+ }
2682
+
2683
+ focus $widget
2684
+ set last_clicked [ list $widget [expr $index + 1] ]
2685
+ array unset selected_paths
2686
+ set selected_paths($path ) 1
2687
+ show_diff $path $widget
2688
+ }
2689
+ }
2690
+
2691
+ proc toggle_commit_type {} {
2692
+ global commit_type_is_amend
2693
+ set commit_type_is_amend [ expr !$commit_type_is_amend ]
2694
+ do_select_commit_type
2695
+ }
2696
+
2667
2697
######################################################################
2668
2698
##
2669
2699
## ui construction
@@ -2852,19 +2882,11 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
2852
2882
menu .mbar.commit
2853
2883
2854
2884
if {![ is_enabled nocommit] } {
2855
- .mbar.commit add radiobutton \
2856
- -label [ mc " New Commit" ] \
2857
- -command do_select_commit_type \
2858
- -variable selected_commit_type \
2859
- -value new
2860
- lappend disable_on_lock \
2861
- [ list .mbar.commit entryconf [.mbar.commit index last] -state]
2862
-
2863
- .mbar.commit add radiobutton \
2885
+ .mbar.commit add checkbutton \
2864
2886
-label [ mc " Amend Last Commit" ] \
2865
- -command do_select_commit_type \
2866
- -variable selected_commit_type \
2867
- -value amend
2887
+ -accelerator $M1T -E \
2888
+ -variable commit_type_is_amend \
2889
+ -command do_select_commit_type
2868
2890
lappend disable_on_lock \
2869
2891
[ list .mbar.commit entryconf [.mbar.commit index last] -state]
2870
2892
@@ -3352,18 +3374,10 @@ set ui_comm .vpane.lower.commarea.buffer.frame.t
3352
3374
set ui_coml .vpane.lower.commarea.buffer.header.l
3353
3375
3354
3376
if {![ is_enabled nocommit] } {
3355
- ${NS} ::radiobutton .vpane.lower.commarea.buffer.header.new \
3356
- -text [ mc " New Commit" ] \
3357
- -command do_select_commit_type \
3358
- -variable selected_commit_type \
3359
- -value new
3360
- lappend disable_on_lock \
3361
- [ list .vpane.lower.commarea.buffer.header.new conf -state]
3362
- ${NS} ::radiobutton .vpane.lower.commarea.buffer.header.amend \
3377
+ ${NS} ::checkbutton .vpane.lower.commarea.buffer.header.amend \
3363
3378
-text [ mc " Amend Last Commit" ] \
3364
- -command do_select_commit_type \
3365
- -variable selected_commit_type \
3366
- -value amend
3379
+ -variable commit_type_is_amend \
3380
+ -command do_select_commit_type
3367
3381
lappend disable_on_lock \
3368
3382
[ list .vpane.lower.commarea.buffer.header.amend conf -state]
3369
3383
}
@@ -3388,7 +3402,6 @@ pack $ui_coml -side left -fill x
3388
3402
3389
3403
if {![ is_enabled nocommit] } {
3390
3404
pack .vpane.lower.commarea.buffer.header.amend -side right
3391
- pack .vpane.lower.commarea.buffer.header.new -side right
3392
3405
}
3393
3406
3394
3407
textframe .vpane.lower.commarea.buffer.frame
@@ -3402,10 +3415,16 @@ ttext $ui_comm -background white -foreground black \
3402
3415
-relief sunken \
3403
3416
-width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
3404
3417
-font font_diff \
3418
+ -xscrollcommand {.vpane.lower.commarea.buffer.frame.sbx set} \
3405
3419
-yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set}
3420
+ ${NS} ::scrollbar .vpane.lower.commarea.buffer.frame.sbx \
3421
+ -orient horizontal \
3422
+ -command [ list $ui_comm xview]
3406
3423
${NS} ::scrollbar .vpane.lower.commarea.buffer.frame.sby \
3424
+ -orient vertical \
3407
3425
-command [ list $ui_comm yview]
3408
3426
3427
+ pack .vpane.lower.commarea.buffer.frame.sbx -side bottom -fill x
3409
3428
pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y
3410
3429
pack $ui_comm -side left -fill y
3411
3430
pack .vpane.lower.commarea.buffer.header -side top -fill x
@@ -3621,15 +3640,31 @@ set ctxm .vpane.lower.diff.body.ctxm
3621
3640
menu $ctxm -tearoff 0
3622
3641
$ctxm add command \
3623
3642
-label [ mc " Apply/Reverse Hunk" ] \
3624
- -command {apply_hunk $cursorX $cursorY }
3643
+ -command {apply_or_revert_hunk $cursorX $cursorY 0 }
3625
3644
set ui_diff_applyhunk [ $ctxm index last]
3626
3645
lappend diff_actions [ list $ctxm entryconf $ui_diff_applyhunk -state]
3627
3646
$ctxm add command \
3628
3647
-label [ mc " Apply/Reverse Line" ] \
3629
- -command {apply_range_or_line $cursorX $cursorY ; do_rescan}
3648
+ -command {apply_or_revert_range_or_line $cursorX $cursorY 0 ; do_rescan}
3630
3649
set ui_diff_applyline [ $ctxm index last]
3631
3650
lappend diff_actions [ list $ctxm entryconf $ui_diff_applyline -state]
3632
3651
$ctxm add separator
3652
+ $ctxm add command \
3653
+ -label [ mc " Revert Hunk" ] \
3654
+ -command {apply_or_revert_hunk $cursorX $cursorY 1}
3655
+ set ui_diff_reverthunk [ $ctxm index last]
3656
+ lappend diff_actions [ list $ctxm entryconf $ui_diff_reverthunk -state]
3657
+ $ctxm add command \
3658
+ -label [ mc " Revert Line" ] \
3659
+ -command {apply_or_revert_range_or_line $cursorX $cursorY 1; do_rescan}
3660
+ set ui_diff_revertline [ $ctxm index last]
3661
+ lappend diff_actions [ list $ctxm entryconf $ui_diff_revertline -state]
3662
+ $ctxm add command \
3663
+ -label [ mc " Undo Last Revert" ] \
3664
+ -command {undo_last_revert; do_rescan}
3665
+ set ui_diff_undorevert [ $ctxm index last]
3666
+ lappend diff_actions [ list $ctxm entryconf $ui_diff_undorevert -state]
3667
+ $ctxm add separator
3633
3668
$ctxm add command \
3634
3669
-label [ mc " Show Less Context" ] \
3635
3670
-command show_less_context
@@ -3708,7 +3743,7 @@ proc has_textconv {path} {
3708
3743
}
3709
3744
3710
3745
proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
3711
- global current_diff_path file_states
3746
+ global current_diff_path file_states last_revert
3712
3747
set ::cursorX $x
3713
3748
set ::cursorY $y
3714
3749
if {[ info exists file_states($current_diff_path )] } {
@@ -3722,19 +3757,28 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
3722
3757
tk_popup $ctxmsm $X $Y
3723
3758
} else {
3724
3759
set has_range [ expr {[$::ui_diff tag nextrange sel 0.0] != {}}]
3760
+ set u [ mc " Undo Last Revert" ]
3725
3761
if {$::ui_index eq $::current_diff_side } {
3726
3762
set l [ mc " Unstage Hunk From Commit" ]
3763
+ set h [ mc " Revert Hunk" ]
3764
+
3727
3765
if {$has_range } {
3728
3766
set t [ mc " Unstage Lines From Commit" ]
3767
+ set r [ mc " Revert Lines" ]
3729
3768
} else {
3730
3769
set t [ mc " Unstage Line From Commit" ]
3770
+ set r [ mc " Revert Line" ]
3731
3771
}
3732
3772
} else {
3733
3773
set l [ mc " Stage Hunk For Commit" ]
3774
+ set h [ mc " Revert Hunk" ]
3775
+
3734
3776
if {$has_range } {
3735
3777
set t [ mc " Stage Lines For Commit" ]
3778
+ set r [ mc " Revert Lines" ]
3736
3779
} else {
3737
3780
set t [ mc " Stage Line For Commit" ]
3781
+ set r [ mc " Revert Line" ]
3738
3782
}
3739
3783
}
3740
3784
if {$::is_3way_diff
@@ -3745,11 +3789,35 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
3745
3789
|| [ string match {T?} $state ]
3746
3790
|| [ has_textconv $current_diff_path ] } {
3747
3791
set s disabled
3792
+ set revert_state disabled
3748
3793
} else {
3749
3794
set s normal
3795
+
3796
+ # Only allow reverting changes in the working tree. If
3797
+ # the user wants to revert changes in the index, they
3798
+ # need to unstage those first.
3799
+ if {$::ui_workdir eq $::current_diff_side } {
3800
+ set revert_state normal
3801
+ } else {
3802
+ set revert_state disabled
3803
+ }
3804
+ }
3805
+
3806
+ if {$last_revert eq {}} {
3807
+ set undo_state disabled
3808
+ } else {
3809
+ set undo_state normal
3750
3810
}
3811
+
3751
3812
$ctxm entryconf $::ui_diff_applyhunk -state $s -label $l
3752
3813
$ctxm entryconf $::ui_diff_applyline -state $s -label $t
3814
+ $ctxm entryconf $::ui_diff_revertline -state $revert_state \
3815
+ -label $r
3816
+ $ctxm entryconf $::ui_diff_reverthunk -state $revert_state \
3817
+ -label $h
3818
+ $ctxm entryconf $::ui_diff_undorevert -state $undo_state \
3819
+ -label $u
3820
+
3753
3821
tk_popup $ctxm $X $Y
3754
3822
}
3755
3823
}
@@ -3876,6 +3944,8 @@ bind . <$M1B-Key-j> do_revert_selection
3876
3944
bind . <$M1B -Key-J> do_revert_selection
3877
3945
bind . <$M1B -Key-i> do_add_all
3878
3946
bind . <$M1B -Key-I> do_add_all
3947
+ bind . <$M1B -Key-e> toggle_commit_type
3948
+ bind . <$M1B -Key-E> toggle_commit_type
3879
3949
bind . <$M1B -Key-minus> {show_less_context;break}
3880
3950
bind . <$M1B -Key-KP_Subtract> {show_less_context;break}
3881
3951
bind . <$M1B -Key-equal> {show_more_context;break}
@@ -3892,6 +3962,14 @@ foreach i [list $ui_index $ui_workdir] {
3892
3962
}
3893
3963
unset i
3894
3964
3965
+ bind . <Alt-Key-1> {focus_widget $::ui_workdir }
3966
+ bind . <Alt-Key-2> {focus_widget $::ui_index }
3967
+ bind . <Alt-Key-3> {focus $::ui_diff }
3968
+ bind . <Alt-Key-4> {focus $::ui_comm }
3969
+
3970
+ set file_lists_last_clicked($ui_index ) {}
3971
+ set file_lists_last_clicked($ui_workdir ) {}
3972
+
3895
3973
set file_lists($ui_index ) [ list ]
3896
3974
set file_lists($ui_workdir ) [ list ]
3897
3975
0 commit comments