/[Frey]/trunk/lib/Frey/SVN.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/SVN.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 807 - (hide annotations)
Thu Dec 11 00:27:19 2008 UTC (15 years, 5 months ago) by dpavlin
File size: 3956 byte(s)
create epoch date is ms which codeswarm requires
1 dpavlin 769 package Frey::SVN;
2     use Moose;
3    
4     # Convert output from svn log to html page (with some formatting of
5     # commit messages)
6     #
7     # 2004-04-28 Dobrica Pavlinusic <dpavlin@rot13.org>
8    
9     extends 'Frey';
10     with 'Frey::Web';
11     #with 'Frey::Storage';
12    
13     use XML::Simple;
14 dpavlin 807 use DateTimeX::Easy;
15 dpavlin 769
16     has repository => (
17     is => 'rw',
18     isa => 'Str',
19     required => 1,
20     default => 'file:///home/dpavlin/private/svn/Frey',
21     );
22    
23 dpavlin 770 has limit => (
24     is => 'rw',
25     isa => 'Int',
26     default => 50,
27     );
28    
29 dpavlin 804 sub iterator {
30     my ($self,$coderef) = @_;
31    
32 dpavlin 769 sub sh_regex($$) {
33     my ($cmd,$regex) = @_;
34     open(my $sh, $cmd . ' |') || die "sh_regex failed on $cmd: $!";
35     while(my $l = <$sh>) {
36     chomp($l);
37     if ($l =~ $regex) {
38     if ($1 && $2) {
39     return ($1,$2);
40     } elsif ($1) {
41     return $1;
42     } else {
43     return $l;
44     }
45     }
46     }
47     #warn "can't find $regex in output of $cmd\n";
48     return;
49     }
50    
51     my $path = $self->repository;
52     warn "# path $path\n";
53    
54     my $cmd;
55     if ($path =~ m#file://# || -e "$path/.svn") {
56     $cmd = "svn log -v --xml $path";
57     } else {
58     my $svn_path = sh_regex('svk info', qr#Mirrored From:\s+([^,]+)#i);
59    
60     if (! $svn_path) {
61    
62     my $svk_depot = sh_regex('svk info', qr#Depot Path: (/.+)#i);
63    
64     my $depot = $svk_depot;
65     my $rel_path;
66    
67     my $path = sh_regex('svk depot --list', qr/^$depot\s+(\S+)/i);
68    
69     while (! $path && $depot =~ s{^(/.*/)([^/]+)/?$}{$1} ) {
70     $rel_path = "$2/$rel_path";
71     $path = sh_regex('svk depot --list', qr/^$depot\s+(\S+)/i);
72     }
73    
74     die "can't find depot path '$svk_depot' in svk depot --list\n" unless ($path);
75     $svn_path = "file:///$path/$rel_path";
76     }
77    
78     $cmd = "svn log -v --xml $svn_path";
79     }
80    
81 dpavlin 770 $cmd .= " --limit " . $self->limit if $self->limit;
82    
83 dpavlin 769 warn "# $cmd\n";
84     open(my $fh, $cmd .' |') || die "failed $cmd: $!";
85     my $log;
86     while(<$fh>) {
87     $log .= $_;
88     }
89     close($fh);
90    
91     my $xml = XMLin($log, ForceArray => [ 'logentry', 'path' ]);
92    
93 dpavlin 804 foreach my $e (@{$xml->{'logentry'}}) {
94     warn "# e = ",$self->dump( $e );
95     $coderef->($e);
96     }
97     }
98    
99     sub as_markup {
100     my ($self) = @_;
101    
102     # extract svk revision: r113@athlon (orig r999): dpavlin | 2005-09-01 20:38:07 +0200
103     our $svk_rev_re = '\s+(r\d+@\w+(\s+\(orig\s+r\d+\))*:\s+\w+\s+\|\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\+\d+)\s*';
104    
105     sub encode {
106     my $foo = shift;
107     $foo =~ s/$svk_rev_re//gsm;
108     $foo =~ s/</&lt;/g;
109     $foo =~ s/>/&gt;/g;
110     $foo =~ s/"/&quot;/g;
111     $foo =~ s/([\n\r][\n\r]+)/<\/p>$1<p>/gis;
112     $foo =~ s/([\n\r]+)([\-\*]\s+)/$1<br\/>$2/gis;
113     $foo =~ s/([\n\r]+)(r\d+:\s+)/$1<br\/>$2/gis;
114     $foo =~ s/([\n\r]+)(\s+r\d+@)/$1<br\/>$2/gis; # svk
115     return $foo;
116     }
117    
118 dpavlin 769 our $html = '';
119     sub html {
120     $html .= join("\n", @_);
121     }
122    
123 dpavlin 804 $self->iterator( sub {
124     my $e = shift;
125    
126 dpavlin 769 my $rev = $e->{'revision'};
127     my $date = $e->{'date'};
128    
129     $date =~ s/T/ /;
130     $date =~ s/\.\d+Z$//;
131    
132     html '<p><tt>'.$date.'</tt> <em>',$e->{'author'},'</em> <tt style="color:#808080">r',$e->{'revision'},'</tt></p>';
133    
134     my @files;
135    
136     foreach my $p (@{$e->{'paths'}->{'path'}}) {
137     my ($action,$path) = ($p->{'action'},$p->{'content'});
138    
139     if ($action eq "A") {
140     push @files, "<ins>$path</ins>";
141     } elsif ($action eq "D") {
142     push @files, "<del>$path</del>";
143     } else{
144     push @files, $path;
145     }
146     }
147    
148     html '<blockquote><p><tt style="color:#808080">',join(", ",@files),':</tt> ',encode($e->{'msg'}),'</p></blockquote>';
149    
150 dpavlin 804 });
151 dpavlin 769
152     return $html;
153     }
154    
155 dpavlin 805 sub codeswarm_as_markup {
156     my ($self) = @_;
157    
158     $self->content_type('text/xml');
159    
160     my $file_events = '';
161    
162     $self->iterator( sub {
163     my $e = shift;
164    
165     my $rev = $e->{'revision'};
166 dpavlin 807 my $date = DateTimeX::Easy->new( $e->{'date'} )->epoch . '000'; # ms
167 dpavlin 805 my $author = $e->{'author'};
168    
169     foreach my $p (@{$e->{'paths'}->{'path'}}) {
170     my ($action,$path) = ($p->{'action'},$p->{'content'});
171     $file_events .= qq|\t<event filename="$path" date="$date" author="$author" />\n|;
172     }
173    
174     });
175    
176     return qq|<?xml version="1.0"?>
177     <!-- One commit per day for one month by a documenter and programmer. -->
178     <file_events>
179     $file_events
180     </file_events>
181     |;
182    
183     }
184    
185 dpavlin 769 1;

  ViewVC Help
Powered by ViewVC 1.1.26