[PATCH] git-gui: Modify push dialog to support Gerrit review
Problem: It is not possible to push for Gerrit review as you will always try to push to "refs/heads/..." on the remote. Changes done: Add an option in the Push dialog to select "Gerrit review" and a corresponding entry for a branch name. If this option is selected, push the changes to "refs/for//". In this way the local branch names will be used as topic branches on Gerrit. If you are on a detached HEAD, then add a "HEAD" entry in the branch selection list. If this is selected, push HEAD:HEAD in the normal case and HEAD:refs/for/ in the Gerrit case. The Gerrit branch to push to is controlled by gerrit.reviewbranch configuration option. --- Hi again, Seems like this discussion has died out. Is there no perspective in changing git-gui to support Gerrit better? Anyway here is what I consider my final shot at a solution. Compared to the last one, this commit can handle the case when you work on a detached HEAD, and the Gerrit branch to push to is handled by a configuration option. BR Jørgen Edelbo git-gui.sh|1 + lib/option.tcl|1 + lib/transport.tcl | 48 +--- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/git-gui.sh b/git-gui.sh index b62ae4a..3228654 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -901,6 +901,7 @@ set default_config(gui.diffcontext) 5 set default_config(gui.diffopts) {} set default_config(gui.commitmsgwidth) 75 set default_config(gui.newbranchtemplate) {} +set default_config(gerrit.reviewbranch) {} set default_config(gui.spellingdictionary) {} set default_config(gui.fontui) [font configure font_ui] set default_config(gui.fontdiff) [font configure font_diff] diff --git a/lib/option.tcl b/lib/option.tcl index 23c9ae7..ffa4226 100644 --- a/lib/option.tcl +++ b/lib/option.tcl @@ -157,6 +157,7 @@ proc do_options {} { {t gui.diffopts {mc "Additional Diff Parameters"}} {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}} {t gui.newbranchtemplate {mc "New Branch Name Template"}} + {t gerrit.reviewbranch {mc "Gerrit Review Branch"}} {c gui.encoding {mc "Default File Contents Encoding"}} {b gui.warndetachedcommit {mc "Warn before committing to a detached head"}} {s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}} diff --git a/lib/transport.tcl b/lib/transport.tcl index e5d211e..9b1cfc5 100644 --- a/lib/transport.tcl +++ b/lib/transport.tcl @@ -61,6 +61,7 @@ proc push_to {remote} { proc start_push_anywhere_action {w} { global push_urltype push_remote push_url push_thin push_tags + global gerrit_review gerrit_branch global push_force global repo_config @@ -95,7 +96,19 @@ proc start_push_anywhere_action {w} { set cnt 0 foreach i [$w.source.l curselection] { set b [$w.source.l get $i] - lappend cmd "refs/heads/$b:refs/heads/$b" + if {$gerrit_review && $gerrit_branch ne {}} { + switch $b { + $gerrit_branch { lappend cmd "refs/heads/$b:refs/for/$gerrit_branch" } + HEAD{ lappend cmd "HEAD:refs/for/$gerrit_branch" } + default { lappend cmd "refs/heads/$b:refs/for/$gerrit_branch/$b" } + } + } else { + if {$b eq HEAD} { + lappend cmd "HEAD:HEAD" + } else { + lappend cmd "refs/heads/$b:refs/heads/$b" + } + } incr cnt } if {$cnt == 0} { @@ -118,9 +131,10 @@ trace add variable push_remote write \ [list radio_selector push_urltype remote] proc do_push_anywhere {} { - global all_remotes current_branch + global all_remotes current_branch is_detached global push_urltype push_remote push_url push_thin push_tags - global push_force use_ttk NS + global gerrit_review gerrit_branch + global push_force use_ttk NS repo_config set w .push_setup toplevel $w @@ -149,6 +163,11 @@ proc do_push_anywhere {} { -height 10 \ -width 70 \ -selectmode extended + if {$is_detached} { + $w.source.l insert end HEAD + $w.source.l select set end + $w.source.l yview end + } foreach h [load_all_heads] { $w.source.l insert end $h if {$h eq $current_branch} { @@ -215,13 +234,36 @@ proc do_push_anywhere {} { -text [mc "Include tags"] \ -variable push_tags grid $w.options.tags -columnspan 2 -sticky
[PATCH] git-gui: Modify push dialog to support Gerrit review
Problem: It is not possible to push for Gerrit review as you will always try to push to "refs/heads/..." on the remote. Changes done: Add an option to select "Gerrit review" and a corresponding entry for a branch name. If this option is selected, push the changes to "refs/for//". In this way the local branch names will be used as topic branches on Gerrit. --- Hi all, This is a second attempt to support Gerrit review. It is fully backwards compatible as the Gerrit option is an addition only. It is also better than the first approach as it supports pushing more local branches to Gerrit - each having their own topic branch there. Further improvement could be to make the Gerrit branch specification a drop down list, but I would like to have this first simple approach evaluated first. BR Joergen lib/transport.tcl | 30 +- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/transport.tcl b/lib/transport.tcl index e5d211e..adf2bbb 100644 --- a/lib/transport.tcl +++ b/lib/transport.tcl @@ -61,6 +61,7 @@ proc push_to {remote} { proc start_push_anywhere_action {w} { global push_urltype push_remote push_url push_thin push_tags + global gerrit_review gerrit_branch global push_force global repo_config @@ -95,7 +96,15 @@ proc start_push_anywhere_action {w} { set cnt 0 foreach i [$w.source.l curselection] { set b [$w.source.l get $i] - lappend cmd "refs/heads/$b:refs/heads/$b" + if {$gerrit_review && $gerrit_branch ne {}} { + if {$gerrit_branch eq $b} { + lappend cmd "refs/heads/$b:refs/for/$b" + } else { + lappend cmd "refs/heads/$b:refs/for/$gerrit_branch/$b" + } + } else { + lappend cmd "refs/heads/$b:refs/heads/$b" + } incr cnt } if {$cnt == 0} { @@ -120,6 +129,7 @@ trace add variable push_remote write \ proc do_push_anywhere {} { global all_remotes current_branch global push_urltype push_remote push_url push_thin push_tags + global gerrit_review gerrit_branch global push_force use_ttk NS set w .push_setup @@ -215,6 +225,24 @@ proc do_push_anywhere {} { -text [mc "Include tags"] \ -variable push_tags grid $w.options.tags -columnspan 2 -sticky w + ${NS}::checkbutton $w.options.gerrit \ + -text [mc "Gerrit review. Branch: "] \ + -variable gerrit_review + ${NS}::entry $w.options.gerrit_br \ + -width 50 \ + -textvariable gerrit_branch \ + -validate key \ + -validatecommand { + if {%d == 1 && [regexp {\s} %S]} {return 0} + if {%d == 1 && [string length %S] > 0} { + set gerrit_review 1 + } + if {[string length %P] == 0} { + set gerrit_review 0 + } + return 1 + } + grid $w.options.gerrit $w.options.gerrit_br -sticky we -padx {0 5} grid columnconfigure $w.options 1 -weight 1 pack $w.options -anchor nw -fill x -pady 5 -padx 5 -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] git-gui: Modify push dialog to support Gerrit review
Problem: It is not possible to push for Gerrit review as you will always try to push to /refs/heads/... on the remote. As you should not be forced to work on a branch with the same name as some branch on the remote, some more flexibility in the selection of destination branch is also needed. Changes done: Remove selection of branches to push - push always HEAD. This can be justified by the fact that this far the most common thing to do. Specify both the remote repository to push to as well as the specific branch on that remote. This gives the flexibility. Add option to specify "Gerrit review". If selected, replace the traditional "heads" with the artificial "for" in the destination ref spec. This is what actually solved the trigger problem. Limit the branches to select from to the known branches for currently selected remote. This is motivated in better usability. Works only when "usettk" is true - it is left for further study how to change the values in tk_optionMenu on the fly. Signed-off-by: Joergen Edelbo --- Hi there, We are at Napatech A/S just about to roll out a Git/Gerrit/Jenkins solution. It will really help the gui oriented people in pushing commits if this can be done directly in git-gui. BR Joergen Edelbo Napatech A/S lib/transport.tcl | 184 + 1 file changed, 142 insertions(+), 42 deletions(-) diff --git a/lib/transport.tcl b/lib/transport.tcl index e5d211e..4c20ef7 100644 --- a/lib/transport.tcl +++ b/lib/transport.tcl @@ -59,20 +59,42 @@ proc push_to {remote} { console::exec $w $cmd } -proc start_push_anywhere_action {w} { - global push_urltype push_remote push_url push_thin push_tags - global push_force - global repo_config - - set is_mirror 0 - set r_url {} +proc get_remote_rep {} { + global push_urltype push_remote push_url + set rep {} switch -- $push_urltype { - remote { - set r_url $push_remote - catch {set is_mirror $repo_config(remote.$push_remote.mirror)} + remote { set rep $push_remote } + url{ set rep $push_url } } - url {set r_url $push_url} + return $rep +} + +proc get_remote_branch {} { + global push_branchtype push_branch push_new + set branch {} + switch -- $push_branchtype { + existing { set branch $push_branch } + create { set branch $push_new } + } + return $branch +} + +proc get_remote_ref_spec {} { + global gerrit_review + set push_branch [get_remote_branch] + if {$gerrit_review} { + return "refs/for/$push_branch" + } else { + return "refs/heads/$push_branch" } +} + +proc start_push_anywhere_action {w} { + global push_thin push_tags push_force + global repo_config current_branch is_detached + + set is_mirror 0 + set r_url [get_remote_rep] if {$r_url eq {}} return set cmd [list git push] @@ -87,28 +109,25 @@ proc start_push_anywhere_action {w} { lappend cmd --tags } lappend cmd $r_url + + catch {set is_mirror $repo_config(remote.$r_url.mirror)} if {$is_mirror} { set cons [console::new \ [mc "push %s" $r_url] \ [mc "Mirroring to %s" $r_url]] } else { - set cnt 0 - foreach i [$w.source.l curselection] { - set b [$w.source.l get $i] - lappend cmd "refs/heads/$b:refs/heads/$b" - incr cnt - } - if {$cnt == 0} { - return - } elseif {$cnt == 1} { - set unit branch + if {$is_detached} { + set src HEAD } else { - set unit branches + set src $current_branch } + set dest [get_remote_ref_spec] + + lappend cmd "$src:$dest" set cons [console::new \ [mc "push %s" $r_url] \ - [mc "Pushing %s %s to %s" $cnt $unit $r_url]] + [mc "Pushing %s to %s" $src $dest]] } console::exec $cons $cmd destroy $w @@ -117,10 +136,58 @@ proc start_push_anywhere_action {w} { trace add variable push_remote write \ [list radio_selector push_urltype remote] +proc update_branchtype {br} { + global current_branch push_branch push_branchtype + if {$br eq {}} { + set push_branchtype create + set push_branch {} + } else { + set push_branchtype existing + if {[lsearch -sorted -exact $br $current_branch] != -1} { +