summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-gui/git-gui.sh158
-rw-r--r--git-gui/lib/class.tcl3
-rw-r--r--git-gui/lib/merge.tcl2
3 files changed, 97 insertions, 66 deletions
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index 29a790e..fa30ccc 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -62,54 +62,6 @@ if {![catch {set _verbose $env(GITGUI_VERBOSE)}]} {
######################################################################
##
-## configure our library
-
-set oguilib {@@GITGUI_LIBDIR@@}
-set oguirel {@@GITGUI_RELATIVE@@}
-if {$oguirel eq {1}} {
- set oguilib [file dirname [file dirname [file normalize $argv0]]]
- set oguilib [file join $oguilib share git-gui lib]
-} elseif {[string match @@* $oguirel]} {
- set oguilib [file join [file dirname [file normalize $argv0]] lib]
-}
-
-set idx [file join $oguilib tclIndex]
-if {[catch {set fd [open $idx r]} err]} {
- catch {wm withdraw .}
- tk_messageBox \
- -icon error \
- -type ok \
- -title "git-gui: fatal error" \
- -message $err
- exit 1
-}
-if {[gets $fd] eq {# Autogenerated by git-gui Makefile}} {
- set idx [list]
- while {[gets $fd n] >= 0} {
- if {$n ne {} && ![string match #* $n]} {
- lappend idx $n
- }
- }
-} else {
- set idx {}
-}
-close $fd
-
-if {$idx ne {}} {
- set loaded [list]
- foreach p $idx {
- if {[lsearch -exact $loaded $p] >= 0} continue
- source [file join $oguilib $p]
- lappend loaded $p
- }
- unset loaded p
-} else {
- set auto_path [concat [list $oguilib] $auto_path]
-}
-unset -nocomplain oguirel idx fd
-
-######################################################################
-##
## read only globals
set _appname [lindex [file split $argv0] end]
@@ -532,7 +484,11 @@ if {$_git eq {}} {
if {[catch {set _git_version [git --version]} err]} {
catch {wm withdraw .}
- error_popup "Cannot determine Git version:
+ tk_messageBox \
+ -icon error \
+ -type ok \
+ -title "git-gui: fatal error" \
+ -message "Cannot determine Git version:
$err
@@ -541,7 +497,11 @@ $err
}
if {![regsub {^git version } $_git_version {} _git_version]} {
catch {wm withdraw .}
- error_popup "Cannot parse Git version string:\n\n$_git_version"
+ tk_messageBox \
+ -icon error \
+ -type ok \
+ -title "git-gui: fatal error" \
+ -message "Cannot parse Git version string:\n\n$_git_version"
exit 1
}
@@ -619,7 +579,11 @@ proc git-version {args} {
if {[git-version < 1.5]} {
catch {wm withdraw .}
- error_popup "[appname] requires Git 1.5.0 or later.
+ tk_messageBox \
+ -icon error \
+ -type ok \
+ -title "git-gui: fatal error" \
+ -message "[appname] requires Git 1.5.0 or later.
You are using [git-version]:
@@ -629,6 +593,54 @@ You are using [git-version]:
######################################################################
##
+## configure our library
+
+set oguilib {@@GITGUI_LIBDIR@@}
+set oguirel {@@GITGUI_RELATIVE@@}
+if {$oguirel eq {1}} {
+ set oguilib [file dirname [file dirname [file normalize $argv0]]]
+ set oguilib [file join $oguilib share git-gui lib]
+} elseif {[string match @@* $oguirel]} {
+ set oguilib [file join [file dirname [file normalize $argv0]] lib]
+}
+
+set idx [file join $oguilib tclIndex]
+if {[catch {set fd [open $idx r]} err]} {
+ catch {wm withdraw .}
+ tk_messageBox \
+ -icon error \
+ -type ok \
+ -title "git-gui: fatal error" \
+ -message $err
+ exit 1
+}
+if {[gets $fd] eq {# Autogenerated by git-gui Makefile}} {
+ set idx [list]
+ while {[gets $fd n] >= 0} {
+ if {$n ne {} && ![string match #* $n]} {
+ lappend idx $n
+ }
+ }
+} else {
+ set idx {}
+}
+close $fd
+
+if {$idx ne {}} {
+ set loaded [list]
+ foreach p $idx {
+ if {[lsearch -exact $loaded $p] >= 0} continue
+ source [file join $oguilib $p]
+ lappend loaded $p
+ }
+ unset loaded p
+} else {
+ set auto_path [concat [list $oguilib] $auto_path]
+}
+unset -nocomplain oguirel idx fd
+
+######################################################################
+##
## feature option selection
if {[regexp {^git-(.+)$} [appname] _junk subcommand]} {
@@ -691,7 +703,15 @@ if {![file isdirectory $_gitdir]} {
error_popup "Git directory not found:\n\n$_gitdir"
exit 1
}
-if {![is_enabled bare]} {
+if {$_prefix ne {}} {
+ regsub -all {[^/]+/} $_prefix ../ cdup
+ if {[catch {cd $cdup} err]} {
+ catch {wm withdraw .}
+ error_popup "Cannot move to top of working directory:\n\n$err"
+ exit 1
+ }
+ unset cdup
+} elseif {![is_enabled bare]} {
if {[lindex [file split $_gitdir] end] ne {.git}} {
catch {wm withdraw .}
error_popup "Cannot use funny .git directory:\n\n$_gitdir"
@@ -726,6 +746,7 @@ set empty_tree {}
set current_branch {}
set is_detached 0
set current_diff_path {}
+set is_3way_diff 0
set selected_commit_type new
######################################################################
@@ -1936,6 +1957,12 @@ if {$browser ne {}} {
}
unset browser doc_path doc_url
+set root_exists 0
+bind . <Visibility> {
+ bind . <Visibility> {}
+ set root_exists 1
+}
+
# -- Standard bindings
#
wm protocol . WM_DELETE_WINDOW do_quit
@@ -2410,23 +2437,26 @@ $ctxm add separator
$ctxm add command -label {Options...} \
-command do_options
proc popup_diff_menu {ctxm x y X Y} {
- global current_diff_path
+ global current_diff_path file_states
set ::cursorX $x
set ::cursorY $y
if {$::ui_index eq $::current_diff_side} {
- $ctxm entryconf $::ui_diff_applyhunk \
- -state normal \
- -label {Unstage Hunk From Commit}
- } elseif {![info exists file_states($current_diff_path)]
- || {_O} eq [lindex $file_states($::current_diff_path) 0]} {
- $ctxm entryconf $::ui_diff_applyhunk \
- -state disabled \
- -label {Stage Hunk For Commit}
+ set s normal
+ set l "Unstage Hunk From Commit"
} else {
- $ctxm entryconf $::ui_diff_applyhunk \
- -state normal \
- -label {Stage Hunk For Commit}
+ if {$current_diff_path eq {}
+ || ![info exists file_states($current_diff_path)]
+ || {_O} eq [lindex $file_states($current_diff_path) 0]} {
+ set s disabled
+ } else {
+ set s normal
+ }
+ set l "Stage Hunk For Commit"
+ }
+ if {$::is_3way_diff} {
+ set s disabled
}
+ $ctxm entryconf $::ui_diff_applyhunk -state $s -label $l
tk_popup $ctxm $X $Y
}
bind_button3 $ui_diff [list popup_diff_menu $ctxm %x %y %X %Y]
diff --git a/git-gui/lib/class.tcl b/git-gui/lib/class.tcl
index 24e8cec..dc21411 100644
--- a/git-gui/lib/class.tcl
+++ b/git-gui/lib/class.tcl
@@ -148,11 +148,12 @@ proc make_toplevel {t w args} {
}
}
- if {[winfo ismapped .]} {
+ if {$::root_exists || [winfo ismapped .]} {
regsub -all {::} $this {__} w
set top .$w
set pfx $top
toplevel $top
+ set ::root_exists 1
} else {
set top .
set pfx {}
diff --git a/git-gui/lib/merge.tcl b/git-gui/lib/merge.tcl
index 5de0d82..0e50919 100644
--- a/git-gui/lib/merge.tcl
+++ b/git-gui/lib/merge.tcl
@@ -114,7 +114,7 @@ method _start {} {
lappend cmd --strategy=recursive
lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]]
lappend cmd HEAD
- lappend cmd $cmit
+ lappend cmd $name
set msg "Merging $current_branch and $stitle"
ui_status "$msg..."