From: Alexander Gavrilov Date: Sat, 6 Dec 2008 17:21:54 +0000 (+0300) Subject: git-gui: Fix handling of relative paths in blame. X-Git-Tag: gitgui-0.12.0~11 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=95e706b5ec4d9b6832640c717c98fb4c912b54c5;p=git.git git-gui: Fix handling of relative paths in blame. Currently using '..' or '.' in the file path for gui blame causes it to break, because the path is passed inside the SHA:PATH spec to cat-file, which apparently does not understand such items. As a result, cat-file returns nothing, and the viewer crashes because of an "index out of range" error. This commit adds a simple function that normalizes such paths. I choose not to use [file normalize], because it uses some data from the file system, e.g. dereferences symlinks, and creates an absolute path, while blame may be used to inspect historical information that bears no relation to the current filesystem state. Signed-off-by: Alexander Gavrilov Signed-off-by: Shawn O. Pearce --- diff --git a/git-gui.sh b/git-gui.sh index 8a4b42dbd..65dacf9b1 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -2630,6 +2630,20 @@ proc usage {} { exit 1 } +proc normalize_relpath {path} { + set elements {} + foreach item [file split $path] { + if {$item eq {.}} continue + if {$item eq {..} && [llength $elements] > 0 + && [lindex $elements end] ne {..}} { + set elements [lrange $elements 0 end-1] + continue + } + lappend elements $item + } + return [eval file join $elements] +} + # -- Not a normal commit type invocation? Do that instead! # switch -- $subcommand { @@ -2648,7 +2662,7 @@ blame { foreach a $argv { if {$is_path || [file exists $_prefix$a]} { if {$path ne {}} usage - set path $_prefix$a + set path [normalize_relpath $_prefix$a] break } elseif {$a eq {--}} { if {$path ne {}} { @@ -2671,7 +2685,7 @@ blame { unset is_path if {$head ne {} && $path eq {}} { - set path $_prefix$head + set path [normalize_relpath $_prefix$head] set head {} }