X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=contrib%2Fblameview%2Fblameview.perl;h=1dec00137b2dd8a888a962edd62f01aad89e4186;hb=7943b3a94f0f862dc9d7dcec6b5639ae5bf027bd;hp=5e9a67c1235cd04cb51f2166b1dd2cf9fdada8eb;hpb=9299c4f147bcff603eef187eb04fe38153571d30;p=git.git diff --git a/contrib/blameview/blameview.perl b/contrib/blameview/blameview.perl index 5e9a67c12..1dec00137 100755 --- a/contrib/blameview/blameview.perl +++ b/contrib/blameview/blameview.perl @@ -3,7 +3,17 @@ use Gtk2 -init; use Gtk2::SimpleList; -my $fn = shift or die "require filename to blame"; +my $hash; +my $fn; +if ( @ARGV == 1 ) { + $hash = "HEAD"; + $fn = shift; +} elsif ( @ARGV == 2 ) { + $hash = shift; + $fn = shift; +} else { + die "Usage blameview [] "; +} Gtk2::Rc->parse_string(<<'EOS'); style "treeview_style" @@ -15,11 +25,12 @@ EOS my $window = Gtk2::Window->new('toplevel'); $window->signal_connect(destroy => sub { Gtk2->main_quit }); +my $vpan = Gtk2::VPaned->new(); +$window->add($vpan); my $scrolled_window = Gtk2::ScrolledWindow->new; -$window->add($scrolled_window); +$vpan->pack1($scrolled_window, 1, 1); my $fileview = Gtk2::SimpleList->new( 'Commit' => 'text', - 'CommitInfo' => 'text', 'FileLine' => 'text', 'Data' => 'text' ); @@ -27,17 +38,43 @@ $scrolled_window->add($fileview); $fileview->get_column(0)->set_spacing(0); $fileview->set_size_request(1024, 768); $fileview->set_rules_hint(1); +$fileview->signal_connect (row_activated => sub { + my ($sl, $path, $column) = @_; + my $row_ref = $sl->get_row_data_from_path ($path); + system("blameview @$row_ref[0]~1 $fn &"); + }); + +my $commitwindow = Gtk2::ScrolledWindow->new(); +$commitwindow->set_policy ('GTK_POLICY_AUTOMATIC','GTK_POLICY_AUTOMATIC'); +$vpan->pack2($commitwindow, 1, 1); +my $commit_text = Gtk2::TextView->new(); +my $commit_buffer = Gtk2::TextBuffer->new(); +$commit_text->set_buffer($commit_buffer); +$commitwindow->add($commit_text); + +$fileview->signal_connect (cursor_changed => sub { + my ($sl) = @_; + my ($path, $focus_column) = $sl->get_cursor(); + my $row_ref = $sl->get_row_data_from_path ($path); + my $c_fh; + open($c_fh, '-|', "git cat-file commit @$row_ref[0]") + or die "unable to find commit @$row_ref[0]"; + my @buffer = <$c_fh>; + $commit_buffer->set_text("@buffer"); + close($c_fh); + }); my $fh; -open($fh, '-|', "git cat-file blob HEAD:$fn") +open($fh, '-|', "git cat-file blob $hash:$fn") or die "unable to open $fn: $!"; + while(<$fh>) { chomp; - $fileview->{data}->[$.] = ['HEAD', '?', "$fn:$.", $_]; + $fileview->{data}->[$.] = ['HEAD', "$fn:$.", $_]; } my $blame; -open($blame, '-|', qw(git blame --incremental --), $fn) +open($blame, '-|', qw(git blame --incremental --), $fn, $hash) or die "cannot start git-blame $fn"; Glib::IO->add_watch(fileno($blame), 'in', \&read_blame_line); @@ -62,8 +99,7 @@ sub flush_blame_line { for(my $i = 0; $i < $cnt; $i++) { @{$fileview->{data}->[$lno+$i-1]}[0,1,2] = - (substr($commit, 0, 8), $info, - $filename . ':' . ($s_lno+$i)); + (substr($commit, 0, 8), $filename . ':' . ($s_lno+$i)); } }