From a0db0d61fbc447f13cb0aadf01c83eb193b22dc9 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 8 May 2007 22:48:47 -0400 Subject: [PATCH] git-gui: Generate blame on uncommitted working tree file If the user doesn't give us a revision parameter to our blame subcommand then we can generate blame against the working tree file by passing the file path off to blame with the --contents argument. In this case we cannot obtain the contents of the file from the ODB; instead we must obtain the contents by reading the working directory file as-is. Signed-off-by: Shawn O. Pearce --- git-gui.sh | 20 ++++++++++++-------- lib/blame.tcl | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/git-gui.sh b/git-gui.sh index e90cdde96..62b1a36a8 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -1605,6 +1605,7 @@ browser { } blame { set subcommand_args {rev? path?} + set head {} set path {} set is_path 0 foreach a $argv { @@ -1614,27 +1615,30 @@ blame { break } elseif {$a eq {--}} { if {$path ne {}} { - if {$current_branch ne {}} usage - set current_branch $path + if {$head ne {}} usage + set head $path set path {} } set is_path 1 - } elseif {$current_branch eq {}} { - if {$current_branch ne {}} usage - set current_branch $a + } elseif {$head eq {}} { + if {$head ne {}} usage + set head $a } else { usage } } unset is_path - if {$current_branch eq {} && $path ne {}} { + if {$head eq {}} { set current_branch [git symbolic-ref HEAD] regsub ^refs/((heads|tags|remotes)/)? \ $current_branch {} current_branch + } else { + set current_branch $head } - if {$current_branch eq {} || $path eq {}} usage - blame::new $current_branch $path + + if {$path eq {}} usage + blame::new $head $path return } citool - diff --git a/lib/blame.tcl b/lib/blame.tcl index 37ce3e7a8..8ac010418 100644 --- a/lib/blame.tcl +++ b/lib/blame.tcl @@ -170,8 +170,12 @@ constructor new {i_commit i_path} { bind $top "focus $top" bind $top [list delete_this $this] - set cmd [list git cat-file blob "$commit:$path"] - set fd [open "| $cmd" r] + if {$commit eq {}} { + set fd [open $path r] + } else { + set cmd [list git cat-file blob "$commit:$path"] + set fd [open "| $cmd" r] + } fconfigure $fd -blocking 0 -translation lf -encoding binary fileevent $fd readable [cb _read_file $fd] } @@ -194,7 +198,13 @@ method _read_file {fd} { if {[eof $fd]} { close $fd _status $this - set cmd [list git blame -M -C --incremental $commit -- $path] + set cmd [list git blame -M -C --incremental] + if {$commit eq {}} { + lappend cmd --contents $path + } else { + lappend cmd $commit + } + lappend cmd -- $path set fd [open "| $cmd" r] fconfigure $fd -blocking 0 -translation lf -encoding binary fileevent $fd readable [cb _read_blame $fd] -- 2.30.2