A suggested name is provided when creating a new "following" branch. Signed-off-by: Pierre Dumuid <pmdumuid@xxxxxxxxx> --- gitk | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/gitk b/gitk index 50d1ef4..36cba49 100755 --- a/gitk +++ b/gitk @@ -2673,6 +2673,7 @@ proc makewindow {} { {mc "Rename this branch" command mvbranch} {mc "Remove this branch" command rmbranch} {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}} + {mc "Follow this branch" command follow_remote_branch_dialog} } $headctxmenu configure -tearoff 0 @@ -9947,23 +9948,100 @@ proc headmenu {x y id head} { stopfinding set headmenuid $id set headmenuhead $head - array set state {0 normal 1 normal 2 normal} + array set state {0 normal 1 normal 2 normal 3 normal} if {[string match "remotes/*" $head]} { set localhead [string range $head [expr [string last / $head] + 1] end] if {[info exists headids($localhead)]} { set state(0) disabled } - array set state {1 disabled 2 disabled} + array set state {1 disabled 2 disabled 3 normal} } if {$head eq $mainhead} { - array set state {0 disabled 2 disabled} + array set state {0 disabled 2 disabled 3 disabled} + } else { + set state(3) disabled } - foreach i {0 1 2} { + foreach i {0 1 2 3} { $headctxmenu entryconfigure $i -state $state($i) } tk_popup $headctxmenu $x $y } +proc follow_remote_branch_dialog {} { + global headmenuhead NS + + # check the tree is clean first?? + nowbusy createFollowingBranch [mc "Creating following branch"] + update + dohidelocalchanges + + set top .create_following_branch + catch {destroy $top} + ttk_toplevel $top + make_transient $top . + + ${NS}::label $top.title -text [mc "Create following branch"] + grid $top.title - -pady 10 + + ${NS}::label $top.remote_branch_name_label -text [mc "Remote Branch:"] + ${NS}::entry $top.remote_branch_name -width 40 + $top.remote_branch_name insert 0 $headmenuhead + $top.remote_branch_name conf -state readonly + grid $top.remote_branch_name_label $top.remote_branch_name -sticky w + + ${NS}::label $top.new_branch_name_label -text [mc "Name:"] + ${NS}::entry $top.new_branch_name -width 40 + set suggested_name $headmenuhead + regsub {^remotes/[^/]*/} $suggested_name {} suggested_name + $top.new_branch_name insert 0 $suggested_name + grid $top.new_branch_name_label $top.new_branch_name -sticky w + + set actionCreate [list follow_remote_branch_callback $top] + set actionCancel "catch {notbusy createFollowingBranch; destroy $top}" + + ${NS}::frame $top.buts + ${NS}::button $top.buts.go -text [mc "Create"] -command $actionCreate + ${NS}::button $top.buts.can -text [mc "Cancel"] -command $actionCancel + grid $top.buts.go $top.buts.can + grid columnconfigure $top.buts 0 -weight 1 -uniform a + grid columnconfigure $top.buts 1 -weight 1 -uniform a + grid $top.buts - -pady 10 -sticky ew + + bind $top <Key-Return> $actionCreate + bind $top <Key-Escape> $actionCancel + + focus $top.new_branch_name +} + +proc follow_remote_branch_callback {top} { + global headids idheads NS + set new_branch_name [$top.new_branch_name get] + set remote_branch_name [$top.remote_branch_name get] + set cmdargs {} + + if {$new_branch_name eq {}} { + error_popup [mc "Please specify a name for the new branch"] $top + return + } + if {[info exists headids($new_branch_name)]} { + error_popup [mc "The branch name you specified already exists, please specify a new name"] $top + return + } + catch {destroy $top} + + lappend cmdargs $new_branch_name $remote_branch_name + + if {[catch { + eval exec git branch --track $cmdargs + } err]} { + notbusy createFollowingBranch + error_popup $err + } else { + notbusy createFollowingBranch + updatecommits + } +} + proc cobranch {} { global headmenuid headmenuhead headids global showlocalchanges -- 2.10.2