X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-gui.sh;h=aa8f0ba067a0bdb041fc854be3ebf9eb0f7c0f84;hb=a4b1786b954917294483feb176e6ca473e01b615;hp=a1002ecab850fa654c61403f16835c0bd8d3763e;hpb=833eda736ad1ec99c30b2c4d7a565ccc406c97a0;p=git.git diff --git a/git-gui.sh b/git-gui.sh index a1002ecab..aa8f0ba06 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -524,24 +524,6 @@ proc rescan_done {fd buf after} { prune_selection unlock_index display_all_files - - if {$repo_config(gui.partialinclude) ne {true}} { - set pathList [list] - foreach path [array names file_states] { - switch -- [lindex $file_states($path) 0] { - A? - - M? {lappend pathList $path} - } - } - if {$pathList ne {}} { - update_index \ - "Updating included files" \ - $pathList \ - [concat {reshow_diff;} $after] - return - } - } - reshow_diff uplevel #0 $after } @@ -561,33 +543,37 @@ proc prune_selection {} { ## diff proc clear_diff {} { - global ui_diff current_diff ui_index ui_workdir + global ui_diff current_diff_path ui_index ui_workdir $ui_diff conf -state normal $ui_diff delete 0.0 end $ui_diff conf -state disabled - set current_diff {} + set current_diff_path {} $ui_index tag remove in_diff 0.0 end $ui_workdir tag remove in_diff 0.0 end } proc reshow_diff {} { - global current_diff ui_status_value file_states - - if {$current_diff eq {} - || [catch {set s $file_states($current_diff)}]} { + global ui_status_value file_states file_lists + global current_diff_path current_diff_side + + 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 + show_diff $p $current_diff_side } } proc handle_empty_diff {} { - global current_diff file_states file_lists + global current_diff_path file_states file_lists - set path $current_diff + set path $current_diff_path set s $file_states($path) if {[lindex $s 0] ne {_M}} return @@ -613,10 +599,11 @@ files list, to prevent possible confusion. display_file $path __ } -proc show_diff {path {w {}} {lno {}}} { +proc show_diff {path w {lno {}}} { global file_states file_lists global is_3way_diff diff_active repo_config - global ui_diff current_diff ui_status_value + global ui_diff ui_status_value ui_index ui_workdir + global current_diff_path current_diff_side if {$diff_active || ![lock_index read]} return @@ -638,21 +625,13 @@ proc show_diff {path {w {}} {lno {}}} { set m [lindex $s 0] set is_3way_diff 0 set diff_active 1 - set current_diff $path + set current_diff_path $path + set current_diff_side $w set ui_status_value "Loading diff of [escape_path $path]..." - set cmd [list | git diff-index] - lappend cmd --no-color - if {$repo_config(gui.diffcontext) > 0} { - lappend cmd "-U$repo_config(gui.diffcontext)" - } - lappend cmd -p - - switch $m { - MM { - lappend cmd -c - } - _O { + # - Git won't give us the diff, there's nothing to compare to! + # + if {$m eq {_O}} { if {[catch { set fd [open $path r] set content [read $fd] @@ -672,9 +651,27 @@ proc show_diff {path {w {}} {lno {}}} { set ui_status_value {Ready.} return } + + set cmd [list | git] + if {$w eq $ui_index} { + lappend cmd diff-index + lappend cmd --cached + } elseif {$w eq $ui_workdir} { + if {[string index $m 0] eq {U}} { + lappend cmd diff + } else { + lappend cmd diff-files + } } - lappend cmd [PARENT] + lappend cmd -p + lappend cmd --no-color + if {$repo_config(gui.diffcontext) > 0} { + lappend cmd "-U$repo_config(gui.diffcontext)" + } + if {$w eq $ui_index} { + lappend cmd [PARENT] + } lappend cmd -- lappend cmd $path @@ -699,6 +696,7 @@ proc read_diff {fd} { # -- Cleanup uninteresting diff header lines. # if {[string match {diff --git *} $line]} continue + if {[string match {diff --cc *} $line]} continue if {[string match {diff --combined *} $line]} continue if {[string match {--- *} $line]} continue if {[string match {+++ *} $line]} continue @@ -710,27 +708,49 @@ proc read_diff {fd} { # if {[string match {@@@ *} $line]} {set is_3way_diff 1} - # -- Reformat a 3 way diff, 'cause its too weird. - # - if {$is_3way_diff} { + if {[string match {index *} $line]} { + set tags {} + } elseif {$is_3way_diff} { set op [string range $line 0 1] switch -- $op { + { } {set tags {}} {@@} {set tags d_@} - {++} {set tags d_+ ; set op { +}} - {--} {set tags d_- ; set op { -}} - { +} {set tags d_++; set op {++}} - { -} {set tags d_--; set op {--}} - {+ } {set tags d_-+; set op {-+}} - {- } {set tags d_+-; set op {+-}} - default {set tags {}} + { +} {set tags d_s+} + { -} {set tags d_s-} + {+ } {set tags d_+s} + {- } {set tags d_-s} + {--} {set tags d_--} + {++} { + if {[regexp {^\+\+([<>]{7} |={7})} $line _g op]} { + set line [string replace $line 0 1 { }] + set tags d$op + } else { + set tags d_++ + } + } + default { + puts "error: Unhandled 3 way diff marker: {$op}" + set tags {} + } } - set line [string replace $line 0 1 $op] } else { - switch -- [string index $line 0] { - @ {set tags d_@} - + {set tags d_+} - - {set tags d_-} - default {set tags {}} + set op [string index $line 0] + switch -- $op { + { } {set tags {}} + {@} {set tags d_@} + {-} {set tags d_-} + {+} { + if {[regexp {^\+([<>]{7} |={7})} $line _g op]} { + set line [string replace $line 0 0 { }] + set tags d$op + } else { + set tags d_+ + } + } + default { + puts "error: Unhandled 2 way diff marker: {$op}" + set tags {} + } } } $ui_diff insert end $line $tags @@ -843,6 +863,7 @@ proc committer_ident {} { proc commit_tree {} { global HEAD commit_type file_states ui_comm repo_config + global ui_status_value pch_error if {![lock_index update]} return if {[committer_ident] eq {}} return @@ -918,33 +939,8 @@ A good commit message has the following format: return } - # -- Update included files if partialincludes are off. + # -- Run the pre-commit hook. # - if {$repo_config(gui.partialinclude) ne {true}} { - set pathList [list] - foreach path [array names file_states] { - switch -glob -- [lindex $file_states($path) 0] { - A? - - M? {lappend pathList $path} - } - } - if {$pathList ne {}} { - unlock_index - update_index \ - "Updating included files" \ - $pathList \ - [concat {lock_index update;} \ - [list commit_prehook $curHEAD $msg]] - return - } - } - - commit_prehook $curHEAD $msg -} - -proc commit_prehook {curHEAD msg} { - global ui_status_value pch_error - set pchook [gitdir hooks pre-commit] # On Cygwin [file executable] might lie so we need to ask @@ -1327,12 +1323,27 @@ proc display_file {path state} { set new_m [lindex $s 0] set icon_name [lindex $s 1] - display_file_helper $ui_index $path $icon_name \ - [string index $old_m 0] \ - [string index $new_m 0] - display_file_helper $ui_workdir $path $icon_name \ - [string index $old_m 1] \ - [string index $new_m 1] + set o [string index $old_m 0] + set n [string index $new_m 0] + if {$o eq {U}} { + set o _ + } + 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 n U + } else { + set n [string index $new_m 1] + } + display_file_helper $ui_workdir $path $icon_name $o $n if {$new_m eq {__}} { unset file_states($path) @@ -1372,13 +1383,20 @@ proc display_all_files {} { set m [lindex $s 0] set icon_name [lindex $s 1] - if {[string index $m 0] ne {_}} { + set s [string index $m 0] + if {$s ne {U} && $s ne {_}} { display_all_files_helper $ui_index $path \ - $icon_name [string index $m 0] + $icon_name $s } - if {[string index $m 1] ne {_}} { + + if {[string index $m 0] eq {U}} { + set s U + } else { + set s [string index $m 1] + } + if {$s ne {_}} { display_all_files_helper $ui_workdir $path \ - $icon_name [string index $m 1] + $icon_name $s } } @@ -1421,7 +1439,7 @@ proc update_indexinfo {msg pathList after} { proc write_update_indexinfo {fd pathList totalCnt batch msg after} { global update_index_cp ui_status_value - global file_states current_diff + global file_states current_diff_path if {$update_index_cp >= $totalCnt} { close $fd @@ -1493,7 +1511,7 @@ proc update_index {msg pathList after} { proc write_update_index {fd pathList totalCnt batch msg after} { global update_index_cp ui_status_value - global file_states current_diff + global file_states current_diff_path if {$update_index_cp >= $totalCnt} { close $fd @@ -1513,7 +1531,13 @@ proc write_update_index {fd pathList totalCnt batch msg after} { ?D {set new D_} _O - AM {set new A_} - U_ - + U? { + if {[file exists $path]} { + set new M_ + } else { + set new D_ + } + } ?M {set new M_} ?? {continue} } @@ -1569,7 +1593,7 @@ proc checkout_index {msg pathList after} { proc write_checkout_index {fd pathList totalCnt batch msg after} { global update_index_cp ui_status_value - global file_states current_diff + global file_states current_diff_path if {$update_index_cp >= $totalCnt} { close $fd @@ -1622,9 +1646,25 @@ proc load_all_heads {} { set all_heads [lsort $all_heads] } -proc populate_branch_menu {m} { +proc populate_branch_menu {} { global all_heads disable_on_lock + set m .mbar.branch + set last [$m index last] + for {set i 0} {$i <= $last} {incr i} { + if {[$m type $i] eq {separator}} { + $m delete $i last + set new_dol [list] + foreach a $disable_on_lock { + if {[lindex $a 0] ne $m || [lindex $a 2] < $i} { + lappend new_dol $a + } + } + set disable_on_lock $new_dol + break + } + } + $m add separator foreach b $all_heads { $m add radiobutton \ @@ -1638,12 +1678,342 @@ proc populate_branch_menu {m} { } } +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]] + if {![catch {exec git show-ref --verify -- "refs/heads/$newbranch"}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "Branch '$newbranch' already exists." + focus $w.name.t + return + } + if {[catch {exec git check-ref-format "heads/$newbranch"}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "We do not like '$newbranch' as a branch name." + focus $w.name.t + return + } + + set rev {} + 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]]} + } + if {[catch {set cmt [exec git rev-parse --verify "${rev}^0"]}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "Invalid starting revision: $rev" + return + } + set cmd [list git update-ref] + lappend cmd -m + lappend cmd "branch: Created from $rev" + lappend cmd "refs/heads/$newbranch" + lappend cmd $cmt + lappend cmd $null_sha1 + if {[catch {eval exec $cmd} err]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "Failed to create '$newbranch'.\n\n$err" + return + } + + lappend all_heads $newbranch + set all_heads [lsort $all_heads] + populate_branch_menu + destroy $w + if {$create_branch_checkout} { + switch_branch $newbranch + } +} + proc do_create_branch {} { - error "NOT IMPLEMENTED" + global all_heads current_branch tracking_branches + global create_branch_checkout create_branch_revtype + global create_branch_head create_branch_trackinghead + + set create_branch_checkout 1 + set create_branch_revtype head + set create_branch_head $current_branch + set create_branch_trackinghead {} + + set w .branch_editor + toplevel $w + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + + label $w.header -text {Create New Branch} \ + -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons + button $w.buttons.create -text Create \ + -font font_ui \ + -default active \ + -command [list do_create_branch_action $w] + pack $w.buttons.create -side right + button $w.buttons.cancel -text {Cancel} \ + -font font_ui \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + labelframe $w.name \ + -text {Branch Description} \ + -font font_ui + label $w.name.l -text {Name:} -font font_ui + text $w.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 { + if {{%K} ne {BackSpace} + && {%K} ne {Tab} + && {%K} ne {Escape} + && {%K} ne {Return}} { + if {%k <= 32} break + 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] + } + + labelframe $w.from \ + -text {Starting Revision} \ + -font font_ui + frame $w.from.head + 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 \ + -text {Revision Expression:} \ + -value expression \ + -variable create_branch_revtype \ + -font font_ui + 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 + pack $w.from -anchor nw -fill x -pady 5 -padx 5 + + labelframe $w.postActions \ + -text {Post Creation Actions} \ + -font font_ui + checkbutton $w.postActions.checkout \ + -text {Checkout after creation} \ + -variable create_branch_checkout \ + -font font_ui + 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 "destroy $w" + bind $w "do_create_branch_action $w;break" + wm title $w "[appname] ([reponame]): Create Branch" + tkwait window $w +} + +proc do_delete_branch_action {w} { + global all_heads + global delete_branch_checkhead delete_branch_head + + 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 {$o ne $m} { + lappend not_merged $b + continue + } + } + lappend to_delete [list $b $o] + } + if {$not_merged ne {}} { + set msg "The following branches are not completely merged into $delete_branch_head: + + - [join $not_merged "\n - "]" + tk_messageBox \ + -icon info \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message $msg + } + if {$to_delete eq {}} return + if {!$delete_branch_checkhead} { + set msg {Recovering deleted branches is difficult. + +Delete the selected branches?} + if {[tk_messageBox \ + -icon warning \ + -type yesno \ + -title [wm title $w] \ + -parent $w \ + -message $msg] ne yes} { + return + } + } + + set failed {} + foreach i $to_delete { + set b [lindex $i 0] + set o [lindex $i 1] + if {[catch {exec git update-ref -d "refs/heads/$b" $o} err]} { + append failed " - $b: $err\n" + } else { + set x [lsearch -sorted $all_heads $b] + if {$x >= 0} { + set all_heads [lreplace $all_heads $x $x] + } + } + } + + if {$failed ne {}} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message "Failed to delete branches:\n$failed" + } + + set all_heads [lsort $all_heads] + populate_branch_menu + destroy $w } proc do_delete_branch {} { - error "NOT IMPLEMENTED" + global all_heads tracking_branches current_branch + global delete_branch_checkhead delete_branch_head + + set delete_branch_checkhead 1 + set delete_branch_head $current_branch + + set w .branch_editor + toplevel $w + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + + label $w.header -text {Delete Local Branch} \ + -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons + button $w.buttons.create -text Delete \ + -font font_ui \ + -command [list do_delete_branch_action $w] + pack $w.buttons.create -side right + button $w.buttons.cancel -text {Cancel} \ + -font font_ui \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + labelframe $w.list \ + -text {Local Branches} \ + -font font_ui + listbox $w.list.l \ + -height 10 \ + -width 50 \ + -selectmode extended \ + -font font_ui + foreach h $all_heads { + if {$h ne $current_branch} { + $w.list.l insert end $h + } + } + 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} \ + -font font_ui + frame $w.validate.head + checkbutton $w.validate.head.r \ + -text {Already Merged Into:} \ + -variable delete_branch_checkhead \ + -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 + pack $w.validate -anchor nw -fill x -pady 5 -padx 5 + + bind $w "grab $w; focus $w" + bind $w "destroy $w" + wm title $w "[appname] ([reponame]): Delete Branch" + tkwait window $w } proc switch_branch {b} { @@ -1932,6 +2302,7 @@ set all_icons(U$ui_index) file_merge set all_icons(_$ui_workdir) file_plain set all_icons(M$ui_workdir) file_mod set all_icons(D$ui_workdir) file_question +set all_icons(U$ui_workdir) file_merge set all_icons(O$ui_workdir) file_plain set max_status_desc 0 @@ -1953,6 +2324,7 @@ foreach i { {DO "Staged for removal, still present"} {U_ "Requires merge resolution"} + {UU "Requires merge resolution"} {UM "Requires merge resolution"} {UD "Requires merge resolution"} } { @@ -2268,7 +2640,7 @@ proc do_rescan {} { } proc unstage_helper {txt paths} { - global file_states current_diff + global file_states current_diff_path if {![lock_index begin-update]} return @@ -2280,7 +2652,7 @@ proc unstage_helper {txt paths} { M? - D? { lappend pathList $path - if {$path eq $current_diff} { + if {$path eq $current_diff_path} { set after {reshow_diff;} } } @@ -2297,21 +2669,21 @@ proc unstage_helper {txt paths} { } proc do_unstage_selection {} { - global current_diff selected_paths + global current_diff_path selected_paths if {[array size selected_paths] > 0} { unstage_helper \ {Unstaging selected files from commit} \ [array names selected_paths] - } elseif {$current_diff ne {}} { + } elseif {$current_diff_path ne {}} { unstage_helper \ - "Unstaging [short_path $current_diff] from commit" \ - [list $current_diff] + "Unstaging [short_path $current_diff_path] from commit" \ + [list $current_diff_path] } } proc add_helper {txt paths} { - global file_states current_diff + global file_states current_diff_path if {![lock_index begin-update]} return @@ -2324,7 +2696,7 @@ proc add_helper {txt paths} { ?D - U? { lappend pathList $path - if {$path eq $current_diff} { + if {$path eq $current_diff_path} { set after {reshow_diff;} } } @@ -2341,16 +2713,16 @@ proc add_helper {txt paths} { } proc do_add_selection {} { - global current_diff selected_paths + global current_diff_path selected_paths if {[array size selected_paths] > 0} { add_helper \ {Adding selected files} \ [array names selected_paths] - } elseif {$current_diff ne {}} { + } elseif {$current_diff_path ne {}} { add_helper \ - "Adding [short_path $current_diff]" \ - [list $current_diff] + "Adding [short_path $current_diff_path]" \ + [list $current_diff_path] } } @@ -2369,7 +2741,7 @@ proc do_add_all {} { } proc revert_helper {txt paths} { - global file_states current_diff + global file_states current_diff_path if {![lock_index begin-update]} return @@ -2381,7 +2753,7 @@ proc revert_helper {txt paths} { ?M - ?D { lappend pathList $path - if {$path eq $current_diff} { + if {$path eq $current_diff_path} { set after {reshow_diff;} } } @@ -2420,16 +2792,16 @@ Any unadded changes will be permanently lost by the revert." \ } proc do_revert_selection {} { - global current_diff selected_paths + global current_diff_path selected_paths if {[array size selected_paths] > 0} { revert_helper \ {Reverting selected files} \ [array names selected_paths] - } elseif {$current_diff ne {}} { + } elseif {$current_diff_path ne {}} { revert_helper \ - "Reverting [short_path $current_diff]" \ - [list $current_diff] + "Reverting [short_path $current_diff_path]" \ + [list $current_diff_path] } } @@ -2582,7 +2954,7 @@ proc do_options {} { button $w.buttons.cancel -text {Cancel} \ -font font_ui \ -command [list destroy $w] - pack $w.buttons.cancel -side right + pack $w.buttons.cancel -side right -padx 5 pack $w.buttons -side bottom -fill x -pady 10 -padx 10 labelframe $w.repo -text "[reponame] Repository" \ @@ -2595,7 +2967,6 @@ proc do_options {} { pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5 foreach option { - {b partialinclude {Allow Partially Added Files}} {b pullsummary {Show Pull Summary}} {b trustmtime {Trust File Modification Timestamps}} {i diffcontext {Number of Diff Context Lines}} @@ -2812,7 +3183,7 @@ proc do_macosx_app {} { } proc toggle_or_diff {w x y} { - global file_states file_lists current_diff ui_index ui_workdir + global file_states file_lists current_diff_path ui_index ui_workdir global last_clicked selected_paths set pos [split [$w index @$x,$y] .] @@ -2830,7 +3201,7 @@ proc toggle_or_diff {w x y} { $ui_workdir tag remove in_sel 0.0 end if {$col == 0} { - if {$current_diff eq $path} { + if {$current_diff_path eq $path} { set after {reshow_diff;} } else { set after {} @@ -2955,7 +3326,6 @@ proc apply_config {} { set default_config(gui.trustmtime) false set default_config(gui.pullsummary) true -set default_config(gui.partialinclude) false set default_config(gui.diffcontext) 5 set default_config(gui.fontui) [font configure font_ui] set default_config(gui.fontdiff) [font configure font_diff] @@ -3071,6 +3441,7 @@ if {!$single_commit} { .mbar.branch add command -label {Create...} \ -command do_create_branch \ + -accelerator $M1T-N \ -font font_ui lappend disable_on_lock [list .mbar.branch entryconf \ [.mbar.branch index last] -state] @@ -3436,17 +3807,17 @@ bind_button3 $ui_comm "tk_popup $ctxm %X %Y" # -- Diff Header # -set current_diff {} +set current_diff_path {} set diff_actions [list] -proc trace_current_diff {varname args} { - global current_diff diff_actions file_states - if {$current_diff eq {}} { +proc trace_current_diff_path {varname args} { + global current_diff_path diff_actions file_states + if {$current_diff_path eq {}} { set s {} set f {} set p {} set o disabled } else { - set p $current_diff + set p $current_diff_path set s [mapdesc [lindex $file_states($p) 0] $p] set f {File:} set p [escape_path $p] @@ -3460,7 +3831,7 @@ proc trace_current_diff {varname args} { uplevel #0 $w $o } } -trace add variable current_diff write trace_current_diff +trace add variable current_diff_path write trace_current_diff_path frame .vpane.lower.diff.header -background orange label .vpane.lower.diff.header.status \ @@ -3492,7 +3863,7 @@ $ctxm add command \ clipboard append \ -format STRING \ -type STRING \ - -- $current_diff + -- $current_diff_path } lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] bind_button3 .vpane.lower.diff.header.path "tk_popup $ctxm %X %Y" @@ -3518,16 +3889,33 @@ 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 red -$ui_diff tag conf d_++ -foreground {#00a000} -$ui_diff tag conf d_-- -foreground {#a000a0} -$ui_diff tag conf d_+- \ - -foreground red \ - -background {light goldenrod yellow} -$ui_diff tag conf d_-+ \ +$ui_diff tag conf d_+ -foreground blue +$ui_diff tag conf d_- -foreground red + +$ui_diff tag conf d_++ -foreground blue +$ui_diff tag conf d_-- -foreground red +$ui_diff tag conf d_+s \ -foreground blue \ -background azure2 +$ui_diff tag conf d_-s \ + -foreground red \ + -background azure2 +$ui_diff tag conf d_s+ \ + -foreground blue \ + -background {light goldenrod yellow} +$ui_diff tag conf d_s- \ + -foreground red \ + -background {light goldenrod yellow} + +$ui_diff tag conf d<<<<<<< \ + -foreground orange \ + -font font_diffbold +$ui_diff tag conf d======= \ + -foreground orange \ + -font font_diffbold +$ui_diff tag conf d>>>>>>> \ + -foreground orange \ + -font font_diffbold # -- Diff Body Context Menu # @@ -3638,6 +4026,11 @@ bind $ui_diff {catch {%W yview scroll 1 units};break} bind $ui_diff {catch {%W xview scroll -1 units};break} bind $ui_diff {catch {%W xview scroll 1 units};break} +if {!$single_commit} { + bind . <$M1B-Key-n> do_create_branch + bind . <$M1B-Key-N> do_create_branch +} + bind . do_quit bind all do_rescan bind all <$M1B-Key-r> do_rescan @@ -3667,7 +4060,7 @@ set MERGE_HEAD [list] set commit_type {} set empty_tree {} set current_branch {} -set current_diff {} +set current_diff_path {} set selected_commit_type new wm title . "[appname] ([file normalize [file dirname [gitdir]]])" @@ -3734,7 +4127,7 @@ if {!$single_commit} { load_all_remotes load_all_heads - populate_branch_menu .mbar.branch + populate_branch_menu populate_fetch_menu .mbar.fetch populate_pull_menu .mbar.pull populate_push_menu .mbar.push