contrib: drop blameview/ directory
Blameview was a quick-and-dirty demonstration of how blame's incremental output could be used in an interface. These days one can find much better (and less ugly!) demonstrations in "git gui blame" and "tig blame". The only advantage blameview has is that its code is perhaps simpler to read. However, that is balanced by the fact that it probably has bugs, as nobody uses it nor has touched the code in 6 years. An implementor is probably better off just reading the "incremental output" section of "man git-blame". Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
9721ac9010
commit
1af6a877c5
@ -1,9 +0,0 @@
|
||||
This is a sample program to use 'git-blame --incremental', based
|
||||
on this message.
|
||||
|
||||
From: Jeff King <peff@peff.net>
|
||||
Subject: Re: More precise tag following
|
||||
To: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: git@vger.kernel.org
|
||||
Date: Sat, 27 Jan 2007 18:52:38 -0500
|
||||
Message-ID: <20070127235238.GA28706@coredump.intra.peff.net>
|
@ -1,155 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use Gtk2 -init;
|
||||
use Gtk2::SimpleList;
|
||||
|
||||
my $hash;
|
||||
my $fn;
|
||||
if ( @ARGV == 1 ) {
|
||||
$hash = "HEAD";
|
||||
$fn = shift;
|
||||
} elsif ( @ARGV == 2 ) {
|
||||
$hash = shift;
|
||||
$fn = shift;
|
||||
} else {
|
||||
die "Usage blameview [<rev>] <filename>";
|
||||
}
|
||||
|
||||
Gtk2::Rc->parse_string(<<'EOS');
|
||||
style "treeview_style"
|
||||
{
|
||||
GtkTreeView::vertical-separator = 0
|
||||
}
|
||||
class "GtkTreeView" style "treeview_style"
|
||||
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;
|
||||
$vpan->pack1($scrolled_window, 1, 1);
|
||||
my $fileview = Gtk2::SimpleList->new(
|
||||
'Commit' => 'text',
|
||||
'FileLine' => 'text',
|
||||
'Data' => 'text'
|
||||
);
|
||||
$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 $hash:$fn")
|
||||
or die "unable to open $fn: $!";
|
||||
|
||||
while(<$fh>) {
|
||||
chomp;
|
||||
$fileview->{data}->[$.] = ['HEAD', "$fn:$.", $_];
|
||||
}
|
||||
|
||||
my $blame;
|
||||
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);
|
||||
|
||||
$window->show_all;
|
||||
Gtk2->main;
|
||||
exit 0;
|
||||
|
||||
my %commitinfo = ();
|
||||
|
||||
sub flush_blame_line {
|
||||
my ($attr) = @_;
|
||||
|
||||
return unless defined $attr;
|
||||
|
||||
my ($commit, $s_lno, $lno, $cnt) =
|
||||
@{$attr}{qw(COMMIT S_LNO LNO CNT)};
|
||||
|
||||
my ($filename, $author, $author_time, $author_tz) =
|
||||
@{$commitinfo{$commit}}{qw(FILENAME AUTHOR AUTHOR-TIME AUTHOR-TZ)};
|
||||
my $info = $author . ' ' . format_time($author_time, $author_tz);
|
||||
|
||||
for(my $i = 0; $i < $cnt; $i++) {
|
||||
@{$fileview->{data}->[$lno+$i-1]}[0,1,2] =
|
||||
(substr($commit, 0, 8), $filename . ':' . ($s_lno+$i));
|
||||
}
|
||||
}
|
||||
|
||||
my $buf;
|
||||
my $current;
|
||||
sub read_blame_line {
|
||||
|
||||
my $r = sysread($blame, $buf, 1024, length($buf));
|
||||
die "I/O error" unless defined $r;
|
||||
|
||||
if ($r == 0) {
|
||||
flush_blame_line($current);
|
||||
$current = undef;
|
||||
return 0;
|
||||
}
|
||||
|
||||
while ($buf =~ s/([^\n]*)\n//) {
|
||||
my $line = $1;
|
||||
|
||||
if (($commit, $s_lno, $lno, $cnt) =
|
||||
($line =~ /^([0-9a-f]{40}) (\d+) (\d+) (\d+)$/)) {
|
||||
flush_blame_line($current);
|
||||
$current = +{
|
||||
COMMIT => $1,
|
||||
S_LNO => $2,
|
||||
LNO => $3,
|
||||
CNT => $4,
|
||||
};
|
||||
next;
|
||||
}
|
||||
|
||||
# extended attribute values
|
||||
if ($line =~ /^(author|author-mail|author-time|author-tz|committer|committer-mail|committer-time|committer-tz|summary|filename) (.*)$/) {
|
||||
my $commit = $current->{COMMIT};
|
||||
$commitinfo{$commit}{uc($1)} = $2;
|
||||
next;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub format_time {
|
||||
my $time = shift;
|
||||
my $tz = shift;
|
||||
|
||||
my $minutes = $tz < 0 ? 0-$tz : $tz;
|
||||
$minutes = ($minutes / 100)*60 + ($minutes % 100);
|
||||
$minutes = $tz < 0 ? 0-$minutes : $minutes;
|
||||
$time += $minutes * 60;
|
||||
my @t = gmtime($time);
|
||||
return sprintf('%04d-%02d-%02d %02d:%02d:%02d %s',
|
||||
$t[5] + 1900, @t[4,3,2,1,0], $tz);
|
||||
}
|
Loading…
Reference in New Issue
Block a user