diff options
author | Paul Mackerras <paulus@samba.org> | 2007-07-12 22:29:49 +1000 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-07-12 22:29:49 +1000 |
commit | cdaee5db165ba8bae8d3b524950e61666fc36a84 (patch) | |
tree | c8aaba31c42f576fb0c02771c8117e59075e7208 /gitk | |
parent | c961b228bcab390a1b42d517b6ed5a1edb55efed (diff) | |
download | git-cdaee5db165ba8bae8d3b524950e61666fc36a84.tar.gz git-cdaee5db165ba8bae8d3b524950e61666fc36a84.tar.xz |
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: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'gitk')
-rwxr-xr-x | gitk | 49 |
1 files changed, 29 insertions, 20 deletions
@@ -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:". |