index 4041aaacd9ff6d82010b1344372192bfdcc3b04b..20c36c2d2e3e2c9bf68da635bdd001f0c806417a 100755 (executable)
--- a/git-gui
+++ b/git-gui
# and distributed under the terms of the GNU General Public Licence,
# either version 2, or (at your option) any later version.
+######################################################################
+##
+## config
+
+proc load_repo_config {} {
+ global repo_config
+ global cfg_trust_mtime
+
+ array unset repo_config
+ catch {
+ set fd_rc [open "| git repo-config --list" r]
+ while {[gets $fd_rc line] >= 0} {
+ if {[regexp {^([^=]+)=(.*)$} $line line name value]} {
+ lappend repo_config($name) $value
+ }
+ }
+ close $fd_rc
+ }
+
+ if {[catch {set cfg_trust_mtime \
+ [lindex $repo_config(gui.trustmtime) 0]
+ }]} {
+ set cfg_trust_mtime false
+ }
+}
+
+proc save_my_config {} {
+ global repo_config
+ global cfg_trust_mtime
+
+ if {[catch {set rc_trustMTime $repo_config(gui.trustmtime)}]} {
+ set rc_trustMTime [list false]
+ }
+ if {$cfg_trust_mtime != [lindex $rc_trustMTime 0]} {
+ exec git repo-config gui.trustMTime $cfg_trust_mtime
+ set repo_config(gui.trustmtime) [list $cfg_trust_mtime]
+ }
+
+ set cfg_geometry [list \
+ [wm geometry .] \
+ [.vpane sash coord 0] \
+ [.vpane.files sash coord 0] \
+ ]
+ if {[catch {set rc_geometry $repo_config(gui.geometry)}]} {
+ set rc_geometry [list [list]]
+ }
+ if {$cfg_geometry != [lindex $rc_geometry 0]} {
+ exec git repo-config gui.geometry $cfg_geometry
+ set repo_config(gui.geometry) [list $cfg_geometry]
+ }
+}
+
+######################################################################
+##
+## repository setup
+
+set appname [lindex [file split $argv0] end]
+set gitdir {}
+set GIT_COMMITTER_IDENT {}
+
+if {[catch {set cdup [exec git rev-parse --show-cdup]} err]} {
+ show_msg {} . "Cannot find the git directory: $err"
+ exit 1
+}
+if {$cdup != ""} {
+ cd $cdup
+}
+unset cdup
+
+if {[catch {set gitdir [exec git rev-parse --git-dir]} err]} {
+ show_msg {} . "Cannot find the git directory: $err"
+ exit 1
+}
+
+if {$appname == {git-citool}} {
+ set single_commit 1
+}
+
+load_repo_config
+
######################################################################
##
## task management
set single_commit 0
set status_active 0
set diff_active 0
-set checkin_active 0
+set update_active 0
set commit_active 0
set update_index_fd {}
error_popup "Unmerged files cannot be committed.
File $path has merge conflicts.
-You must resolve them and check the file in before committing.
+You must resolve them and include the file before committing.
"
unlock_index
return
}
}
if {!$files_ready} {
- error_popup {No checked-in files to commit.
+ error_popup {No included files to commit.
-You must check-in at least 1 file before you can commit.
+You must include at least 1 file before you can commit.
}
unlock_index
return
set HEAD $cmt_id
set PARENT $cmt_id
unlock_index
- update_status "Changes committed as $cmt_id."
+ update_status "Changes committed as [string range $cmt_id 0 7]."
}
######################################################################
}
proc pull_remote {remote branch} {
+ global HEAD commit_type
+ global file_states
+
if {![lock_index update]} return
+
+ # -- Our in memory state should match the repository.
+ #
+ repository_state curHEAD cur_type
+ if {$commit_type != $cur_type || $HEAD != $curHEAD} {
+ error_popup {Last scanned state does not match repository state.
+
+Its highly likely that another Git program modified the
+repository since our last scan. A rescan is required
+before a pull can be started.
+}
+ unlock_index
+ update_status
+ return
+ }
+
+ # -- No differences should exist before a pull.
+ #
+ if {[array size file_states] != 0} {
+ error_popup {Uncommitted but modified files are present.
+
+You should not perform a pull with unmodified files in your working
+directory as Git would be unable to recover from an incorrect merge.
+
+Commit or throw away all changes before starting a pull operation.
+}
+ unlock_index
+ return
+ }
+
set w [new_console "pull $remote $branch" \
"Pulling new changes from branch $branch in $remote"]
set cmd [list git pull]
}
proc post_pull_remote {remote branch success} {
+ global HEAD PARENT commit_type
+ global ui_status_value
+
unlock_index
if {$success} {
- update_status "Successfully pulled $branch from $remote."
+ repository_state HEAD commit_type
+ set PARENT $HEAD
+ set $ui_status_value {Ready.}
} else {
update_status "Conflicts detected while pulling $branch from $remote."
}
$new_w image create $lno.0 \
-align center -padx 5 -pady 1 \
-name [lindex $s 1] \
- -image [mapicon $m $path]
+ -image $new_icon
$new_w insert $lno.1 "$path\n"
$new_w conf -state disabled
} elseif {$new_icon != [mapicon $old_m $path]} {
######################################################################
##
-## config (fetch push pull)
-
-proc load_repo_config {} {
- global repo_config
- global cfg_trust_mtime
-
- array unset repo_config
- catch {
- set fd_rc [open "| git repo-config --list" r]
- while {[gets $fd_rc line] >= 0} {
- if {[regexp {^([^=]+)=(.*)$} $line line name value]} {
- lappend repo_config($name) $value
- }
- }
- close $fd_rc
- }
-
- if {[catch {set cfg_trust_mtime $repo_config(gui.trustmtime)}]} {
- set cfg_trust_mtime false
- }
-}
-
-proc save_my_config {} {
- global repo_config
- global cfg_trust_mtime
-
- if {[catch {set rc_trustMTime $repo_config(gui.trustmtime)}]} {
- set rc_trustMTime false
- }
- if {$cfg_trust_mtime != $rc_trustMTime} {
- exec git repo-config gui.trustMTime $cfg_trust_mtime
- }
-}
+## remote management
proc load_all_remotes {} {
global gitdir all_remotes repo_config
{__ i plain "Unmodified"}
{_M i mod "Modified"}
{M_ i fulltick "Checked in"}
- {MM i parttick "Partially checked in"}
+ {MM i parttick "Partially included"}
{_O o plain "Untracked"}
{A_ o fulltick "Added"}
update_status
}
-proc do_checkin_all {} {
- global checkin_active ui_status_value
+proc do_include_all {} {
+ global update_active ui_status_value
- if {$checkin_active || ![lock_index begin-update]} return
+ if {$update_active || ![lock_index begin-update]} return
- set checkin_active 1
- set ui_status_value {Checking in all files...}
+ set update_active 1
+ set ui_status_value {Including all modified files...}
after 1 {
with_update_index {
foreach path [array names file_states] {
}
}
}
- set checkin_active 0
+ set update_active 0
set ui_status_value {Ready.}
}
}
proc do_signoff {} {
- global ui_comm
+ global ui_comm GIT_COMMITTER_IDENT
- catch {
- set me [exec git var GIT_COMMITTER_IDENT]
- if {[regexp {(.*) [0-9]+ [-+0-9]+$} $me me name]} {
- set str "Signed-off-by: $name"
- if {[$ui_comm get {end -1c linestart} {end -1c}] != $str} {
- $ui_comm insert end "\n"
- $ui_comm insert end $str
- $ui_comm see end
- }
+ if {$GIT_COMMITTER_IDENT == {}} {
+ if {[catch {set me [exec git var GIT_COMMITTER_IDENT]} err]} {
+ error_popup "Unable to obtain your identity:\n$err"
+ return
+ }
+ if {![regexp {^(.*) [0-9]+ [-+0-9]+$} \
+ $me me GIT_COMMITTER_IDENT]} {
+ error_popup "Invalid GIT_COMMITTER_IDENT:\n$me"
+ return
}
}
+
+ set str "Signed-off-by: $GIT_COMMITTER_IDENT"
+ if {[$ui_comm get {end -1c linestart} {end -1c}] != $str} {
+ $ui_comm insert end "\n"
+ $ui_comm insert end $str
+ $ui_comm see end
+ }
}
proc do_amend_last {} {
-font $mainfont
lappend disable_on_lock \
[list .mbar.commit entryconf [.mbar.commit index last] -state]
-.mbar.commit add command -label {Check-in All Files} \
- -command do_checkin_all \
- -accelerator $M1T-U \
+.mbar.commit add command -label {Include All Files} \
+ -command do_include_all \
+ -accelerator $M1T-I \
-font $mainfont
lappend disable_on_lock \
[list .mbar.commit entryconf [.mbar.commit index last] -state]
pack .vpane.lower.commarea.buttons.amend -side top -fill x
lappend disable_on_lock {.vpane.lower.commarea.buttons.amend conf -state}
-button .vpane.lower.commarea.buttons.ciall -text {Check-in All} \
- -command do_checkin_all \
+button .vpane.lower.commarea.buttons.incall -text {Include All} \
+ -command do_include_all \
-font $mainfont
-pack .vpane.lower.commarea.buttons.ciall -side top -fill x
-lappend disable_on_lock {.vpane.lower.commarea.buttons.ciall conf -state}
+pack .vpane.lower.commarea.buttons.incall -side top -fill x
+lappend disable_on_lock {.vpane.lower.commarea.buttons.incall conf -state}
button .vpane.lower.commarea.buttons.signoff -text {Sign Off} \
-command do_signoff \
-font $mainfont
pack .status -anchor w -side bottom -fill x
+# -- Load geometry
+catch {
+wm geometry . [lindex $repo_config(gui.geometry) 0 0]
+eval .vpane sash place 0 [lindex $repo_config(gui.geometry) 0 1]
+eval .vpane.files sash place 0 [lindex $repo_config(gui.geometry) 0 2]
+}
+
# -- Key Bindings
bind $ui_comm <$M1B-Key-Return> {do_commit;break}
+bind $ui_comm <$M1B-Key-i> {do_include_all;break}
+bind $ui_comm <$M1B-Key-I> {do_include_all;break}
+
bind . <Destroy> do_quit
bind all <Key-F5> do_rescan
bind all <$M1B-Key-r> do_rescan
bind all <$M1B-Key-R> do_rescan
bind . <$M1B-Key-s> do_signoff
bind . <$M1B-Key-S> do_signoff
-bind . <$M1B-Key-u> do_checkin_all
-bind . <$M1B-Key-U> do_checkin_all
+bind . <$M1B-Key-i> do_include_all
+bind . <$M1B-Key-I> do_include_all
bind . <$M1B-Key-Return> do_commit
bind all <$M1B-Key-q> do_quit
bind all <$M1B-Key-Q> do_quit
}
unset i M1B M1T
-######################################################################
-##
-## main
-
-set appname [lindex [file split $argv0] end]
-set gitdir {}
-
-if {[catch {set cdup [exec git rev-parse --show-cdup]} err]} {
- show_msg {} . "Cannot find the git directory: $err"
- exit 1
-}
-if {$cdup != ""} {
- cd $cdup
-}
-unset cdup
-
-if {[catch {set gitdir [exec git rev-parse --git-dir]} err]} {
- show_msg {} . "Cannot find the git directory: $err"
- exit 1
-}
-
-if {$appname == {git-citool}} {
- set single_commit 1
-}
-
wm title . "$appname ([file normalize [file dirname $gitdir]])"
focus -force $ui_comm
-load_repo_config
load_all_remotes
populate_remote_menu .mbar.fetch From fetch_from
populate_remote_menu .mbar.push To push_to