File Coverage

blib/lib/WE_Frontend/Publish/Rdist.pm
Criterion Covered Total %
statement 12 144 8.3
branch 0 78 0.0
condition 0 23 0.0
subroutine 4 8 50.0
pod n/a
total 16 253 6.3


line stmt bran cond sub pod time code
1             # -*- perl -*-
2              
3             #
4             # $Id: Rdist.pm,v 1.8 2004/03/08 10:44:59 eserte Exp $
5             # Author: Slaven Rezic
6             #
7             # Copyright (C) 2002 Online Office Berlin. All rights reserved.
8             # Copyright (C) 2002 Slaven Rezic.
9             # This is free software; you can redistribute it and/or modify it under the
10             # terms of the GNU General Public License, see the file COPYING.
11              
12             #
13             # Mail: slaven@rezic.de
14             # WWW: http://we-framework.sourceforge.net
15             #
16              
17             package WE_Frontend::Publish::Rdist;
18              
19 1     1   855 use vars qw($VERSION);
  1         2  
  1         77  
20             $VERSION = sprintf("%d.%02d", q$Revision: 1.8 $ =~ /(\d+)\.(\d+)/);
21              
22             package WE_Frontend::Main;
23              
24 1     1   4 use strict;
  1         2  
  1         23  
25              
26 1     1   4 use WE_Frontend::Publish;
  1         2  
  1         21  
27              
28 1     1   4 use File::Basename;
  1         1  
  1         2245  
29              
30             sub publish_rdist {
31 0     0     my($self, %args) = @_;
32              
33 0           my $do_exec = !delete $args{-n};
34 0           my $v = delete $args{-verbose};
35 0           my $since = delete $args{-since};
36 0 0         if (defined $since) {
37 0           warn "The -since option is ignored with publish_rdist!";
38             }
39 0           my $liveuser = $self->Config->staging->user;
40 0 0         if ($liveuser eq '') {
41 0           undef $liveuser;
42             }
43 0           my $livedirectory = $self->Config->staging->directory;
44 0           my $livecgidirectory = $self->Config->staging->cgidirectory;
45 0           my $livehost = $self->Config->staging->host;
46 0 0 0       if (!defined $livehost || $livehost eq '') {
47 0           $livehost = "localhost";
48             }
49 0           my $pubhtmldir = $self->Config->paths->pubhtmldir;
50 0           my $cgidir = $self->Config->paths->cgidir;
51 0           my @extracgi = (ref $self->Config->project->stagingextracgi eq 'ARRAY'
52 0 0         ? @{ $self->Config->project->stagingextracgi }
53             : ()
54             );
55 0 0 0       my $distfile = ($self->Config->staging->stagingext &&
56             $self->Config->staging->stagingext->{'distfile'}
57             ? $self->Config->staging->stagingext->{'distfile'}
58             : undef);
59 0           my @extra_args;
60 0 0         if (exists $args{-transport}) {
61 0           my $exec = is_in_path($args{-transport});
62 0 0         if (!defined $exec) {
63 0           die "Cannot find executable for $args{-transport} in $ENV{PATH}";
64             }
65 0           push @extra_args, "-P", $exec;
66 0           delete $args{-transport};
67             }
68 0 0 0       my $deleteold = ($self->Config->staging->stagingext &&
69             $self->Config->staging->stagingext->{'deleteold'}
70             ? $self->Config->staging->stagingext->{'deleteold'}
71             : 0);
72              
73 0 0         if (!defined $distfile) {
74 0 0         if (!defined $livedirectory) {
75 0           die "\$livedirectory is not defined";
76             }
77 0 0 0       if (!defined $pubhtmldir || $pubhtmldir eq '') {
78 0           die "The publish html directory is missing (config member WEsiteinfo->paths->pubhtmldir)";
79             }
80 0 0 0       if (@extracgi && (!defined $livecgidirectory || $livecgidirectory eq '')) {
      0        
81 0           die "Extra CGI scripts are defined (@extracgi),
82             but the WEsiteinfo->staging->cgidirectory config is missing";
83             }
84             }
85              
86             # XXX same as in Rsync.pm
87 0           my @cvs_exclude_pat = @{ WE_Frontend::Publish->_min_cvs_exclude }; # XXX!
  0            
88 0           my @we_exclude_pat = @{ WE_Frontend::Publish->we_exclude };
  0            
89 0           my @exclude_pat = (@cvs_exclude_pat, @we_exclude_pat);
90 0           my @exclude;
91             my %additional;
92 0 0         if ($self->Config->project->stagingexceptpat) {
93 0           push @exclude_pat, @{ $self->Config->project->stagingexceptpat };
  0            
94             }
95 0 0         if ($self->Config->project->stagingexcept) {
96 0           push @exclude, @{ $self->Config->project->stagingexcept };
  0            
97             }
98 0 0         if ($self->Config->project->stagingadditional) {
99 0           %additional = %{ $self->Config->project->stagingadditional };
  0            
100             }
101              
102 0 0         if ($v) {
103 0           print <
104             Using rdist.
105 0 0         Rdist remote host: $livehost
106             Rdist remote user: @{[ defined $liveuser ? $liveuser : "current" ]}
107             Rdist remote directory: $livedirectory
108             EOF
109 0 0         if (@extracgi) {
110 0           print "Rdist remote CGI directory: $livecgidirectory\n";
111             }
112 0 0         print ($deleteold ? "Delete unused remote files\n" : "Leave unused remote files\n");
113 0 0         if (@exclude) {
114 0           print "Exclude files: @exclude\n";
115             }
116 0 0         if (@exclude_pat) {
117 0           print "Exclude patterns: @exclude_pat\n";
118             }
119 0 0         if (%additional) {
120 0           print "Additional files: ",
121 0           join(", ", map { "$_ => $additional{$_}" } keys %additional),
122             "\n";
123             }
124 0           print "\n";
125             }
126              
127 0 0         my $dest = (defined $liveuser ? "$liveuser\@" : "") . $livehost;
128              
129 0           my @directories;
130             my @files;
131              
132 0           my $diststring;
133 0           my @additional_cmd;
134 0 0         if (!$distfile) {
135 0           $distfile = "-";
136              
137 0           my $exclude_pat_string = "";
138 0           my $exclude_string = "";
139 0           my @additional_install_string = ();
140              
141 0 0         if (@exclude_pat) {
142 0           $exclude_pat_string = "\texcept_pat (" .
143 0           join("\n", map { "\t\t " . glob2rx($_) } @exclude_pat) .
144             "\n\t\t );\n";
145             }
146 0 0         if (@exclude) {
147 0           $exclude_string = "\texcept (" .
148 0           join("\n", map { "\t\t " . "$pubhtmldir/$_" } @exclude) .
149             "\n\t\t );\n";
150             }
151 0 0         if (%additional) {
152 0           my $i = 1;
153 0           while(my($k, $v) = each %additional) {
154 0           my $label = "additional$i";
155 0           push @additional_cmd, $label;
156 0           push @additional_install_string, <
157             $label:
158             $pubhtmldir/$k -> $dest
159             install ${livedirectory}/$v ;
160              
161             EOF
162 0           $i++;
163             }
164             }
165              
166             # dump rdist bug? There have to be more than one file!
167 0 0         if (@extracgi == 1) {
168 0           push @extracgi, @extracgi;
169             }
170              
171 0           my $cgi_files = join(" ", map { "$cgidir/$_" } @extracgi);
  0            
172              
173 0           $diststring = <
174             # distfile for publishing edit to www
175              
176 0           HTDOCS = ( $pubhtmldir )
177             CGIFILES = ( $cgi_files )
178              
179             #
180             # htdocs
181             #
182             htdocs:
183             \${HTDOCS} -> $dest
184             install ${livedirectory} ;
185             $exclude_pat_string
186             $exclude_string
187              
188             @{[ join("\n", @additional_install_string) ]}
189              
190             #
191             # cgi-bin
192             #
193             cgi:
194             \${CGIFILES} -> $dest
195             install ${livecgidirectory} ;
196              
197             EOF
198              
199 0 0         if ($v) {
200 0           my $line = 1;
201 0           warn join("\n", map { $line++." ".$_} split /\n/, $diststring);
  0            
202             }
203             }
204              
205 0           my $cmd = "rdist -f $distfile";
206 0 0         if (!$do_exec) {
207 0           $cmd .= " -n";
208             }
209 0 0         if ($deleteold) {
210 0           $cmd .= " -oremove";
211             }
212              
213 0           $cmd .= " " . join(" ", qw(htdocs cgi), @additional_cmd);
214              
215 0 0         if ($distfile eq '-') {
216 0 0         warn $cmd if $v;
217 0 0         open(RDIST, "| $cmd") or die $!;
218 0           print RDIST $diststring;
219 0           close RDIST;
220             } else {
221 0           system($cmd);
222 0 0         die "Error while executing $cmd" if $?/256!=0;
223             }
224              
225 0           return;
226             }
227              
228             sub glob2rx {
229 0     0     my $glob = shift;
230 0           my %glob2rx = ("*" => ".*",
231             "." => "\\.",
232             "#" => "\\#",
233             ); # XXX more to follow
234 0           $glob =~ s/([\.\*\#])/$glob2rx{$1}/g;
235 0           $glob = ".*/" . $glob . ".*";
236 0           $glob =~ s/\Q.*.*/.*/g;
237 0           $glob;
238             }
239              
240             # REPO BEGIN
241             # REPO NAME is_in_path /home/e/eserte/src/repository
242             # REPO MD5 1aa226739da7a8178372aa9520d85589
243             sub is_in_path {
244 0     0     my($prog) = @_;
245 0 0 0       return $prog if (file_name_is_absolute($prog) and -x $prog);
246 0           require Config;
247 0   0       my $sep = $Config::Config{'path_sep'} || ':';
248 0           foreach (split(/$sep/o, $ENV{PATH})) {
249 0 0         return "$_/$prog" if -x "$_/$prog";
250             }
251 0           undef;
252             }
253             # REPO END
254              
255             # REPO BEGIN
256             # REPO NAME file_name_is_absolute /home/e/eserte/src/repository
257             # REPO MD5 a77759517bc00f13c52bb91d861d07d0
258             sub file_name_is_absolute {
259 0     0     my $file = shift;
260 0           my $r;
261 0           eval {
262 0           require File::Spec;
263 0           $r = File::Spec->file_name_is_absolute($file);
264             };
265 0 0         if ($@) {
266 0 0         if ($^O eq 'MSWin32') {
267 0           $r = ($file =~ m;^([a-z]:(/|\\)|\\\\|//);i);
268             } else {
269 0           $r = ($file =~ m|^/|);
270             }
271             }
272 0           $r;
273             }
274             # REPO END
275              
276             1;
277              
278             __END__