提交 cdaee5db 编写于 作者: P Paul Mackerras

gitk: Improve handling of -- and ambiguous arguments

This makes gitk more consistent with git rev-list and git log in its
handling of arguments that could be either a revision or a filename;
now gitk displays an error message and quits, rather than treating it
as a revision and getting an error in the underlying git log.  Now
gitk always passes "--" to git log even if no filenames are being
specified.

It also makes gitk display errors in invoking git log in a window
rather than on stderr, and makes gitk stop looking for a -d flag
when it sees a "--" argument.
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 c961b228
......@@ -87,19 +87,15 @@ proc start_rev_list {view} {
set startmsecs [clock clicks -milliseconds]
set commitidx($view) 0
set args $viewargs($view)
if {$viewfiles($view) ne {}} {
set args [concat $args "--" $viewfiles($view)]
}
set order "--topo-order"
if {$datemode} {
set order "--date-order"
}
if {[catch {
set fd [open [concat | git log -z --pretty=raw $order \
--parents --boundary $args] r]
set fd [open [concat | git log -z --pretty=raw $order --parents \
--boundary $viewargs($view) "--" $viewfiles($view)] r]
} err]} {
puts stderr "Error executing git rev-list: $err"
error_popup "Error executing git rev-list: $err"
exit 1
}
set commfd($view) $fd
......@@ -7471,35 +7467,48 @@ catch {source ~/.gitk}
font create optionfont -family sans-serif -size -12
# check that we can find a .git directory somewhere...
set gitdir [gitdir]
if {![file isdirectory $gitdir]} {
show_error {} . "Cannot find the git directory \"$gitdir\"."
exit 1
}
set revtreeargs {}
set cmdline_files {}
set i 0
foreach arg $argv {
switch -regexp -- $arg {
"^$" { }
"^-d" { set datemode 1 }
"--" {
set cmdline_files [lrange $argv [expr {$i + 1}] end]
break
}
default {
lappend revtreeargs $arg
}
}
incr i
}
# check that we can find a .git directory somewhere...
set gitdir [gitdir]
if {![file isdirectory $gitdir]} {
show_error {} . "Cannot find the git directory \"$gitdir\"."
exit 1
}
set cmdline_files {}
set i [lsearch -exact $revtreeargs "--"]
if {$i >= 0} {
set cmdline_files [lrange $revtreeargs [expr {$i + 1}] end]
set revtreeargs [lrange $revtreeargs 0 [expr {$i - 1}]]
} elseif {$revtreeargs ne {}} {
if {$i >= [llength $argv] && $revtreeargs ne {}} {
# no -- on command line, but some arguments (other than -d)
if {[catch {
set f [eval exec git rev-parse --no-revs --no-flags $revtreeargs]
set cmdline_files [split $f "\n"]
set n [llength $cmdline_files]
set revtreeargs [lrange $revtreeargs 0 end-$n]
# Unfortunately git rev-parse doesn't produce an error when
# something is both a revision and a filename. To be consistent
# with git log and git rev-list, check revtreeargs for filenames.
foreach arg $revtreeargs {
if {[file exists $arg]} {
show_error {} . "Ambiguous argument '$arg': both revision\
and filename"
exit 1
}
}
} err]} {
# unfortunately we get both stdout and stderr in $err,
# so look for "fatal:".
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册