/[Frey]/trunk/lib/Frey/SVK.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/SVK.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1133 - (hide annotations)
Tue Jun 30 15:10:55 2009 UTC (14 years, 10 months ago) by dpavlin
File size: 4234 byte(s)
make classes immutable and remove moose droppings to make Perl::Critic::Moose happy
1 dpavlin 485 package Frey::SVK;
2     use Moose;
3    
4 dpavlin 535 extends 'Frey';
5 dpavlin 1133 with 'Frey::Web', 'Frey::Path', 'Frey::HTML::Diff';
6 dpavlin 498
7 dpavlin 615 use Moose::Util::TypeConstraints;
8    
9 dpavlin 637 enum 'SVK_Action' => ( 'commit', 'revert', 'postpone' );
10 dpavlin 615
11     has action => (
12 dpavlin 585 is => 'rw',
13 dpavlin 615 isa => 'SVK_Action',
14 dpavlin 585 );
15    
16 dpavlin 615 has path => (
17     documentation => 'path to work with',
18 dpavlin 614 is => 'rw',
19 dpavlin 690 isa => 'Str|ArrayRef',
20 dpavlin 614 );
21    
22 dpavlin 620 has commit_message => (
23 dpavlin 585 documentation => 'commit message',
24     is => 'rw',
25     isa => 'Str',
26     );
27    
28 dpavlin 505 sub svk {
29     my ( $self, $exec, $coderef ) = @_;
30     open(my $svk, '-|', 'svk ' . $exec) or die "svk $exec: $@";
31     while(<$svk>) {
32     chomp;
33     $coderef->( $_ );
34     }
35     close($svk) or die "can't close svk $exec: $@";
36     }
37    
38 dpavlin 767 our $svk_status_path = '^(\w+[\+\s]+)(.+)';
39    
40 dpavlin 485 sub modified {
41     my ($self) = @_;
42     my @modified;
43 dpavlin 505 my $svk = $self->svk('status -q', sub {
44 dpavlin 767 push @modified, $2 if m{$svk_status_path};
45 dpavlin 505 });
46 dpavlin 485 return @modified;
47     }
48    
49 dpavlin 505 our $info; # cache, we use it on every hit
50     sub info {
51     my ($self) = @_;
52     return $info if $info;
53     my $svk = $self->svk('info', sub {
54     my ( $label, $value ) = split(/:\s+/, $_, 2);
55 dpavlin 535 $info->{$label} = $value if $label;
56 dpavlin 505 });
57 dpavlin 576 warn "# svk info ",$self->dump( $info );
58 dpavlin 505 return $info;
59     }
60    
61 dpavlin 485 sub as_data {
62     my ($self) = @_;
63     {
64     modified => [ $self->modified ],
65     }
66     }
67    
68 dpavlin 684 sub commit_as_markup {
69 dpavlin 498 my ($self) = @_;
70     my $status = `svk status -q`;
71 dpavlin 767 $status =~ s{$svk_status_path}{$1 . $self->checkbox('path',$2) . qq|<a href="#$2">$2</a>|}egm;
72 dpavlin 603 if ( $status ) {
73 dpavlin 615 $self->add_css(qq|
74     pre.l a { text-decoration: none; }
75 dpavlin 684 form.commit {
76 dpavlin 690 background: #eee;
77 dpavlin 615 padding: 1em 1em;
78     position: fixed;
79     top: 1em;
80     right: 1em;
81     z-index: 10;
82 dpavlin 737 opacity: .2;
83     filter: alpha(opacity=20);
84 dpavlin 615 }
85 dpavlin 737 form.commit:hover {
86     opacity: 1;
87     filter: alpha(opacity=100);
88     }
89 dpavlin 615 | );
90    
91 dpavlin 684
92 dpavlin 603 $status = qq|
93 dpavlin 684 <form class="commit" method="post">
94 dpavlin 603 <pre class="l">$status</pre>
95 dpavlin 684 <textarea name="commit_message" cols=40 rows=4></textarea>
96 dpavlin 863 <br>
97     <a target="Frey::Test::Runner" href="/Frey::Test::Runner/as_markup" title="run tests for all changes" style="float: right;">test</a>
98     <input type="submit" name="action" value="commit">
99 dpavlin 684 </form>
100 dpavlin 603 |;
101 dpavlin 684 $self->add_status( status => $status );
102     warn "commit_as_markup ",length($status)," bytes";
103 dpavlin 603 }
104 dpavlin 585 return $status;
105     }
106 dpavlin 576
107 dpavlin 585 sub diff_as_markup {
108     my ($self) = @_;
109    
110 dpavlin 498 my $diff = `svk diff`;
111 dpavlin 684 $self->add_status( diff => $diff );
112 dpavlin 498
113 dpavlin 1063 $diff = $self->html_diff( $diff );
114    
115 dpavlin 637 sub form {
116     my ( $path, $action ) = @_;
117 dpavlin 712 qq|<form class="inline" method="post"><input type="hidden" name="path" value="$path"><input type="submit" name="action" value="$action"></form>|;
118 dpavlin 637 };
119     $diff =~ s{^(===\s+)(\S+)$}{$1 . form($2,'revert') . qq| <a name="$2" target="editor" href="/editor+$2+1">$2</a> | . form($2,'postpone') }gem;
120 dpavlin 552
121 dpavlin 591 warn "diff_as_markup ",length($diff)," bytes";
122 dpavlin 585 return $diff;
123     }
124 dpavlin 498
125 dpavlin 690 sub action_as_markup {
126 dpavlin 585 my ($self) = @_;
127    
128 dpavlin 637 my $cmd;
129 dpavlin 614
130 dpavlin 637 if ( $self->action eq 'postpone' ) {
131     my $old = $self->path;
132 dpavlin 681 my $new = $old;
133     $new =~ s{/([^/]+)$}{/.postponed.$1};
134    
135     die "Allready have ", $self->path_size($new) if -e $new;
136 dpavlin 637 $cmd = "mv $old $new && svk revert $old";
137     } elsif ( $self->action ) {
138 dpavlin 684 $cmd = 'svk ' . $self->action;
139 dpavlin 615 if ( $self->action eq 'commit' ) {
140 dpavlin 690 my $msg = $self->commit_message || return $self->error( "need commit message\n" );
141 dpavlin 615 $msg =~ s{"}{\\"}gs;
142     $cmd .= qq{ -m "$msg"};
143     } else {
144     confess "need path" unless $self->path;
145     }
146 dpavlin 720
147     my @paths = eval { @{ $self->path } }; # XXX sigh!
148     @paths = ( $self->path ) unless @paths;
149     warn "# path ", $self->dump( @paths );
150    
151     $cmd .= ' ' . join( ' ',@paths );
152 dpavlin 637 }
153     if ( $cmd ) {
154 dpavlin 615 $cmd .= ' 2>&1';
155 dpavlin 690 warn "# cmd $cmd";
156    
157 dpavlin 615 my $out = `$cmd`;
158 dpavlin 690 warn "# output of $cmd is: $out";
159 dpavlin 637
160 dpavlin 690 return qq|
161     Command <tt>$cmd</tt> produced output:
162 dpavlin 726 <pre style="background: #ff8;">$out</pre>
163 dpavlin 848 <a href="">reload page</a> to prevent this post from triggering again<br>
164 dpavlin 615 |;
165 dpavlin 614 }
166    
167 dpavlin 690 }
168    
169     sub as_markup {
170     my ($self) = @_;
171    
172     my $html = $self->action_as_markup;
173    
174 dpavlin 615 $self->title( 'svk' . ( $self->action ? ' - ' . $self->action : '' ) ); # XXX without this we get wrong icon and title
175 dpavlin 614
176 dpavlin 698 $html .= $self->commit_as_markup . $self->diff_as_markup ||
177     qq|No changes in tracked files|;
178 dpavlin 614
179 dpavlin 591 warn "as_markup ",length($html)," bytes";
180 dpavlin 576
181 dpavlin 498 return $html;
182     }
183    
184 dpavlin 1133 __PACKAGE__->meta->make_immutable;
185     no Moose;
186     no Moose::Util::TypeConstraints;
187    
188 dpavlin 485 1;

  ViewVC Help
Powered by ViewVC 1.1.26