diff --git a/git-gui.sh b/git-gui.sh
index 212a093118e42d3e31f0e5c25df2eb5655b88a47..1d342392abfbd36de6b588077acb3c4a693171f0 100755 (executable)
--- a/git-gui.sh
+++ b/git-gui.sh
# Tcl ignores the next line -*- tcl -*- \
exec wish "$0" -- "$@"
+set appvers {@@GIT_VERSION@@}
set copyright {
Copyright © 2006, 2007 Shawn Pearce, Paul Mackerras.
-All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
-This program is free software; it may be used, copied, modified
-and distributed under the terms of the GNU General Public Licence,
-either version 2, or (at your option) any later version.}
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
-set appvers {@@GITGUI_VERSION@@}
-set appname [lindex [file split $argv0] end]
-set gitdir {}
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA}
+
+######################################################################
+##
+## read only globals
+
+set _appname [lindex [file split $argv0] end]
+set _gitdir {}
+set _reponame {}
+
+proc appname {} {
+ global _appname
+ return $_appname
+}
+
+proc gitdir {args} {
+ global _gitdir
+ if {$args eq {}} {
+ return $_gitdir
+ }
+ return [eval [concat [list file join $_gitdir] $args]]
+}
+
+proc reponame {} {
+ global _reponame
+ return $_reponame
+}
######################################################################
##
}
proc error_popup {msg} {
- global gitdir appname
-
- set title $appname
- if {$gitdir ne {}} {
- append title { (}
- append title [lindex \
- [file split [file normalize [file dirname $gitdir]]] \
- end]
- append title {)}
+ set title [appname]
+ if {[reponame] ne {}} {
+ append title " ([reponame])"
}
set cmd [list tk_messageBox \
-icon error \
}
proc warn_popup {msg} {
- global gitdir appname
-
- set title $appname
- if {$gitdir ne {}} {
- append title { (}
- append title [lindex \
- [file split [file normalize [file dirname $gitdir]]] \
- end]
- append title {)}
+ set title [appname]
+ if {[reponame] ne {}} {
+ append title " ([reponame])"
}
set cmd [list tk_messageBox \
-icon warning \
}
proc info_popup {msg} {
- global gitdir appname
-
- set title $appname
- if {$gitdir ne {}} {
- append title { (}
- append title [lindex \
- [file split [file normalize [file dirname $gitdir]]] \
- end]
- append title {)}
+ set title [appname]
+ if {[reponame] ne {}} {
+ append title " ([reponame])"
}
tk_messageBox \
-parent . \
-message $msg
}
+proc ask_popup {msg} {
+ set title [appname]
+ if {[reponame] ne {}} {
+ append title " ([reponame])"
+ }
+ return [tk_messageBox \
+ -parent . \
+ -icon question \
+ -type yesno \
+ -title $title \
+ -message $msg]
+}
+
######################################################################
##
## repository setup
-if { [catch {set gitdir $env(GIT_DIR)}]
- && [catch {set gitdir [exec git rev-parse --git-dir]} err]} {
+if { [catch {set _gitdir $env(GIT_DIR)}]
+ && [catch {set _gitdir [exec git rev-parse --git-dir]} err]} {
catch {wm withdraw .}
error_popup "Cannot find the git directory:\n\n$err"
exit 1
}
-if {![file isdirectory $gitdir]} {
+if {![file isdirectory $_gitdir]} {
catch {wm withdraw .}
- error_popup "Git directory not found:\n\n$gitdir"
+ error_popup "Git directory not found:\n\n$_gitdir"
exit 1
}
-if {[lindex [file split $gitdir] end] ne {.git}} {
+if {[lindex [file split $_gitdir] end] ne {.git}} {
catch {wm withdraw .}
error_popup "Cannot use funny .git directory:\n\n$gitdir"
exit 1
}
-if {[catch {cd [file dirname $gitdir]} err]} {
+if {[catch {cd [file dirname $_gitdir]} err]} {
catch {wm withdraw .}
- error_popup "No working directory [file dirname $gitdir]:\n\n$err"
+ error_popup "No working directory [file dirname $_gitdir]:\n\n$err"
exit 1
}
+set _reponame [lindex [file split \
+ [file normalize [file dirname $_gitdir]]] \
+ end]
set single_commit 0
-if {$appname eq {git-citool}} {
+if {[appname] eq {git-citool}} {
set single_commit 1
}
## status
proc repository_state {ctvar hdvar mhvar} {
- global gitdir current_branch
+ global current_branch
upvar $ctvar ct $hdvar hd $mhvar mh
set mh [list]
return
}
- set merge_head [file join $gitdir MERGE_HEAD]
+ set merge_head [gitdir MERGE_HEAD]
if {[file exists $merge_head]} {
set ct merge
set fd_mh [open $merge_head r]
proc rescan {after} {
global HEAD PARENT MERGE_HEAD commit_type
- global ui_index ui_other ui_status_value ui_comm
+ global ui_index ui_workdir ui_status_value ui_comm
global rescan_active file_states
global repo_config
}
proc rescan_stage2 {fd after} {
- global gitdir ui_status_value
+ global ui_status_value
global rescan_active buf_rdi buf_rdf buf_rlo
if {$fd ne {}} {
set ls_others [list | git ls-files --others -z \
--exclude-per-directory=.gitignore]
- set info_exclude [file join $gitdir info exclude]
+ set info_exclude [gitdir info exclude]
if {[file readable $info_exclude]} {
lappend ls_others "--exclude-from=$info_exclude"
}
}
proc load_message {file} {
- global gitdir ui_comm
+ global ui_comm
- set f [file join $gitdir $file]
+ set f [gitdir $file]
if {[file isfile $f]} {
if {[catch {set fd [open $f r]}]} {
return 0
## diff
proc clear_diff {} {
- global ui_diff current_diff ui_index ui_other
+ global ui_diff current_diff ui_index ui_workdir
$ui_diff conf -state normal
$ui_diff delete 0.0 end
set current_diff {}
$ui_index tag remove in_diff 0.0 end
- $ui_other tag remove in_diff 0.0 end
+ $ui_workdir tag remove in_diff 0.0 end
}
proc reshow_diff {} {
}
clear_diff
- set old_w [mapcol [lindex $file_states($path) 0] $path]
- set lno [lsearch -sorted $file_lists($old_w) $path]
- if {$lno >= 0} {
- set file_lists($old_w) \
- [lreplace $file_lists($old_w) $lno $lno]
- incr lno
- $old_w conf -state normal
- $old_w delete $lno.0 [expr {$lno + 1}].0
- $old_w conf -state disabled
- }
+ display_file $path __
}
proc show_diff {path {w {}} {lno {}}} {
}
proc commit_prehook {curHEAD msg} {
- global gitdir ui_status_value pch_error
+ global ui_status_value pch_error
- set pchook [file join $gitdir hooks pre-commit]
+ set pchook [gitdir hooks pre-commit]
# On Cygwin [file executable] might lie so we need to ask
# the shell if the hook is executable. Yes that's annoying.
proc commit_committree {fd_wt curHEAD msg} {
global HEAD PARENT MERGE_HEAD commit_type
- global single_commit gitdir
+ global single_commit
global ui_status_value ui_comm selected_commit_type
global file_states selected_paths rescan_active
# -- Cleanup after ourselves.
#
- catch {file delete [file join $gitdir MERGE_HEAD]}
- catch {file delete [file join $gitdir MERGE_MSG]}
- catch {file delete [file join $gitdir SQUASH_MSG]}
- catch {file delete [file join $gitdir GITGUI_MSG]}
+ catch {file delete [gitdir MERGE_HEAD]}
+ catch {file delete [gitdir MERGE_MSG]}
+ catch {file delete [gitdir SQUASH_MSG]}
+ catch {file delete [gitdir GITGUI_MSG]}
# -- Let rerere do its thing.
#
- if {[file isdirectory [file join $gitdir rr-cache]]} {
+ if {[file isdirectory [gitdir rr-cache]]} {
catch {exec git rerere}
}
# -- Run the post-commit hook.
#
- set pchook [file join $gitdir hooks post-commit]
+ set pchook [gitdir hooks post-commit]
if {[is_Windows] && [file isfile $pchook]} {
set pchook [list sh -c [concat \
"if test -x \"$pchook\";" \
__ -
A_ -
M_ -
- DD {
+ D_ {
unset file_states($path)
catch {unset selected_paths($path)}
}
AM -
AD -
MM -
- MD -
- DM {
+ MD {
set file_states($path) [list \
_[string index $m 1] \
[lindex $s 1] \
##
## ui helpers
-proc mapcol {state path} {
- global all_cols ui_other
-
- if {[catch {set r $all_cols($state)}]} {
- puts "error: no column for state={$state} $path"
- return $ui_other
- }
- return $r
-}
-
-proc mapicon {state path} {
+proc mapicon {w state path} {
global all_icons
- if {[catch {set r $all_icons($state)}]} {
- puts "error: no icon for state={$state} $path"
+ if {[catch {set r $all_icons($state$w)}]} {
+ puts "error: no icon for $w state={$state} $path"
return file_plain
}
return $r
return $state
}
+proc display_file_helper {w path icon_name old_m new_m} {
+ global file_lists
+
+ if {$new_m eq {_}} {
+ set lno [lsearch -sorted $file_lists($w) $path]
+ if {$lno >= 0} {
+ set file_lists($w) [lreplace $file_lists($w) $lno $lno]
+ incr lno
+ $w conf -state normal
+ $w delete $lno.0 [expr {$lno + 1}].0
+ $w conf -state disabled
+ }
+ } elseif {$old_m eq {_} && $new_m ne {_}} {
+ lappend file_lists($w) $path
+ set file_lists($w) [lsort -unique $file_lists($w)]
+ set lno [lsearch -sorted $file_lists($w) $path]
+ incr lno
+ $w conf -state normal
+ $w image create $lno.0 \
+ -align center -padx 5 -pady 1 \
+ -name $icon_name \
+ -image [mapicon $w $new_m $path]
+ $w insert $lno.1 "[escape_path $path]\n"
+ $w conf -state disabled
+ } elseif {$old_m ne $new_m} {
+ $w conf -state normal
+ $w image conf $icon_name -image [mapicon $w $new_m $path]
+ $w conf -state disabled
+ }
+}
+
proc display_file {path state} {
- global file_states file_lists selected_paths
+ global file_states selected_paths
+ global ui_index ui_workdir
set old_m [merge_state $path $state]
set s $file_states($path)
set new_m [lindex $s 0]
- set new_w [mapcol $new_m $path]
- set old_w [mapcol $old_m $path]
- set new_icon [mapicon $new_m $path]
+ set icon_name [lindex $s 1]
+
+ display_file_helper $ui_index $path $icon_name \
+ [string index $old_m 0] \
+ [string index $new_m 0]
+ display_file_helper $ui_workdir $path $icon_name \
+ [string index $old_m 1] \
+ [string index $new_m 1]
if {$new_m eq {__}} {
- set lno [lsearch -sorted $file_lists($old_w) $path]
- if {$lno >= 0} {
- set file_lists($old_w) \
- [lreplace $file_lists($old_w) $lno $lno]
- incr lno
- $old_w conf -state normal
- $old_w delete $lno.0 [expr {$lno + 1}].0
- $old_w conf -state disabled
- }
unset file_states($path)
catch {unset selected_paths($path)}
- return
}
+}
- if {$new_w ne $old_w} {
- set lno [lsearch -sorted $file_lists($old_w) $path]
- if {$lno >= 0} {
- set file_lists($old_w) \
- [lreplace $file_lists($old_w) $lno $lno]
- incr lno
- $old_w conf -state normal
- $old_w delete $lno.0 [expr {$lno + 1}].0
- $old_w conf -state disabled
- }
+proc display_all_files_helper {w path icon_name m} {
+ global file_lists
- lappend file_lists($new_w) $path
- set file_lists($new_w) [lsort $file_lists($new_w)]
- set lno [lsearch -sorted $file_lists($new_w) $path]
- incr lno
- $new_w conf -state normal
- $new_w image create $lno.0 \
- -align center -padx 5 -pady 1 \
- -name [lindex $s 1] \
- -image $new_icon
- $new_w insert $lno.1 "[escape_path $path]\n"
- if {[catch {set in_sel $selected_paths($path)}]} {
- set in_sel 0
- }
- if {$in_sel} {
- $new_w tag add in_sel $lno.0 [expr {$lno + 1}].0
- }
- $new_w conf -state disabled
- } elseif {$new_icon ne [mapicon $old_m $path]} {
- $new_w conf -state normal
- $new_w image conf [lindex $s 1] -image $new_icon
- $new_w conf -state disabled
- }
+ lappend file_lists($w) $path
+ set lno [expr {[lindex [split [$w index end] .] 0] - 1}]
+ $w image create end \
+ -align center -padx 5 -pady 1 \
+ -name $icon_name \
+ -image [mapicon $w $m $path]
+ $w insert end "[escape_path $path]\n"
}
proc display_all_files {} {
- global ui_index ui_other
+ global ui_index ui_workdir
global file_states file_lists
global last_clicked selected_paths
$ui_index conf -state normal
- $ui_other conf -state normal
+ $ui_workdir conf -state normal
$ui_index delete 0.0 end
- $ui_other delete 0.0 end
+ $ui_workdir delete 0.0 end
set last_clicked {}
set file_lists($ui_index) [list]
- set file_lists($ui_other) [list]
+ set file_lists($ui_workdir) [list]
foreach path [lsort [array names file_states]] {
set s $file_states($path)
set m [lindex $s 0]
- set w [mapcol $m $path]
- lappend file_lists($w) $path
- set lno [expr {[lindex [split [$w index end] .] 0] - 1}]
- $w image create end \
- -align center -padx 5 -pady 1 \
- -name [lindex $s 1] \
- -image [mapicon $m $path]
- $w insert end "[escape_path $path]\n"
- if {[catch {set in_sel $selected_paths($path)}]} {
- set in_sel 0
+ set icon_name [lindex $s 1]
+
+ if {[string index $m 0] ne {_}} {
+ display_all_files_helper $ui_index $path \
+ $icon_name [string index $m 0]
}
- if {$in_sel} {
- $w tag add in_sel $lno.0 [expr {$lno + 1}].0
+ if {[string index $m 1] ne {_}} {
+ display_all_files_helper $ui_workdir $path \
+ $icon_name [string index $m 1]
}
}
$ui_index conf -state disabled
- $ui_other conf -state disabled
+ $ui_workdir conf -state disabled
}
proc update_indexinfo {msg pathList after} {
AD -
MD -
UD -
- _D {set new DD}
+ _D {set new D_}
_M -
MM -
## remote management
proc load_all_remotes {} {
- global gitdir repo_config
+ global repo_config
global all_remotes tracking_branches
set all_remotes [list]
array unset tracking_branches
- set rm_dir [file join $gitdir remotes]
+ set rm_dir [gitdir remotes]
if {[file isdirectory $rm_dir]} {
set all_remotes [glob \
-types f \
}
proc populate_fetch_menu {m} {
- global gitdir all_remotes repo_config
+ global all_remotes repo_config
foreach r $all_remotes {
set enable 0
}
} else {
catch {
- set fd [open [file join $gitdir remotes $r] r]
+ set fd [open [gitdir remotes $r] r]
while {[gets $fd n] >= 0} {
if {[regexp {^Pull:[ \t]*([^:]+):} $n]} {
set enable 1
}
proc populate_push_menu {m} {
- global gitdir all_remotes repo_config
+ global all_remotes repo_config
foreach r $all_remotes {
set enable 0
}
} else {
catch {
- set fd [open [file join $gitdir remotes $r] r]
+ set fd [open [gitdir remotes $r] r]
while {[gets $fd n] >= 0} {
if {[regexp {^Push:[ \t]*([^:]+):} $n]} {
set enable 1
}
proc populate_pull_menu {m} {
- global gitdir repo_config all_remotes disable_on_lock
+ global repo_config all_remotes disable_on_lock
foreach remote $all_remotes {
set rb_list [list]
}
} else {
catch {
- set fd [open [file join $gitdir remotes $remote] r]
+ set fd [open [gitdir remotes $remote] r]
while {[gets $fd line] >= 0} {
if {[regexp {^Pull:[ \t]*([^:]+):} $line line rb]} {
lappend rb_list $rb
} -maskdata $filemask
set ui_index .vpane.files.index.list
-set ui_other .vpane.files.other.list
+set ui_workdir .vpane.files.workdir.list
+
+set all_icons(_$ui_index) file_plain
+set all_icons(A$ui_index) file_fulltick
+set all_icons(M$ui_index) file_fulltick
+set all_icons(D$ui_index) file_removed
+set all_icons(U$ui_index) file_merge
+
+set all_icons(_$ui_workdir) file_plain
+set all_icons(M$ui_workdir) file_mod
+set all_icons(D$ui_workdir) file_question
+set all_icons(O$ui_workdir) file_plain
+
set max_status_desc 0
foreach i {
- {__ i plain "Unmodified"}
- {_M i mod "Modified"}
- {M_ i fulltick "Added to commit"}
- {MM i parttick "Partially included"}
- {MD i question "Added (but gone)"}
-
- {_O o plain "Untracked"}
- {A_ o fulltick "Added by commit"}
- {AM o parttick "Partially added"}
- {AD o question "Added (but gone)"}
-
- {_D i question "Missing"}
- {DD i removed "Removed by commit"}
- {D_ i removed "Removed by commit"}
- {DO i removed "Removed (still exists)"}
- {DM i removed "Removed (but modified)"}
-
- {UD i merge "Merge conflicts"}
- {UM i merge "Merge conflicts"}
- {U_ i merge "Merge conflicts"}
+ {__ "Unmodified"}
+
+ {_M "Modified, not staged"}
+ {M_ "Staged for commit"}
+ {MM "Portions staged for commit"}
+ {MD "Staged for commit, missing"}
+
+ {_O "Untracked, not staged"}
+ {A_ "Staged for commit"}
+ {AM "Portions staged for commit"}
+ {AD "Staged for commit, missing"}
+
+ {_D "Missing"}
+ {D_ "Staged for removal"}
+ {DO "Staged for removal, still present"}
+
+ {U_ "Requires merge resolution"}
+ {UM "Requires merge resolution"}
+ {UD "Requires merge resolution"}
} {
- if {$max_status_desc < [string length [lindex $i 3]]} {
- set max_status_desc [string length [lindex $i 3]]
- }
- if {[lindex $i 1] eq {i}} {
- set all_cols([lindex $i 0]) $ui_index
- } else {
- set all_cols([lindex $i 0]) $ui_other
+ if {$max_status_desc < [string length [lindex $i 1]]} {
+ set max_status_desc [string length [lindex $i 1]]
}
- set all_icons([lindex $i 0]) file_[lindex $i 2]
- set all_descs([lindex $i 0]) [lindex $i 3]
+ set all_descs([lindex $i 0]) [lindex $i 1]
}
-unset filemask i
+unset i
######################################################################
##
}
proc hook_failed_popup {hook msg} {
- global gitdir appname
-
set w .hookfail
toplevel $w
bind $w <Visibility> "grab $w; focus $w"
bind $w <Key-Return> "destroy $w"
- wm title $w "$appname ([lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]): error"
+ wm title $w "[appname] ([reponame]): error"
tkwait window $w
}
}
proc console_init {w} {
- global console_cr console_data
- global gitdir appname M1B
+ global console_cr console_data M1B
set console_cr($w) 1.0
toplevel $w
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"
- wm title $w "$appname ([lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]): [lindex $console_data($w) 0]"
+ wm title $w "[appname] ([reponame]): [lindex $console_data($w) 0]"
return $w
}
##
## ui commands
-set starting_gitk_msg {Please wait... Starting gitk...}
+set starting_gitk_msg {Starting gitk... please wait...}
proc do_gitk {revs} {
global ui_status_value starting_gitk_msg
set is_quitting 0
proc do_quit {} {
- global gitdir ui_comm is_quitting repo_config commit_type
+ global ui_comm is_quitting repo_config commit_type
if {$is_quitting} return
set is_quitting 1
# -- Stash our current commit buffer.
#
- set save [file join $gitdir GITGUI_MSG]
+ set save [gitdir GITGUI_MSG]
set msg [string trim [$ui_comm get 0.0 end]]
if {![string match amend* $commit_type]
&& [$ui_comm edit modified]
}
proc revert_helper {txt paths} {
- global gitdir appname
global file_states current_diff
if {![lock_index begin-update]} return
set s "these $n files"
}
- set reponame [lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]
-
set reply [tk_dialog \
.confirm_revert \
- "$appname ($reponame)" \
+ "[appname] ([reponame])" \
"Revert changes in $s?
Any unadded changes will be permanently lost by the revert." \
}
proc do_about {} {
- global appname appvers copyright
+ global appvers copyright
global tcl_patchLevel tk_patchLevel
set w .about_dialog
toplevel $w
wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
- label $w.header -text "About $appname" \
+ label $w.header -text "About [appname]" \
-font font_uibold
pack $w.header -side top -fill x
pack $w.buttons -side bottom -fill x -pady 10 -padx 10
label $w.desc \
- -text "$appname - a commit creation tool for Git.
+ -text "[appname] - a commit creation tool for Git.
$copyright" \
-padx 5 -pady 5 \
-justify left \
pack $w.desc -side top -fill x -padx 5 -pady 5
set v {}
- append v "$appname version $appvers\n\n"
- append v "[exec git --version]\n\n"
+ append v "[appname] version $appvers\n"
+ append v "[exec git version]\n"
+ append v "\n"
if {$tcl_patchLevel eq $tk_patchLevel} {
append v "Tcl/Tk version $tcl_patchLevel"
} else {
-font font_ui
pack $w.vers -side top -fill x -padx 5 -pady 5
+ menu $w.ctxm -tearoff 0
+ $w.ctxm add command \
+ -label {Copy} \
+ -font font_ui \
+ -command "
+ clipboard clear
+ clipboard append -format STRING -type STRING -- \[$w.vers cget -text\]
+ "
+
bind $w <Visibility> "grab $w; focus $w"
bind $w <Key-Escape> "destroy $w"
- wm title $w "About $appname"
+ bind_button3 $w.vers "tk_popup $w.ctxm %X %Y; grab $w; focus $w"
+ wm title $w "About [appname]"
tkwait window $w
}
proc do_options {} {
- global appname gitdir font_descs
- global repo_config global_config
+ global repo_config global_config font_descs
global repo_config_new global_config_new
array unset repo_config_new
foreach name [array names global_config] {
set global_config_new($name) $global_config($name)
}
- set reponame [lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]
set w .options_editor
toplevel $w
wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
- label $w.header -text "$appname Options" \
+ label $w.header -text "[appname] Options" \
-font font_uibold
pack $w.header -side top -fill x
pack $w.buttons.cancel -side right
pack $w.buttons -side bottom -fill x -pady 10 -padx 10
- labelframe $w.repo -text "$reponame Repository" \
+ labelframe $w.repo -text "[reponame] Repository" \
-font font_ui \
-relief raised -borderwidth 2
labelframe $w.global -text {Global (All Repositories)} \
bind $w <Visibility> "grab $w; focus $w"
bind $w <Key-Escape> "destroy $w"
- wm title $w "$appname ($reponame): Options"
+ wm title $w "[appname] ([reponame]): Options"
tkwait window $w
}
}
proc do_windows_shortcut {} {
- global gitdir appname argv0
-
- set reponame [lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]
+ global argv0
if {[catch {
set desktop [exec cygpath \
}
set fn [tk_getSaveFile \
-parent . \
- -title "$appname ($reponame): Create Desktop Icon" \
+ -title "[appname] ([reponame]): Create Desktop Icon" \
-initialdir $desktop \
- -initialfile "Git $reponame.bat"]
+ -initialfile "Git [reponame].bat"]
if {$fn != {}} {
if {[catch {
set fd [open $fn w]
set gd [exec cygpath \
--unix \
--absolute \
- $gitdir]
+ [gitdir]]
+ set gw [exec cygpath \
+ --windows \
+ --absolute \
+ [file dirname [gitdir]]]
regsub -all ' $me "'\\''" me
regsub -all ' $gd "'\\''" gd
- puts $fd "@ECHO Starting git-gui... Please wait..."
+ puts $fd "@ECHO Entering $gw"
+ puts $fd "@ECHO Starting git-gui... please wait..."
puts -nonewline $fd "@\"$sh\" --login -c \""
puts -nonewline $fd "GIT_DIR='$gd'"
puts -nonewline $fd " '$me'"
}
proc do_macosx_app {} {
- global gitdir appname argv0 env
-
- set reponame [lindex [file split \
- [file normalize [file dirname $gitdir]]] \
- end]
+ global argv0 env
set fn [tk_getSaveFile \
-parent . \
- -title "$appname ($reponame): Create Desktop Icon" \
+ -title "[appname] ([reponame]): Create Desktop Icon" \
-initialdir [file join $env(HOME) Desktop] \
- -initialfile "Git $reponame.app"]
+ -initialfile "Git [reponame].app"]
if {$fn != {}} {
if {[catch {
set Contents [file join $fn Contents]
close $fd
set fd [open $exe w]
- set gd [file normalize $gitdir]
+ set gd [file normalize [gitdir]]
set ep [file normalize [exec git --exec-path]]
regsub -all ' $gd "'\\''" gd
regsub -all ' $ep "'\\''" ep
}
proc toggle_or_diff {w x y} {
- global file_states file_lists current_diff ui_index ui_other
+ global file_states file_lists current_diff ui_index ui_workdir
global last_clicked selected_paths
set pos [split [$w index @$x,$y] .]
set last_clicked [list $w $lno]
array unset selected_paths
$ui_index tag remove in_sel 0.0 end
- $ui_other tag remove in_sel 0.0 end
+ $ui_workdir tag remove in_sel 0.0 end
if {$col == 0} {
if {$current_diff eq $path} {
switch -glob -- [lindex $file_states($path) 0] {
A_ -
M_ -
- DD -
- DO -
- DM {
+ D_ -
+ DO {
update_indexinfo \
"Removing [short_path $path] from commit" \
[list $path] \
.mbar add cascade -label Apple -menu .mbar.apple
menu .mbar.apple
- .mbar.apple add command -label "About $appname" \
+ .mbar.apple add command -label "About [appname]" \
-command do_about \
-font font_ui
- .mbar.apple add command -label "$appname Options..." \
+ .mbar.apple add command -label "[appname] Options..." \
-command do_options \
-font font_ui
} else {
# -- Tools Menu
#
- if {[file exists /usr/local/miga/lib/gui-miga]} {
+ if {[file exists /usr/local/miga/lib/gui-miga]
+ && [file exists .pvcsrc]} {
proc do_miga {} {
- global gitdir ui_status_value
+ global ui_status_value
if {![lock_index update]} return
set cmd [list sh --login -c "/usr/local/miga/lib/gui-miga \"[pwd]\""]
set miga_fd [open "|$cmd" r]
.mbar add cascade -label Help -menu .mbar.help
menu .mbar.help
- .mbar.help add command -label "About $appname" \
+ .mbar.help add command -label "About [appname]" \
-command do_about \
-font font_ui
}
# -- Index File List
#
frame .vpane.files.index -height 100 -width 400
-label .vpane.files.index.title -text {Modified Files} \
+label .vpane.files.index.title -text {Changes To Be Committed} \
-background green \
-font font_ui
text $ui_index -background white -borderwidth 0 \
pack $ui_index -side left -fill both -expand 1
.vpane.files add .vpane.files.index -sticky nsew
-# -- Other (Add) File List
+# -- Working Directory File List
#
-frame .vpane.files.other -height 100 -width 100
-label .vpane.files.other.title -text {Untracked Files} \
+frame .vpane.files.workdir -height 100 -width 100
+label .vpane.files.workdir.title -text {Changed But Not Updated} \
-background red \
-font font_ui
-text $ui_other -background white -borderwidth 0 \
+text $ui_workdir -background white -borderwidth 0 \
-width 40 -height 10 \
-font font_ui \
-cursor $cursor_ptr \
- -yscrollcommand {.vpane.files.other.sb set} \
+ -yscrollcommand {.vpane.files.workdir.sb set} \
-state disabled
-scrollbar .vpane.files.other.sb -command [list $ui_other yview]
-pack .vpane.files.other.title -side top -fill x
-pack .vpane.files.other.sb -side right -fill y
-pack $ui_other -side left -fill both -expand 1
-.vpane.files add .vpane.files.other -sticky nsew
+scrollbar .vpane.files.workdir.sb -command [list $ui_workdir yview]
+pack .vpane.files.workdir.title -side top -fill x
+pack .vpane.files.workdir.sb -side right -fill y
+pack $ui_workdir -side left -fill both -expand 1
+.vpane.files add .vpane.files.workdir -sticky nsew
-foreach i [list $ui_index $ui_other] {
+foreach i [list $ui_index $ui_workdir] {
$i tag conf in_diff -font font_uibold
$i tag conf in_sel \
-background [$i cget -foreground] \
bind all <$M1B-Key-Q> do_quit
bind all <$M1B-Key-w> {destroy [winfo toplevel %W]}
bind all <$M1B-Key-W> {destroy [winfo toplevel %W]}
-foreach i [list $ui_index $ui_other] {
+foreach i [list $ui_index $ui_workdir] {
bind $i <Button-1> "toggle_or_diff $i %x %y; break"
bind $i <$M1B-Button-1> "add_one_to_selection $i %x %y; break"
bind $i <Shift-Button-1> "add_range_to_selection $i %x %y; break"
unset i
set file_lists($ui_index) [list]
-set file_lists($ui_other) [list]
+set file_lists($ui_workdir) [list]
set HEAD {}
set PARENT {}
set current_diff {}
set selected_commit_type new
-wm title . "$appname ([file normalize [file dirname $gitdir]])"
+wm title . "[appname] ([file normalize [file dirname [gitdir]]])"
focus -force $ui_comm
# -- Warn the user about environmental problems. Cygwin's Tcl
The following environment variables are probably
going to be ignored by any Git subprocess run
-by $appname:
+by [appname]:
"
foreach name [array names env] {
populate_push_menu .mbar.push
}
+# -- Only suggest a gc run if we are going to stay running.
+#
+if {!$single_commit} {
+ set object_limit 2000
+ if {[is_Windows]} {set object_limit 200}
+ regexp {^([0-9]+) objects,} [exec git count-objects] _junk objects_current
+ if {$objects_current >= $object_limit} {
+ if {[ask_popup \
+ "This repository currently has $objects_current loose objects.
+
+To maintain optimal performance it is strongly
+recommended that you compress the database
+when more than $object_limit loose objects exist.
+
+Compress the database now?"] eq yes} {
+ do_gc
+ }
+ }
+ unset object_limit _junk objects_current
+}
+
lock_index begin-read
after 1 do_rescan