--- trunk/lib/Frey/SVN.pm 2009/04/27 19:55:32 1067 +++ trunk/lib/Frey/SVN.pm 2009/04/27 20:30:20 1068 @@ -14,6 +14,7 @@ use XML::Simple; use DateTimeX::Easy; use Text::Diff::Parser; +use File::Path qw/mkpath/; has repository => ( is => 'rw', @@ -36,7 +37,7 @@ has include_diff => ( is => 'ro', isa => 'Bool', - default => 1, + default => 0, ); has file_stats => ( @@ -116,26 +117,35 @@ if ( $self->include_diff || $self->file_stats ) { my $rev = $e->{'revision'}; - my $file = $svn_path; - $file =~ s{^\w+:/+}{}; - my $file = "var/svn/$file/$rev.diff"; - my $diff = $self->load( $file ); - if ( ! $diff ) { - $diff = `svn diff -c $rev $svn_path`; - $self->store( $file, $diff ); - } - - $e->{diff} .= $diff if $self->include_diff; $e->{diff_paths}->{rev} = $rev; # XXX debug + my $diff_file = $svn_path; + $diff_file =~ s{^\w+:/+}{}; + mkpath "var/svn/$diff_file" unless -e "var/svn/$diff_file"; + $diff_file = "var/svn/$diff_file/$rev.diff"; + my $diff_fh; + my $diff_out; + if ( ! -e $diff_file || ! -s $diff_file ) { + my $cmd = "svn diff -c $rev $svn_path"; + open($diff_fh, '-|', $cmd ) || die "can't open pipe from $cmd: $!"; + open($diff_out,'>' , $diff_file ) || die "can't write $diff_file: $!"; + warn "# creating $diff_file from $cmd\n"; + } else { + open($diff_fh, '<' , $diff_file ) || die "can't read $diff_file: $!"; + } + my $diff_path; - foreach my $line ( split(/[\n\r]/, $diff ) ) { - if ( $line =~ m{^\+\+\+ (\S+)} ) { + + while( <$diff_fh> ) { + $e->{diff} .= $_ if $self->include_diff; + print $diff_out $_ if defined $diff_out; + + if ( m{^\+\+\+ (\S+)} ) { $diff_path = "/$1"; # subversion paths start with / - } elsif ( $line =~ m{^\+} ) { + } elsif ( m{^\+} && $diff_path ) { $e->{diff_paths}->{$diff_path}->{added}++; - } elsif ( $line =~ m{^-} ) { + } elsif ( m{^-} && $diff_path ) { $e->{diff_paths}->{$diff_path}->{removed}++; } } @@ -292,9 +302,9 @@ foreach my $p (@{$e->{'paths'}->{'path'}}) { my ($action,$path) = ($p->{'action'},$p->{'content'}); my $weight = ''; - if ( defined $e->{diff_paths}->{$path} ) { - $weight = $e->{diff_paths}->{$path}->{removed}; - $weight += $e->{diff_paths}->{$path}->{added} * 2; + if ( my $s = $e->{diff_paths}->{$path} ) { + $weight = $s->{removed} if $s->{removed}; + $weight += $s->{added} * 2 if $s->{added}; $weight = qq| weight="$weight" |; } $file_events .= qq|\t\n|;