X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-gui.sh;h=c4ab824b9d860d06e0fe9239671cf2653cc4e396;hb=19e283f5c25b64a55fca099342f9bebddef4e17e;hp=5463bb98aedc213f11b1f52f60941a926424e1b5;hpb=fec4a78590229aab648e37195a071e3aae02bfe0;p=git.git diff --git a/git-gui.sh b/git-gui.sh index 5463bb98a..c4ab824b9 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -556,14 +556,17 @@ proc clear_diff {} { } proc reshow_diff {} { - global ui_status_value file_states + global ui_status_value file_states file_lists global current_diff_path current_diff_side - if {$current_diff_path eq {} - || [catch {set s $file_states($current_diff_path)}]} { + set p $current_diff_path + if {$p eq {} + || $current_diff_side eq {} + || [catch {set s $file_states($p)}] + || [lsearch -sorted $file_lists($current_diff_side) $p] == -1} { clear_diff } else { - show_diff $current_diff_path $current_diff_side + show_diff $p $current_diff_side } } @@ -705,7 +708,8 @@ proc read_diff {fd} { # if {[string match {@@@ *} $line]} {set is_3way_diff 1} - if {[string match {index *} $line]} { + if {[string match {index *} $line] + || [regexp {^\* Unmerged path } $line]} { set tags {} } elseif {$is_3way_diff} { set op [string range $line 0 1] @@ -893,12 +897,12 @@ The rescan will be automatically started now. _? {continue} A? - D? - - M? {set files_ready 1; break} + M? {set files_ready 1} U? { error_popup "Unmerged files cannot be committed. File [short_path $path] has merge conflicts. -You must resolve them and include the file before committing. +You must resolve them and add the file before committing. " unlock_index return @@ -912,9 +916,9 @@ File [short_path $path] cannot be committed by this program. } } if {!$files_ready} { - error_popup {No included files to commit. + info_popup {No changes to commit. -You must include at least 1 file before you can commit. +You must add at least 1 file before you can commit. } unlock_index return @@ -1320,20 +1324,27 @@ proc display_file {path state} { set new_m [lindex $s 0] set icon_name [lindex $s 1] - set s [string index $new_m 0] - if {$s eq {U}} { - set s _ + set o [string index $old_m 0] + set n [string index $new_m 0] + if {$o eq {U}} { + set o _ } - display_file_helper $ui_index $path $icon_name \ - [string index $old_m 0] $s + if {$n eq {U}} { + set n _ + } + display_file_helper $ui_index $path $icon_name $o $n + if {[string index $old_m 0] eq {U}} { + set o U + } else { + set o [string index $old_m 1] + } if {[string index $new_m 0] eq {U}} { - set s U + set n U } else { - set s [string index $new_m 1] + set n [string index $new_m 1] } - display_file_helper $ui_workdir $path $icon_name \ - [string index $old_m 1] $s + display_file_helper $ui_workdir $path $icon_name $o $n if {$new_m eq {__}} { unset file_states($path) @@ -1668,12 +1679,23 @@ proc populate_branch_menu {} { } } +proc all_tracking_branches {} { + global tracking_branches + + set all_trackings [list] + foreach b [array names tracking_branches] { + regsub ^refs/(heads|remotes)/ $b {} b + lappend all_trackings $b + } + return [lsort -unique $all_trackings] +} + proc do_create_branch_action {w} { global all_heads null_sha1 global create_branch_checkout create_branch_revtype global create_branch_head create_branch_trackinghead - set newbranch [string trim [$w.name.t get 0.0 end]] + set newbranch [string trim [$w.desc.name_t get 0.0 end]] if {![catch {exec git show-ref --verify -- "refs/heads/$newbranch"}]} { tk_messageBox \ -icon error \ @@ -1681,7 +1703,7 @@ proc do_create_branch_action {w} { -title [wm title $w] \ -parent $w \ -message "Branch '$newbranch' already exists." - focus $w.name.t + focus $w.desc.name_t return } if {[catch {exec git check-ref-format "heads/$newbranch"}]} { @@ -1691,7 +1713,7 @@ proc do_create_branch_action {w} { -title [wm title $w] \ -parent $w \ -message "We do not like '$newbranch' as a branch name." - focus $w.name.t + focus $w.desc.name_t return } @@ -1699,7 +1721,7 @@ proc do_create_branch_action {w} { switch -- $create_branch_revtype { head {set rev $create_branch_head} tracking {set rev $create_branch_trackinghead} - expression {set rev [string trim [$w.from.exp.t get 0.0 end]]} + expression {set rev [string trim [$w.from.exp_t get 0.0 end]]} } if {[catch {set cmt [exec git rev-parse --verify "${rev}^0"]}]} { tk_messageBox \ @@ -1736,7 +1758,7 @@ proc do_create_branch_action {w} { } proc do_create_branch {} { - global all_heads current_branch tracking_branches + global all_heads current_branch global create_branch_checkout create_branch_revtype global create_branch_head create_branch_trackinghead @@ -1765,20 +1787,21 @@ proc do_create_branch {} { pack $w.buttons.cancel -side right -padx 5 pack $w.buttons -side bottom -fill x -pady 10 -padx 10 - labelframe $w.name \ + labelframe $w.desc \ -text {Branch Description} \ -font font_ui - label $w.name.l -text {Name:} -font font_ui - text $w.name.t \ + label $w.desc.name_l -text {Name:} -font font_ui + text $w.desc.name_t \ -borderwidth 1 \ -relief sunken \ -height 1 \ -width 40 \ -font font_ui - bind $w.name.t "focus $w.postActions.checkout;break" - bind $w.name.t "focus $w.from.exp.t;break" - bind $w.name.t "do_create_branch_action $w;break" - bind $w.name.t { + grid $w.desc.name_l $w.desc.name_t -stick we -padx {0 5} + bind $w.desc.name_t "focus $w.postActions.checkout;break" + bind $w.desc.name_t "focus $w.from.exp_t;break" + bind $w.desc.name_t "do_create_branch_action $w;break" + bind $w.desc.name_t { if {{%K} ne {BackSpace} && {%K} ne {Tab} && {%K} ne {Escape} @@ -1787,63 +1810,48 @@ proc do_create_branch {} { if {[string first %A {~^:?*[}] >= 0} break } } - pack $w.name.l -side left -padx 5 - pack $w.name.t -side left -fill x -expand 1 - pack $w.name -anchor nw -fill x -pady 5 -padx 5 - - set all_trackings [list] - foreach b [array names tracking_branches] { - regsub ^refs/(heads|remotes)/ $b {} b - lappend all_trackings $b - } - set all_trackings [lsort -unique $all_trackings] - if {$all_trackings ne {}} { - set create_branch_trackinghead [lindex $all_trackings 0] - } + grid columnconfigure $w.desc 1 -weight 1 + pack $w.desc -anchor nw -fill x -pady 5 -padx 5 labelframe $w.from \ -text {Starting Revision} \ -font font_ui - frame $w.from.head - radiobutton $w.from.head.r \ + radiobutton $w.from.head_r \ -text {Local Branch:} \ -value head \ -variable create_branch_revtype \ -font font_ui - eval tk_optionMenu $w.from.head.m create_branch_head $all_heads - pack $w.from.head.r -side left - pack $w.from.head.m -side left - frame $w.from.tracking - radiobutton $w.from.tracking.r \ - -text {Tracking Branch:} \ - -value tracking \ - -variable create_branch_revtype \ - -font font_ui - eval tk_optionMenu $w.from.tracking.m \ - create_branch_trackinghead \ - $all_trackings - pack $w.from.tracking.r -side left - pack $w.from.tracking.m -side left - frame $w.from.exp - radiobutton $w.from.exp.r \ + eval tk_optionMenu $w.from.head_m create_branch_head $all_heads + grid $w.from.head_r $w.from.head_m -sticky w + set all_trackings [all_tracking_branches] + if {$all_trackings ne {}} { + set create_branch_trackinghead [lindex $all_trackings 0] + radiobutton $w.from.tracking_r \ + -text {Tracking Branch:} \ + -value tracking \ + -variable create_branch_revtype \ + -font font_ui + eval tk_optionMenu $w.from.tracking_m \ + create_branch_trackinghead \ + $all_trackings + grid $w.from.tracking_r $w.from.tracking_m -sticky w + } + radiobutton $w.from.exp_r \ -text {Revision Expression:} \ -value expression \ -variable create_branch_revtype \ -font font_ui - text $w.from.exp.t \ + text $w.from.exp_t \ -borderwidth 1 \ -relief sunken \ -height 1 \ -width 50 \ -font font_ui - bind $w.from.exp.t "focus $w.name.t;break" - bind $w.from.exp.t "focus $w.postActions.checkout;break" - bind $w.from.exp.t "do_create_branch_action $w;break" - pack $w.from.exp.r -side left - pack $w.from.exp.t -side left -fill x -expand 1 - pack $w.from.head -padx 5 -fill x -expand 1 - pack $w.from.tracking -padx 5 -fill x -expand 1 - pack $w.from.exp -padx 5 -fill x -expand 1 + grid $w.from.exp_r $w.from.exp_t -stick we -padx {0 5} + bind $w.from.exp_t "focus $w.desc.name_t;break" + bind $w.from.exp_t "focus $w.postActions.checkout;break" + bind $w.from.exp_t "do_create_branch_action $w;break" + grid columnconfigure $w.from 1 -weight 1 pack $w.from -anchor nw -fill x -pady 5 -padx 5 labelframe $w.postActions \ @@ -1856,7 +1864,7 @@ proc do_create_branch {} { pack $w.postActions.checkout -anchor nw pack $w.postActions -anchor nw -fill x -pady 5 -padx 5 - bind $w "grab $w; focus $w.name.t" + bind $w "grab $w; focus $w.desc.name_t" bind $w "destroy $w" bind $w "do_create_branch_action $w;break" wm title $w "[appname] ([reponame]): Create Branch" @@ -1865,16 +1873,34 @@ proc do_create_branch {} { proc do_delete_branch_action {w} { global all_heads - global delete_branch_checkhead delete_branch_head + global delete_branch_checktype delete_branch_head delete_branch_trackinghead + + set check_rev {} + switch -- $delete_branch_checktype { + head {set check_rev $delete_branch_head} + tracking {set check_rev $delete_branch_trackinghead} + always {set check_rev {:none}} + } + if {$check_rev eq {:none}} { + set check_cmt {} + } elseif {[catch {set check_cmt [exec git rev-parse --verify "${check_rev}^0"]}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "Invalid check revision: $check_rev" + return + } set to_delete [list] set not_merged [list] foreach i [$w.list.l curselection] { set b [$w.list.l get $i] if {[catch {set o [exec git rev-parse --verify $b]}]} continue - if {$delete_branch_checkhead} { - if {$b eq $delete_branch_head} continue - if {[catch {set m [exec git merge-base $o $delete_branch_head]}]} continue + if {$check_cmt ne {}} { + if {$b eq $check_rev} continue + if {[catch {set m [exec git merge-base $o $check_cmt]}]} continue if {$o ne $m} { lappend not_merged $b continue @@ -1883,7 +1909,7 @@ proc do_delete_branch_action {w} { lappend to_delete [list $b $o] } if {$not_merged ne {}} { - set msg "The following branches are not completely merged into $delete_branch_head: + set msg "The following branches are not completely merged into $check_rev: - [join $not_merged "\n - "]" tk_messageBox \ @@ -1894,7 +1920,7 @@ proc do_delete_branch_action {w} { -message $msg } if {$to_delete eq {}} return - if {!$delete_branch_checkhead} { + if {$delete_branch_checktype eq {always}} { set msg {Recovering deleted branches is difficult. Delete the selected branches?} @@ -1938,10 +1964,11 @@ Delete the selected branches?} proc do_delete_branch {} { global all_heads tracking_branches current_branch - global delete_branch_checkhead delete_branch_head + global delete_branch_checktype delete_branch_head delete_branch_trackinghead - set delete_branch_checkhead 1 + set delete_branch_checktype head set delete_branch_head $current_branch + set delete_branch_trackinghead {} set w .branch_editor toplevel $w @@ -1978,26 +2005,36 @@ proc do_delete_branch {} { pack $w.list.l -fill both -pady 5 -padx 5 pack $w.list -fill both -pady 5 -padx 5 - set all_trackings [list] - foreach b [array names tracking_branches] { - regsub ^refs/(heads|remotes)/ $b {} b - lappend all_trackings $b - } - labelframe $w.validate \ - -text {Only Delete If} \ + -text {Delete Only If} \ + -font font_ui + radiobutton $w.validate.head_r \ + -text {Merged Into Local Branch:} \ + -value head \ + -variable delete_branch_checktype \ -font font_ui - frame $w.validate.head - checkbutton $w.validate.head.r \ - -text {Already Merged Into:} \ - -variable delete_branch_checkhead \ + eval tk_optionMenu $w.validate.head_m delete_branch_head $all_heads + grid $w.validate.head_r $w.validate.head_m -sticky w + set all_trackings [all_tracking_branches] + if {$all_trackings ne {}} { + set delete_branch_trackinghead [lindex $all_trackings 0] + radiobutton $w.validate.tracking_r \ + -text {Merged Into Tracking Branch:} \ + -value tracking \ + -variable delete_branch_checktype \ + -font font_ui + eval tk_optionMenu $w.validate.tracking_m \ + delete_branch_trackinghead \ + $all_trackings + grid $w.validate.tracking_r $w.validate.tracking_m -sticky w + } + radiobutton $w.validate.always_r \ + -text {Always (Do not perform merge checks)} \ + -value always \ + -variable delete_branch_checktype \ -font font_ui - eval tk_optionMenu $w.validate.head.m delete_branch_head \ - $all_heads \ - [lsort -unique $all_trackings] - pack $w.validate.head.r -side left - pack $w.validate.head.m -side left - pack $w.validate.head -padx 5 -fill x -expand 1 + grid $w.validate.always_r -columnspan 2 -sticky w + grid columnconfigure $w.validate 1 -weight 1 pack $w.validate -anchor nw -fill x -pady 5 -padx 5 bind $w "grab $w; focus $w" @@ -3616,13 +3653,17 @@ label .vpane.files.index.title -text {Changes To Be Committed} \ -font font_ui text $ui_index -background white -borderwidth 0 \ -width 40 -height 10 \ + -wrap none \ -font font_ui \ -cursor $cursor_ptr \ - -yscrollcommand {.vpane.files.index.sb set} \ + -xscrollcommand {.vpane.files.index.sx set} \ + -yscrollcommand {.vpane.files.index.sy set} \ -state disabled -scrollbar .vpane.files.index.sb -command [list $ui_index yview] +scrollbar .vpane.files.index.sx -orient h -command [list $ui_index xview] +scrollbar .vpane.files.index.sy -orient v -command [list $ui_index yview] pack .vpane.files.index.title -side top -fill x -pack .vpane.files.index.sb -side right -fill y +pack .vpane.files.index.sx -side bottom -fill x +pack .vpane.files.index.sy -side right -fill y pack $ui_index -side left -fill both -expand 1 .vpane.files add .vpane.files.index -sticky nsew @@ -3634,13 +3675,17 @@ label .vpane.files.workdir.title -text {Changed But Not Updated} \ -font font_ui text $ui_workdir -background white -borderwidth 0 \ -width 40 -height 10 \ + -wrap none \ -font font_ui \ -cursor $cursor_ptr \ - -yscrollcommand {.vpane.files.workdir.sb set} \ + -xscrollcommand {.vpane.files.workdir.sx set} \ + -yscrollcommand {.vpane.files.workdir.sy set} \ -state disabled -scrollbar .vpane.files.workdir.sb -command [list $ui_workdir yview] +scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview] +scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview] pack .vpane.files.workdir.title -side top -fill x -pack .vpane.files.workdir.sb -side right -fill y +pack .vpane.files.workdir.sx -side bottom -fill x +pack .vpane.files.workdir.sy -side right -fill y pack $ui_workdir -side left -fill both -expand 1 .vpane.files add .vpane.files.workdir -sticky nsew @@ -3878,24 +3923,24 @@ pack $ui_diff -side left -fill both -expand 1 pack .vpane.lower.diff.header -side top -fill x pack .vpane.lower.diff.body -side bottom -fill both -expand 1 -$ui_diff tag conf d_@ -font font_diffbold -$ui_diff tag conf d_+ -foreground blue +$ui_diff tag conf d_@ -foreground blue -font font_diffbold +$ui_diff tag conf d_+ -foreground {#00a000} $ui_diff tag conf d_- -foreground red -$ui_diff tag conf d_++ -foreground blue +$ui_diff tag conf d_++ -foreground {#00a000} $ui_diff tag conf d_-- -foreground red $ui_diff tag conf d_+s \ - -foreground blue \ - -background azure2 + -foreground {#00a000} \ + -background {#e2effa} $ui_diff tag conf d_-s \ -foreground red \ - -background azure2 + -background {#e2effa} $ui_diff tag conf d_s+ \ - -foreground blue \ - -background {light goldenrod yellow} + -foreground {#00a000} \ + -background ivory1 $ui_diff tag conf d_s- \ -foreground red \ - -background {light goldenrod yellow} + -background ivory1 $ui_diff tag conf d<<<<<<< \ -foreground orange \ @@ -3907,10 +3952,16 @@ $ui_diff tag conf d>>>>>>> \ -foreground orange \ -font font_diffbold +$ui_diff tag raise sel + # -- Diff Body Context Menu # set ctxm .vpane.lower.diff.body.ctxm menu $ctxm -tearoff 0 +$ctxm add command \ + -label {Refresh} \ + -font font_ui \ + -command reshow_diff $ctxm add command \ -label {Copy} \ -font font_ui \