[PATCH] git-gui: Modify push dialog to support Gerrit review

2013-09-12 Thread Joergen Edelbo
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

2013-09-06 Thread Joergen Edelbo
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

2013-09-04 Thread Joergen Edelbo
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} {
+