summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-07-05 06:23:53 (GMT)
committerShawn O. Pearce <spearce@spearce.org>2007-07-09 01:12:55 (GMT)
commitba1964be26b8b9e3441591257a2c87f5811d6b50 (patch)
tree75beedcb2e8fe66ff9bd7cf688a2b2417cabc99e /lib
parent7cf044266779d69d3a16322b4d505bc87267a005 (diff)
downloadgit-ba1964be26b8b9e3441591257a2c87f5811d6b50.zip
git-ba1964be26b8b9e3441591257a2c87f5811d6b50.tar.gz
git-ba1964be26b8b9e3441591257a2c87f5811d6b50.tar.bz2
git-gui: Automatically refresh tracking branches when needed
If the user is creating a new local branch and has selected to use a tracking branch as the starting revision they probably want to make sure they are using the absolute latest version available of that branch. We now offer a checkbox "Fetch Tracking Branch" (on by default) that instructs git-gui to run git-fetch on just that one branch before resolving the branch name into a commit SHA-1 and making (or updating) the local branch. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/branch_create.tcl58
-rw-r--r--lib/console.tcl44
2 files changed, 88 insertions, 14 deletions
diff --git a/lib/branch_create.tcl b/lib/branch_create.tcl
index df3f435..f708957 100644
--- a/lib/branch_create.tcl
+++ b/lib/branch_create.tcl
@@ -12,6 +12,7 @@ field name_type user; # type of branch name to use
field opt_merge ff; # type of merge to apply to existing branch
field opt_checkout 1; # automatically checkout the new branch?
+field opt_fetch 1; # refetch tracking branch if used?
field reset_ok 0; # did the user agree to reset?
constructor dialog {} {
@@ -87,6 +88,11 @@ constructor dialog {} {
pack $w.options.merge.reset -side left
pack $w.options.merge -anchor nw
+ checkbutton $w.options.fetch \
+ -text {Fetch Tracking Branch} \
+ -variable @opt_fetch
+ pack $w.options.fetch -anchor nw
+
checkbutton $w.options.checkout \
-text {Checkout After Creation} \
-variable @opt_checkout
@@ -107,15 +113,15 @@ constructor dialog {} {
}
method _create {} {
- global null_sha1 repo_config
- global all_heads current_branch
+ global repo_config current_branch
+ global M1B
+ set spec [$w_rev get_tracking_branch]
switch -- $name_type {
user {
set newbranch $name
}
match {
- set spec [$w_rev get_tracking_branch]
if {$spec eq {}} {
tk_messageBox \
-icon error \
@@ -171,6 +177,52 @@ method _create {} {
return
}
+ if {$spec ne {} && $opt_fetch} {
+ set l_trck [lindex $spec 0]
+ set remote [lindex $spec 1]
+ set r_head [lindex $spec 2]
+ regsub ^refs/heads/ $r_head {} r_head
+
+ set c $w.fetch_trck
+ toplevel $c
+ wm title $c "Refreshing Tracking Branch"
+ wm geometry $c "+[winfo rootx $w]+[winfo rooty $w]"
+
+ set e [::console::embed \
+ $c.console \
+ "Fetching $r_head from $remote"]
+ pack $c.console -fill both -expand 1
+ $e exec \
+ [list git fetch $remote +$r_head:$l_trck] \
+ [cb _finish_fetch $newbranch $c $e]
+
+ bind $c <Visibility> [list grab $c]
+ bind $c <$M1B-Key-w> break
+ bind $c <$M1B-Key-W> break
+ wm protocol $c WM_DELETE_WINDOW [cb _noop]
+ } else {
+ _finish_create $this $newbranch
+ }
+}
+
+method _noop {} {}
+
+method _finish_fetch {newbranch c e ok} {
+ wm protocol $c WM_DELETE_WINDOW {}
+
+ if {$ok} {
+ destroy $c
+ _finish_create $this $newbranch
+ } else {
+ $e done $ok
+ button $c.close -text Close -command [list destroy $c]
+ pack $c.close -side bottom -anchor e -padx 10 -pady 10
+ }
+}
+
+method _finish_create {newbranch} {
+ global null_sha1 all_heads
+
if {[catch {set new [$w_rev commit_or_die]}]} {
return
}
diff --git a/lib/console.tcl b/lib/console.tcl
index ce25d92..297e8de 100644
--- a/lib/console.tcl
+++ b/lib/console.tcl
@@ -7,6 +7,7 @@ field t_short
field t_long
field w
field console_cr
+field is_toplevel 1; # are we our own window?
constructor new {short_title long_title} {
set t_short $short_title
@@ -15,10 +16,25 @@ constructor new {short_title long_title} {
return $this
}
+constructor embed {path title} {
+ set t_short {}
+ set t_long $title
+ set w $path
+ set is_toplevel 0
+ _init $this
+ return $this
+}
+
method _init {} {
global M1B
- make_toplevel top w -autodelete 0
- wm title $top "[appname] ([reponame]): $t_short"
+
+ if {$is_toplevel} {
+ make_toplevel top w -autodelete 0
+ wm title $top "[appname] ([reponame]): $t_short"
+ } else {
+ frame $w
+ }
+
set console_cr 1.0
frame $w.m
@@ -57,15 +73,17 @@ method _init {} {
$w.m.t tag remove sel 0.0 end
"
- button $w.ok -text {Close} \
- -state disabled \
- -command "destroy $w"
- pack $w.ok -side bottom -anchor e -pady 10 -padx 10
+ if {$is_toplevel} {
+ button $w.ok -text {Close} \
+ -state disabled \
+ -command [list destroy $w]
+ pack $w.ok -side bottom -anchor e -pady 10 -padx 10
+ bind $w <Visibility> [list focus $w]
+ }
bind_button3 $w.m.t "tk_popup $w.ctxm %X %Y"
bind $w.m.t <$M1B-Key-a> "$w.m.t tag add sel 0.0 end;break"
bind $w.m.t <$M1B-Key-A> "$w.m.t tag add sel 0.0 end;break"
- bind $w <Visibility> "focus $w"
}
method exec {cmd {after {}}} {
@@ -159,16 +177,20 @@ method done {ok} {
if {$ok} {
if {[winfo exists $w.m.s]} {
$w.m.s conf -background green -text {Success}
- $w.ok conf -state normal
- focus $w.ok
+ if {$is_toplevel} {
+ $w.ok conf -state normal
+ focus $w.ok
+ }
}
} else {
if {![winfo exists $w.m.s]} {
_init $this
}
$w.m.s conf -background red -text {Error: Command Failed}
- $w.ok conf -state normal
- focus $w.ok
+ if {$is_toplevel} {
+ $w.ok conf -state normal
+ focus $w.ok
+ }
}
delete_this
}