зеркало из https://github.com/microsoft/git.git
git-gui: Verify we should actually perform a commit when asked to do so.
A user shouldn't perform a commit if any of the following are true: * The repository state has changed since the last rescan. * There are no files updated in the index to commit. * There are unmerged stages still in the index. * The commit message has not been provided. * The pre-commit hook is executable and declined. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Родитель
e210e67451
Коммит
6e27d826c8
139
git-gui
139
git-gui
|
@ -599,15 +599,62 @@ proc error_popup {msg} {
|
|||
}
|
||||
|
||||
proc show_msg {w top msg} {
|
||||
message $w.m -text $msg -justify center -aspect 400
|
||||
global gitdir
|
||||
|
||||
message $w.m -text $msg -justify left -aspect 400
|
||||
pack $w.m -side top -fill x -padx 20 -pady 20
|
||||
button $w.ok -text OK -command "destroy $top"
|
||||
pack $w.ok -side bottom -fill x
|
||||
pack $w.ok -side bottom
|
||||
bind $top <Visibility> "grab $top; focus $top"
|
||||
bind $top <Key-Return> "destroy $top"
|
||||
wm title $top "error: git-ui ([file normalize [file dirname $gitdir]])"
|
||||
tkwait window $top
|
||||
}
|
||||
|
||||
proc hook_failed_popup {hook msg} {
|
||||
global gitdir mainfont difffont
|
||||
|
||||
set w .hookfail
|
||||
toplevel $w
|
||||
wm transient $w .
|
||||
|
||||
frame $w.m
|
||||
label $w.m.l1 -text "$hook hook failed:" \
|
||||
-anchor w \
|
||||
-justify left \
|
||||
-font [concat $mainfont bold]
|
||||
text $w.m.t \
|
||||
-background white -borderwidth 1 \
|
||||
-relief sunken \
|
||||
-width 80 -height 10 \
|
||||
-font $difffont \
|
||||
-yscrollcommand [list $w.m.sby set]
|
||||
label $w.m.l2 \
|
||||
-text {You must correct the above errors before committing.} \
|
||||
-anchor w \
|
||||
-justify left \
|
||||
-font [concat $mainfont bold]
|
||||
scrollbar $w.m.sby -command [list $w.m.t yview]
|
||||
pack $w.m.l1 -side top -fill x
|
||||
pack $w.m.l2 -side bottom -fill x
|
||||
pack $w.m.sby -side right -fill y
|
||||
pack $w.m.t -side left -fill both -expand 1
|
||||
pack $w.m -side top -fill both -expand 1 -padx 5 -pady 10
|
||||
|
||||
$w.m.t insert 1.0 $msg
|
||||
$w.m.t conf -state disabled
|
||||
|
||||
button $w.ok -text OK \
|
||||
-width 15 \
|
||||
-command "destroy $w"
|
||||
pack $w.ok -side bottom
|
||||
|
||||
bind $w <Visibility> "grab $w; focus $w"
|
||||
bind $w <Key-Return> "destroy $w"
|
||||
wm title $w "error: git-ui ([file normalize [file dirname $gitdir]])"
|
||||
tkwait window $w
|
||||
}
|
||||
|
||||
######################################################################
|
||||
##
|
||||
## ui commands
|
||||
|
@ -693,6 +740,94 @@ proc do_signoff {} {
|
|||
}
|
||||
}
|
||||
|
||||
proc do_commit {} {
|
||||
global tcl_platform HEAD gitdir commit_type file_states
|
||||
global ui_comm
|
||||
|
||||
# -- Our in memory state should match the repository.
|
||||
#
|
||||
if {[catch {set curHEAD [exec git rev-parse --verify HEAD]}]} {
|
||||
set cur_type initial
|
||||
} else {
|
||||
set cur_type normal
|
||||
}
|
||||
if {$commit_type != $commit_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 committing.
|
||||
}
|
||||
update_status
|
||||
return
|
||||
}
|
||||
|
||||
# -- At least one file should differ in the index.
|
||||
#
|
||||
set files_ready 0
|
||||
foreach path [array names file_states] {
|
||||
set s $file_states($path)
|
||||
switch -glob -- [lindex $s 0] {
|
||||
_* {continue}
|
||||
A* -
|
||||
D* -
|
||||
M* {set files_ready 1; break}
|
||||
U* {
|
||||
error_popup "Unmerged files cannot be committed.
|
||||
|
||||
File $path has merge conflicts.
|
||||
You must resolve them and check the file in before committing.
|
||||
"
|
||||
return
|
||||
}
|
||||
default {
|
||||
error_popup "Unknown file state [lindex $s 0] detected.
|
||||
|
||||
File $path cannot be committed by this program.
|
||||
"
|
||||
}
|
||||
}
|
||||
}
|
||||
if {!$files_ready} {
|
||||
error_popup {No checked-in files to commit.
|
||||
|
||||
You must check-in at least 1 file before you can commit.
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
# -- A message is required.
|
||||
#
|
||||
set msg [string trim [$ui_comm get 1.0 end]]
|
||||
if {$msg == {}} {
|
||||
error_popup {Please supply a commit message.
|
||||
|
||||
A good commit message has the following format:
|
||||
|
||||
- First line: Describe in one sentance what you did.
|
||||
- Second line: Blank
|
||||
- Remaining lines: Describe why this change is good.
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
# -- Ask the pre-commit hook for the go-ahead.
|
||||
#
|
||||
set pchook [file join $gitdir hooks pre-commit]
|
||||
if {$tcl_platform(platform) == {windows} && [file exists $pchook]} {
|
||||
set pchook [list sh -c \
|
||||
"if test -x \"$pchook\"; then exec \"$pchook\"; fi"]
|
||||
} elseif {[file executable $pchook]} {
|
||||
set pchook [list $pchook]
|
||||
} else {
|
||||
set pchook {}
|
||||
}
|
||||
if {$pchook != {} && [catch {eval exec $pchook} err]} {
|
||||
hook_failed_popup pre-commit $err
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
# shift == 1: left click
|
||||
# 3: right click
|
||||
proc click {w x y shift wx wy} {
|
||||
|
|
Загрузка…
Ссылка в новой задаче