Hi, I guess blame view need to pull the file content from the repository rather than opening it directly. If i have a working copy that is not yet committed it gives wrong results. I tried some changes as below. But i guess there should be a much easier way. -aneesh
diff --git a/contrib/blameview/blameview.perl b/contrib/blameview/blameview.perl index a55f799..a7505da 100755 --- a/contrib/blameview/blameview.perl +++ b/contrib/blameview/blameview.perl @@ -3,6 +3,7 @@ use Gtk2 -init; use Gtk2::SimpleList; +our $GIT="git"; my $fn = shift or die "require filename to blame"; Gtk2::Rc->parse_string(<<'EOS'); @@ -13,6 +14,50 @@ style "treeview_style" class "GtkTreeView" style "treeview_style" EOS +sub get_file_handle +{ + my ($commit_hash, $filename) = @_; + my (@path_comp, $hash_line, @hash_line, $path); + my ($tree_hash, $hash); + my @file_contents; + @path_comp = split(/\//, $filename); +start: + chomp($commit_hash); + open my $fd, "-|", "$GIT cat-file -t $commit_hash" or + die("Execute git-cat-file failed."); + $hash_line = <$fd>; + chomp($hash_line); + if ($hash_line =~ m/commit/) { + + open my $fd, "-|", "$GIT cat-file commit $commit_hash | grep tree" or + die("Execute git-cat-file failed."); + $hash_line = <$fd>; + close($fd); + @hash_line = split(/[\t ]+/, $hash_line); + $tree_hash = $hash_line[1]; + } elsif ($hash_line =~ m/tree/) { + $tree_hash = $hash_line; + } else { + die("Need to specify either a tree or a commit hash"); + } + + foreach $path (@path_comp) { + chomp($tree_hash); + open my $fd, "-|", "$GIT ls-tree $tree_hash | grep $path\$" or + die("Execute git-ls-tree failed."); + $hash_line = <$fd>; + close($fd); + @hash_line = split(/[\t ]+/, $hash_line); + if ($hash_line[1] =~ m/tree/) { + $tree_hash = $hash_line[2]; + next; + } elsif ($hash_line[1] =~ m/blob/) { + open my $fd, "-|", "$GIT cat-file blob $hash_line[2]" or + die("Execute git-cat-file failed."); + return $fd; + } + } +} my $window = Gtk2::Window->new('toplevel'); $window->signal_connect(destroy => sub { Gtk2->main_quit }); my $scrolled_window = Gtk2::ScrolledWindow->new; @@ -28,8 +73,7 @@ $fileview->get_column(0)->set_spacing(0); $fileview->set_size_request(1024, 768); $fileview->set_rules_hint(1); -open(my $fh, '<', $fn) - or die "unable to open $fn: $!"; +$fh = get_file_handle("HEAD", $fn); while(<$fh>) { chomp; $fileview->{data}->[$.] = ['HEAD', '?', "$fn:$.", $_];