line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Toader::Entry::Manage; |
2
|
|
|
|
|
|
|
|
3
|
7
|
|
|
7
|
|
21682
|
use warnings; |
|
7
|
|
|
|
|
12
|
|
|
7
|
|
|
|
|
204
|
|
4
|
7
|
|
|
7
|
|
37
|
use strict; |
|
7
|
|
|
|
|
11
|
|
|
7
|
|
|
|
|
143
|
|
5
|
7
|
|
|
7
|
|
495
|
use Toader::isaToaderDir; |
|
7
|
|
|
|
|
14
|
|
|
7
|
|
|
|
|
139
|
|
6
|
7
|
|
|
7
|
|
667
|
use Toader::Entry::Helper; |
|
7
|
|
|
|
|
12
|
|
|
7
|
|
|
|
|
207
|
|
7
|
7
|
|
|
7
|
|
3438
|
use Toader::Entry; |
|
7
|
|
|
|
|
20
|
|
|
7
|
|
|
|
|
230
|
|
8
|
7
|
|
|
7
|
|
50
|
use base 'Error::Helper'; |
|
7
|
|
|
|
|
14
|
|
|
7
|
|
|
|
|
547
|
|
9
|
7
|
|
|
7
|
|
4485
|
use Toader::Entry::Cache; |
|
7
|
|
|
|
|
24
|
|
|
7
|
|
|
|
|
17205
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 NAME |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
Toader::Entry::Manage - Manage entries. |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
=head1 VERSION |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
Version 1.0.0 |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=cut |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
our $VERSION = '1.0.0'; |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
=head1 METHODS |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
=head2 new |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
This initiates the object. |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
One argument is required and it is a L object. |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
After calling this, you should call setDir to set the directory to use. |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
my $foo = Toader::New->new( $toader ); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=cut |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
sub new{ |
38
|
0
|
|
|
0
|
1
|
|
my $toader=$_[1]; |
39
|
|
|
|
|
|
|
|
40
|
0
|
|
|
|
|
|
my $self={ |
41
|
|
|
|
|
|
|
error=>undef, |
42
|
|
|
|
|
|
|
errorString=>'', |
43
|
|
|
|
|
|
|
dir=>undef, |
44
|
|
|
|
|
|
|
edir=>undef, |
45
|
|
|
|
|
|
|
isatd=>Toader::isaToaderDir->new, |
46
|
|
|
|
|
|
|
helper=>undef, |
47
|
|
|
|
|
|
|
VCSusable=>0, |
48
|
|
|
|
|
|
|
toader=>undef, |
49
|
|
|
|
|
|
|
errorExtra=>{ |
50
|
|
|
|
|
|
|
flags=>{ |
51
|
|
|
|
|
|
|
1=>'noDirSpecified', |
52
|
|
|
|
|
|
|
2=>'isaToaderDirErrored', |
53
|
|
|
|
|
|
|
3=>'notAtoaderDir', |
54
|
|
|
|
|
|
|
4=>'noDirDefined', |
55
|
|
|
|
|
|
|
5=>'openDirFailed', |
56
|
|
|
|
|
|
|
6=>'noEntrySpecified', |
57
|
|
|
|
|
|
|
7=>'invalidEntryName', |
58
|
|
|
|
|
|
|
8=>'entryDoesNotExist', |
59
|
|
|
|
|
|
|
9=>'unlinkFailed', |
60
|
|
|
|
|
|
|
10=>'openEntryFailed', |
61
|
|
|
|
|
|
|
11=>'entryObjCreationFailed', |
62
|
|
|
|
|
|
|
12=>'notAtoaderObj', |
63
|
|
|
|
|
|
|
13=>'getVCSerrored', |
64
|
|
|
|
|
|
|
14=>'VCSusableErrored', |
65
|
|
|
|
|
|
|
15=>'underVCSerrored', |
66
|
|
|
|
|
|
|
16=>'VCSdeleteErrored', |
67
|
|
|
|
|
|
|
17=>'noToaderObj', |
68
|
|
|
|
|
|
|
18=>'helperNewErrored', |
69
|
|
|
|
|
|
|
19=>'cacheNewErrored', |
70
|
|
|
|
|
|
|
20=>'cacheDirSetErrored', |
71
|
|
|
|
|
|
|
21=>'cacheUpdateAllErrored', |
72
|
|
|
|
|
|
|
22=>'entryNameSetErrored', |
73
|
|
|
|
|
|
|
23=>'entryWriteErrored', |
74
|
|
|
|
|
|
|
}, |
75
|
|
|
|
|
|
|
}, |
76
|
|
|
|
|
|
|
}; |
77
|
0
|
|
|
|
|
|
bless $self; |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
#if we have a Toader object, reel it in |
80
|
0
|
0
|
|
|
|
|
if ( ! defined( $toader ) ){ |
81
|
0
|
|
|
|
|
|
$self->{perror}=1; |
82
|
0
|
|
|
|
|
|
$self->{error}=17; |
83
|
0
|
|
|
|
|
|
$self->{errorString}='No Toader object specified'; |
84
|
0
|
|
|
|
|
|
$self->warn; |
85
|
0
|
|
|
|
|
|
return $self; |
86
|
|
|
|
|
|
|
} |
87
|
0
|
0
|
|
|
|
|
if ( ref( $toader ) ne "Toader" ){ |
88
|
0
|
|
|
|
|
|
$self->{perror}=1; |
89
|
0
|
|
|
|
|
|
$self->{error}=12; |
90
|
0
|
|
|
|
|
|
$self->{errorString}='The object specified is a "'.ref($toader).'"'; |
91
|
0
|
|
|
|
|
|
$self->warn; |
92
|
0
|
|
|
|
|
|
return $self; |
93
|
|
|
|
|
|
|
} |
94
|
0
|
|
|
|
|
|
$self->{toader}=$toader; |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
#init the helper |
97
|
0
|
|
|
|
|
|
$self->{helper}=Toader::Entry::Helper->new( $self->{toader} ); |
98
|
0
|
0
|
|
|
|
|
if ( $self->{helper}->error ){ |
99
|
0
|
|
|
|
|
|
$self->{perror}=1; |
100
|
0
|
|
|
|
|
|
$self->{error}=18; |
101
|
|
|
|
|
|
|
$self->{errorString}='Failed to initialize Toader::Entry::Helper.'. |
102
|
0
|
|
|
|
|
|
'error="'.$self->{helper}->error.'" errorString="'.$self->{helper}->errorString.'"'; |
103
|
0
|
|
|
|
|
|
$self->warn; |
104
|
0
|
|
|
|
|
|
return $self; |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
#gets the Toader::VCS object |
108
|
0
|
|
|
|
|
|
$self->{vcs}=$self->{toader}->getVCS; |
109
|
0
|
0
|
|
|
|
|
if ( $toader->error ){ |
110
|
0
|
|
|
|
|
|
$self->{perror}=1; |
111
|
0
|
|
|
|
|
|
$self->{error}=13; |
112
|
|
|
|
|
|
|
$self->{errorString}='Toader->getVCS errored. error="'. |
113
|
0
|
|
|
|
|
|
$self->{toader}->error.'" errorString="'.$self->{toader}->errorString.'"'; |
114
|
0
|
|
|
|
|
|
$self->warn; |
115
|
0
|
|
|
|
|
|
return $self; |
116
|
|
|
|
|
|
|
} |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
#checks if VCS is usable |
119
|
0
|
|
|
|
|
|
$self->{VCSusable}=$self->{vcs}->usable; |
120
|
0
|
0
|
|
|
|
|
if ( $self->{vcs}->error ){ |
121
|
0
|
|
|
|
|
|
$self->{perror}=1; |
122
|
0
|
|
|
|
|
|
$self->{error}=14; |
123
|
|
|
|
|
|
|
$self->{errorString}='Toader::VCS->usable errored. error="'. |
124
|
0
|
|
|
|
|
|
$self->{toader}->error.'" errorString="'.$self->{toader}->errorString.'"'; |
125
|
0
|
|
|
|
|
|
$self->warn; |
126
|
0
|
|
|
|
|
|
return $self; |
127
|
|
|
|
|
|
|
} |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
#inits the cache |
130
|
0
|
|
|
|
|
|
my $cache=Toader::Entry::Cache->new( $toader ); |
131
|
0
|
0
|
|
|
|
|
if ( $cache->error ){ |
132
|
0
|
|
|
|
|
|
$self->{perror}=1; |
133
|
0
|
|
|
|
|
|
$self->{error}=19; |
134
|
0
|
|
|
|
|
|
$self->{errorString}='Toader::Entry::Cache->new errored. error="'. |
135
|
|
|
|
|
|
|
$cache->error.'" errorString="'.$cache->errorString.'"'; |
136
|
0
|
|
|
|
|
|
$self->warn; |
137
|
0
|
|
|
|
|
|
return $self; |
138
|
|
|
|
|
|
|
} |
139
|
0
|
|
|
|
|
|
$self->{cache}=$cache; |
140
|
|
|
|
|
|
|
|
141
|
0
|
|
|
|
|
|
return $self; |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
=head2 cacheGet |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
This returns the L object. |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
There are no arguments taken. |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
my $cache=$foo->cacheGet; |
151
|
|
|
|
|
|
|
if($foo->error){ |
152
|
|
|
|
|
|
|
warn('error: '.$foo->error.":".$foo->errorString); |
153
|
|
|
|
|
|
|
} |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
=cut |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
sub cacheGet{ |
158
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
#blank any previous errors |
161
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
162
|
0
|
|
|
|
|
|
return undef; |
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
#make sure a directory has been set |
166
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
167
|
0
|
|
|
|
|
|
$self->{error}='4'; |
168
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
169
|
0
|
|
|
|
|
|
$self->warn; |
170
|
0
|
|
|
|
|
|
return undef; |
171
|
|
|
|
|
|
|
} |
172
|
|
|
|
|
|
|
|
173
|
0
|
|
|
|
|
|
return $self->{cache}; |
174
|
|
|
|
|
|
|
} |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
=head2 cacheUpdateAll |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
This updates the cache for all entries. |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
There are no arguments taken. |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
$foo->cacheUpdateAll; |
183
|
|
|
|
|
|
|
if($foo->error){ |
184
|
|
|
|
|
|
|
warn('error: '.$foo->error.":".$foo->errorString); |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
=cut |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
sub cacheUpdateAll{ |
190
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
#blank any previous errors |
193
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
194
|
0
|
|
|
|
|
|
return undef; |
195
|
|
|
|
|
|
|
} |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
#make sure a directory has been set |
198
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
199
|
0
|
|
|
|
|
|
$self->{error}='4'; |
200
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
201
|
0
|
|
|
|
|
|
$self->warn; |
202
|
0
|
|
|
|
|
|
return undef; |
203
|
|
|
|
|
|
|
} |
204
|
|
|
|
|
|
|
|
205
|
0
|
|
|
|
|
|
$self->{cache}->updateAll; |
206
|
0
|
0
|
|
|
|
|
if ( $self->{cache}->error ){ |
207
|
0
|
|
|
|
|
|
$self->{error}=21; |
208
|
|
|
|
|
|
|
$self->{errorString}='Toader::Entry::Cache->updateAll errored. error="'. |
209
|
0
|
|
|
|
|
|
$self->{cache}->error.'" errorString="'.$self->{cache}->errorString.'"'; |
210
|
0
|
|
|
|
|
|
$self->warn; |
211
|
0
|
|
|
|
|
|
return undef; |
212
|
|
|
|
|
|
|
} |
213
|
|
|
|
|
|
|
|
214
|
0
|
|
|
|
|
|
return 1; |
215
|
|
|
|
|
|
|
} |
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
=head2 list |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
This lists the available entries. |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
my @entries=$foo->list; |
222
|
|
|
|
|
|
|
if($foo->error){ |
223
|
|
|
|
|
|
|
warn('error: '.$foo->error.":".$foo->errorString); |
224
|
|
|
|
|
|
|
} |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
=cut |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
sub list{ |
229
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
#blank any previous errors |
232
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
233
|
0
|
|
|
|
|
|
return undef; |
234
|
|
|
|
|
|
|
} |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
#make sure a directory has been set |
237
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
238
|
0
|
|
|
|
|
|
$self->{error}='4'; |
239
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
240
|
0
|
|
|
|
|
|
$self->warn; |
241
|
0
|
|
|
|
|
|
return undef; |
242
|
|
|
|
|
|
|
} |
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
#this will be returned |
245
|
0
|
|
|
|
|
|
my @entries; |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
#makes sure we have a entry directory |
248
|
0
|
0
|
|
|
|
|
if (!-d $self->{edir}) { |
249
|
0
|
|
|
|
|
|
return @entries; |
250
|
|
|
|
|
|
|
} |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
#read what is present in the directory |
253
|
0
|
|
|
|
|
|
my $dh; |
254
|
0
|
0
|
|
|
|
|
if (!opendir($dh, $self->{edir})) { |
255
|
0
|
|
|
|
|
|
$self->{error}='5'; |
256
|
0
|
|
|
|
|
|
$self->{errorString}='Failed to open the directory "'.$self->{dir}.'"'; |
257
|
0
|
|
|
|
|
|
$self->warn; |
258
|
0
|
|
|
|
|
|
return undef; |
259
|
|
|
|
|
|
|
} |
260
|
0
|
0
|
|
|
|
|
@entries=grep( { -f $self->{edir}.'/'.$_ && /$self->{helper}->{regex}/ } readdir($dh) ); |
|
0
|
|
|
|
|
|
|
261
|
0
|
|
|
|
|
|
close($dh); |
262
|
|
|
|
|
|
|
|
263
|
0
|
|
|
|
|
|
return @entries; |
264
|
|
|
|
|
|
|
} |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
=head2 published |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
This returns a list of published or unpublished entries. |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
One argument is accepted and that is the return value from |
271
|
|
|
|
|
|
|
Toader::Entry->publishGet. If that is not defined, then '1' |
272
|
|
|
|
|
|
|
is used. |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
This will throw a warning for entries that can not be read, |
275
|
|
|
|
|
|
|
it will not throw a error. |
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
my @published=$foo->published; |
278
|
|
|
|
|
|
|
if ( $foo->error ){ |
279
|
|
|
|
|
|
|
warn( 'Error:'.$foo->error.': '.$foo->errorStrin ); |
280
|
|
|
|
|
|
|
} |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
=cut |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
sub published{ |
285
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
286
|
0
|
|
|
|
|
|
my $bool=$_[1]; |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
#blank any previous errors |
289
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
290
|
0
|
|
|
|
|
|
return undef; |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
#set the default |
294
|
0
|
0
|
|
|
|
|
if ( ! defined( $bool ) ){ |
295
|
0
|
|
|
|
|
|
$bool='1'; |
296
|
|
|
|
|
|
|
} |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
#make sure the boolean is definitely zero or one |
299
|
0
|
0
|
|
|
|
|
if ( $bool ){ |
300
|
0
|
|
|
|
|
|
$bool='1'; |
301
|
|
|
|
|
|
|
}else{ |
302
|
0
|
|
|
|
|
|
$bool='0'; |
303
|
|
|
|
|
|
|
} |
304
|
|
|
|
|
|
|
|
305
|
0
|
|
|
|
|
|
my @entries=$self->list; |
306
|
0
|
0
|
|
|
|
|
if ( $self->error ){ |
307
|
0
|
|
|
|
|
|
$self->warnString('Failed to list the entries'); |
308
|
0
|
|
|
|
|
|
return undef; |
309
|
|
|
|
|
|
|
} |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
#checks for them all |
312
|
0
|
|
|
|
|
|
my @published; |
313
|
0
|
|
|
|
|
|
my $int=0; |
314
|
0
|
|
|
|
|
|
while ( defined( $entries[$int] ) ){ |
315
|
0
|
|
|
|
|
|
my $entry=$self->read( $entries[$int] ); |
316
|
|
|
|
|
|
|
|
317
|
0
|
0
|
|
|
|
|
if ( $self->error ){ |
318
|
0
|
|
|
|
|
|
$self->warnString('Failed to read entry "'.$entries[$int].'"'); |
319
|
|
|
|
|
|
|
}else{ |
320
|
0
|
|
|
|
|
|
my $ispublished=$entry->publishGet; |
321
|
0
|
0
|
|
|
|
|
if ( $ispublished eq $bool ){ |
322
|
0
|
|
|
|
|
|
push( @published, $entries[$int] ); |
323
|
|
|
|
|
|
|
} |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
|
326
|
0
|
|
|
|
|
|
$int++; |
327
|
|
|
|
|
|
|
} |
328
|
|
|
|
|
|
|
|
329
|
0
|
|
|
|
|
|
return @published; |
330
|
|
|
|
|
|
|
} |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
=head2 read |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
This reads a entry. |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
One argument is taken and that is the entry name. |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
my $entry=$foo->read( $entryName ); |
339
|
|
|
|
|
|
|
if ( $foo->error ){ |
340
|
|
|
|
|
|
|
warn( 'Error:'.$foo->error.': '.$foo->errorStrin ); |
341
|
|
|
|
|
|
|
} |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=cut |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
sub read{ |
346
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
347
|
0
|
|
|
|
|
|
my $entry=$_[1]; |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
#blank any previous errors |
350
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
351
|
0
|
|
|
|
|
|
return undef; |
352
|
|
|
|
|
|
|
} |
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
#make sure a directory has been set |
355
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
356
|
0
|
|
|
|
|
|
$self->{error}='4'; |
357
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
358
|
0
|
|
|
|
|
|
$self->warn; |
359
|
0
|
|
|
|
|
|
return undef; |
360
|
|
|
|
|
|
|
} |
361
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
#make sure it is valid and exists |
363
|
0
|
|
|
|
|
|
my $returned=$self->{helper}->entryExists($entry); |
364
|
0
|
0
|
|
|
|
|
if (!$returned) { |
365
|
0
|
0
|
|
|
|
|
if ($self->{helper}->error){ |
366
|
0
|
|
|
|
|
|
$self->{error}=7; |
367
|
0
|
|
|
|
|
|
$self->{errorString}='The entry name is not valid'; |
368
|
|
|
|
|
|
|
}else { |
369
|
0
|
|
|
|
|
|
$self->{error}=8; |
370
|
0
|
|
|
|
|
|
$self->{errorString}='The entry does not exist'; |
371
|
|
|
|
|
|
|
} |
372
|
0
|
|
|
|
|
|
$self->warn; |
373
|
0
|
|
|
|
|
|
return undef; |
374
|
|
|
|
|
|
|
} |
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
#the file that will be read |
377
|
0
|
|
|
|
|
|
my $file=$self->{dir}.'/.toader/entries/'.$entry; |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
#reads it |
380
|
0
|
|
|
|
|
|
my $entryString; |
381
|
|
|
|
|
|
|
my $fh; |
382
|
0
|
0
|
|
|
|
|
if ( ! open($fh, '<', $file) ){ |
383
|
0
|
|
|
|
|
|
$self->{error}=10; |
384
|
0
|
|
|
|
|
|
$self->{errorString}='Unable to open "'.$file.'" for writing'; |
385
|
0
|
|
|
|
|
|
$self->warn; |
386
|
0
|
|
|
|
|
|
return undef; |
387
|
|
|
|
|
|
|
} |
388
|
0
|
|
|
|
|
|
$entryString=join("", <$fh>); |
389
|
0
|
|
|
|
|
|
close($fh); |
390
|
|
|
|
|
|
|
|
391
|
0
|
|
|
|
|
|
my $entryObj=Toader::Entry->newFromString($entryString, $self->{toader}); |
392
|
0
|
0
|
|
|
|
|
if ($entryObj->error) { |
393
|
0
|
|
|
|
|
|
$self->{error}=11; |
394
|
0
|
|
|
|
|
|
$self->{errorString}='Unable to generate a Toader::Entry object from '; |
395
|
0
|
|
|
|
|
|
$self->warn; |
396
|
0
|
|
|
|
|
|
return undef; |
397
|
|
|
|
|
|
|
} |
398
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
#sets the directory |
400
|
0
|
|
|
|
|
|
$entryObj->dirSet($self->{dir}); |
401
|
0
|
|
|
|
|
|
$entryObj->entryNameSet($entry); |
402
|
|
|
|
|
|
|
|
403
|
0
|
|
|
|
|
|
return $entryObj; |
404
|
|
|
|
|
|
|
} |
405
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=head2 remove |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
This removes a entry. It will remove it from VCS and the cache as well. |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
One argument is required and it is entry name. |
411
|
|
|
|
|
|
|
|
412
|
|
|
|
|
|
|
$foo->remove($entry); |
413
|
|
|
|
|
|
|
if($foo->error){ |
414
|
|
|
|
|
|
|
warn('error: '.$foo->error.":".$foo->errorString); |
415
|
|
|
|
|
|
|
} |
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
=cut |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
sub remove{ |
420
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
421
|
0
|
|
|
|
|
|
my $entry=$_[1]; |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
#blank any previous errors |
424
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
425
|
0
|
|
|
|
|
|
return undef; |
426
|
|
|
|
|
|
|
} |
427
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
#makes sure a entry is specified |
429
|
0
|
0
|
|
|
|
|
if (!defined($entry)) { |
430
|
0
|
|
|
|
|
|
$self->{error}='6'; |
431
|
0
|
|
|
|
|
|
$self->{errorString}='No entry specified'; |
432
|
0
|
|
|
|
|
|
$self->warn; |
433
|
0
|
|
|
|
|
|
return undef; |
434
|
|
|
|
|
|
|
} |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
#make sure a directory has been set |
437
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
438
|
0
|
|
|
|
|
|
$self->{error}='4'; |
439
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
440
|
0
|
|
|
|
|
|
$self->warn; |
441
|
0
|
|
|
|
|
|
return undef; |
442
|
|
|
|
|
|
|
} |
443
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
#make sure it is valid and exists |
445
|
0
|
|
|
|
|
|
my $returned=$self->{helper}->entryExists($entry); |
446
|
0
|
0
|
|
|
|
|
if (!$returned) { |
447
|
0
|
0
|
|
|
|
|
if ($self->{helper}->error){ |
448
|
0
|
|
|
|
|
|
$self->{error}=7; |
449
|
0
|
|
|
|
|
|
$self->{errorString}='The entry name is not valid'; |
450
|
|
|
|
|
|
|
}else { |
451
|
0
|
|
|
|
|
|
$self->{error}=8; |
452
|
0
|
|
|
|
|
|
$self->{errorString}='The entry does not exist'; |
453
|
|
|
|
|
|
|
} |
454
|
0
|
|
|
|
|
|
$self->warn; |
455
|
0
|
|
|
|
|
|
return undef; |
456
|
|
|
|
|
|
|
} |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
#saves this for later |
459
|
0
|
|
|
|
|
|
my $file=$self->{edir}.'/'.$entry; |
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
#unlinks it |
462
|
0
|
0
|
|
|
|
|
if (!unlink( $file )) { |
463
|
0
|
|
|
|
|
|
$self->{error}=9; |
464
|
0
|
|
|
|
|
|
$self->{errorString}='Failed to unlink the entry'; |
465
|
0
|
|
|
|
|
|
$self->warn; |
466
|
0
|
|
|
|
|
|
return undef; |
467
|
|
|
|
|
|
|
} |
468
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
#if VCS is not usable, return here |
470
|
0
|
0
|
|
|
|
|
if ( ! $self->{VCSusable} ){ |
471
|
0
|
|
|
|
|
|
return 1; |
472
|
|
|
|
|
|
|
} |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
#if it is not under VCS, we have nothing to do |
475
|
0
|
|
|
|
|
|
my $underVCS=$self->{vcs}->underVCS($file); |
476
|
0
|
0
|
|
|
|
|
if ( $self->{vcs}->error ){ |
477
|
0
|
|
|
|
|
|
$self->{error}=15; |
478
|
|
|
|
|
|
|
$self->{errorString}='Toader::VCS->underVCS errored. error="'. |
479
|
0
|
|
|
|
|
|
$self->{vcs}->error.'" errorString="'.$self->{vcs}->errorString.'"'; |
480
|
0
|
|
|
|
|
|
$self->warn; |
481
|
0
|
|
|
|
|
|
return undef; |
482
|
|
|
|
|
|
|
} |
483
|
0
|
0
|
|
|
|
|
if ( $underVCS ){ |
484
|
0
|
|
|
|
|
|
return 1; |
485
|
|
|
|
|
|
|
} |
486
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
#delete it as if we reach here it is not under VCS and VCS is being used |
488
|
0
|
|
|
|
|
|
$self->{vcs}->delete( $file ); |
489
|
0
|
0
|
|
|
|
|
if ( $self->{vcs}->error ){ |
490
|
0
|
|
|
|
|
|
$self->{error}=16; |
491
|
|
|
|
|
|
|
$self->{errorString}='Toader::VCS->delete errored. error="'. |
492
|
0
|
|
|
|
|
|
$self->{vcs}->error.'" errorString="'.$self->{vcs}->errorString.'"'; |
493
|
0
|
|
|
|
|
|
$self->warn; |
494
|
0
|
|
|
|
|
|
return undef; |
495
|
|
|
|
|
|
|
} |
496
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
#deletes the entry from the cache |
498
|
0
|
|
|
|
|
|
$self->{cache}->deleteEntry( $entry ); |
499
|
0
|
0
|
|
|
|
|
if ( $self->{cache}->error ){ |
500
|
0
|
|
|
|
|
|
$self->{error}=24; |
501
|
|
|
|
|
|
|
$self->{errorString}='Toader::Entry::Cache->deleteEntry errored. error="'. |
502
|
0
|
|
|
|
|
|
$self->{cache}->error.' errorString="'.$self->{cache}->errorString.'"'; |
503
|
0
|
|
|
|
|
|
$self->warn; |
504
|
0
|
|
|
|
|
|
return undef; |
505
|
|
|
|
|
|
|
} |
506
|
|
|
|
|
|
|
|
507
|
0
|
|
|
|
|
|
return 1; |
508
|
|
|
|
|
|
|
} |
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
=head2 setDir |
511
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
This sets the directory the module will work on. |
513
|
|
|
|
|
|
|
|
514
|
|
|
|
|
|
|
One argument is taken and that is the path for the L directory |
515
|
|
|
|
|
|
|
in question. |
516
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
$foo->setDir($toaderDirectory) |
518
|
|
|
|
|
|
|
if($foo->error){ |
519
|
|
|
|
|
|
|
warn('error: '.$foo->error.":".$foo->errorString); |
520
|
|
|
|
|
|
|
} |
521
|
|
|
|
|
|
|
|
522
|
|
|
|
|
|
|
=cut |
523
|
|
|
|
|
|
|
|
524
|
|
|
|
|
|
|
sub setDir{ |
525
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
526
|
0
|
|
|
|
|
|
my $directory=$_[1]; |
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
#blank any previous errors |
529
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
530
|
0
|
|
|
|
|
|
return undef; |
531
|
|
|
|
|
|
|
} |
532
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
#makes sure a directory is specified |
534
|
0
|
0
|
|
|
|
|
if (!defined($directory)) { |
535
|
0
|
|
|
|
|
|
$self->{error}='1'; |
536
|
0
|
|
|
|
|
|
$self->{errorString}='No directory specified'; |
537
|
0
|
|
|
|
|
|
$self->warn; |
538
|
0
|
|
|
|
|
|
return undef; |
539
|
|
|
|
|
|
|
} |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
#cleans up the naming |
542
|
0
|
|
|
|
|
|
my $pathHelper=Toader::pathHelper->new( $directory ); |
543
|
0
|
|
|
|
|
|
$directory=$pathHelper->cleanup( $directory ); |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
#makes sure it is a directory |
546
|
0
|
|
|
|
|
|
my $returned=$self->{isatd}->isaToaderDir($directory); |
547
|
0
|
0
|
|
|
|
|
if(!$returned){ |
548
|
0
|
0
|
|
|
|
|
if($self->{isatd}->error){ |
549
|
0
|
|
|
|
|
|
$self->{error}='2'; |
550
|
0
|
|
|
|
|
|
$self->{errorString}='isaToaderDir errored. error="'.$self->{isatd}->error.'" errorString="'.$self->{isatd}->errorString.'"'; |
551
|
0
|
|
|
|
|
|
$self->warn; |
552
|
0
|
|
|
|
|
|
return undef; |
553
|
|
|
|
|
|
|
} |
554
|
0
|
|
|
|
|
|
$self->{error}='3'; |
555
|
0
|
|
|
|
|
|
$self->{errorString}='"'.$directory.'" is not a Toader directory'; |
556
|
0
|
|
|
|
|
|
$self->warn; |
557
|
0
|
|
|
|
|
|
return undef; |
558
|
|
|
|
|
|
|
} |
559
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
#it has been verified, so set it |
561
|
0
|
|
|
|
|
|
$self->{dir}=$directory; |
562
|
0
|
|
|
|
|
|
$self->{helper}->setDir($directory); #if the previous check has been worked, then this well |
563
|
0
|
|
|
|
|
|
$self->{edir}=$self->{helper}->entryDirectory; |
564
|
|
|
|
|
|
|
|
565
|
|
|
|
|
|
|
#sets it for the cache |
566
|
0
|
|
|
|
|
|
$self->{cache}->setDir( $directory ); |
567
|
0
|
0
|
|
|
|
|
if ( $self->{cache}->error ){ |
568
|
0
|
|
|
|
|
|
$self->{error}=20; |
569
|
|
|
|
|
|
|
$self->{errorString}='Toader::Entry::Cache->setDir errored. error="'. |
570
|
0
|
|
|
|
|
|
$self->{cache}->error.'" errorString="'.$self->{cache}->errorString.'"'; |
571
|
0
|
|
|
|
|
|
$self->warn; |
572
|
0
|
|
|
|
|
|
return undef; |
573
|
|
|
|
|
|
|
} |
574
|
|
|
|
|
|
|
|
575
|
0
|
|
|
|
|
|
return 1; |
576
|
|
|
|
|
|
|
} |
577
|
|
|
|
|
|
|
|
578
|
|
|
|
|
|
|
=head2 touch |
579
|
|
|
|
|
|
|
|
580
|
|
|
|
|
|
|
This updates the entry name to a newer one. |
581
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
=cut |
583
|
|
|
|
|
|
|
|
584
|
|
|
|
|
|
|
sub touch{ |
585
|
0
|
|
|
0
|
1
|
|
my $self=$_[0]; |
586
|
0
|
|
|
|
|
|
my $entryName=$_[1]; |
587
|
|
|
|
|
|
|
|
588
|
|
|
|
|
|
|
#blank any previous errors |
589
|
0
|
0
|
|
|
|
|
if (!$self->errorblank) { |
590
|
0
|
|
|
|
|
|
return undef; |
591
|
|
|
|
|
|
|
} |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
#make sure a directory has been set |
594
|
0
|
0
|
|
|
|
|
if (!defined($self->{dir})) { |
595
|
0
|
|
|
|
|
|
$self->{error}='4'; |
596
|
0
|
|
|
|
|
|
$self->{errorString}='No directory has been set yet'; |
597
|
0
|
|
|
|
|
|
$self->warn; |
598
|
0
|
|
|
|
|
|
return undef; |
599
|
|
|
|
|
|
|
} |
600
|
|
|
|
|
|
|
|
601
|
0
|
|
|
|
|
|
my $entry=$self->read( $entryName ); |
602
|
0
|
0
|
|
|
|
|
if ( $self->error ){ |
603
|
0
|
|
|
|
|
|
return undef; |
604
|
|
|
|
|
|
|
} |
605
|
|
|
|
|
|
|
|
606
|
|
|
|
|
|
|
#sets a new entryname |
607
|
0
|
|
|
|
|
|
$entry->entryNameSet; |
608
|
0
|
0
|
|
|
|
|
if ( $entry->error ){ |
609
|
0
|
|
|
|
|
|
$self->{error}=22; |
610
|
0
|
|
|
|
|
|
$self->{errorString}='Toader::Entry->entyNameSet errored. error="'. |
611
|
|
|
|
|
|
|
$entry->error.' errorString="'.$entry->errorString.'"'; |
612
|
0
|
|
|
|
|
|
$self->warn; |
613
|
0
|
|
|
|
|
|
return undef; |
614
|
|
|
|
|
|
|
} |
615
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
#writes it out |
617
|
0
|
|
|
|
|
|
$entry->write; |
618
|
0
|
0
|
|
|
|
|
if ( $entry->error ){ |
619
|
0
|
|
|
|
|
|
$self->{error}=23; |
620
|
0
|
|
|
|
|
|
$self->{errorString}='Toader::Entry->write errored. error="'. |
621
|
|
|
|
|
|
|
$entry->error.' errorString="'.$entry->errorString.'"'; |
622
|
0
|
|
|
|
|
|
$self->warn; |
623
|
0
|
|
|
|
|
|
return undef; |
624
|
|
|
|
|
|
|
} |
625
|
|
|
|
|
|
|
|
626
|
|
|
|
|
|
|
#deletes the old one |
627
|
0
|
|
|
|
|
|
$self->remove( $entryName ); |
628
|
0
|
0
|
|
|
|
|
if ( $self->error ){ |
629
|
0
|
|
|
|
|
|
return undef; |
630
|
|
|
|
|
|
|
} |
631
|
|
|
|
|
|
|
|
632
|
0
|
|
|
|
|
|
return 1; |
633
|
|
|
|
|
|
|
} |
634
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
=head1 ERROR CODES/Flags |
636
|
|
|
|
|
|
|
|
637
|
|
|
|
|
|
|
=head2 1, noDirSpecified |
638
|
|
|
|
|
|
|
|
639
|
|
|
|
|
|
|
No directory specified. |
640
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
=head2 2, isaToaderDirErrored |
642
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
isaToaderDir errored. |
644
|
|
|
|
|
|
|
|
645
|
|
|
|
|
|
|
=head2 3, notAtoaderDir |
646
|
|
|
|
|
|
|
|
647
|
|
|
|
|
|
|
Is not a L directory. |
648
|
|
|
|
|
|
|
|
649
|
|
|
|
|
|
|
=head2 4, noDirDefined |
650
|
|
|
|
|
|
|
|
651
|
|
|
|
|
|
|
No directory has been defined. |
652
|
|
|
|
|
|
|
|
653
|
|
|
|
|
|
|
=head2 5, openDirFailed |
654
|
|
|
|
|
|
|
|
655
|
|
|
|
|
|
|
Failed to open the directory. |
656
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
=head2 6, noEntrySpecified |
658
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
No entry specified. |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
=head2 7, invalidEntryName |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
The entry is not a valid name. |
664
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
=head2 8, entryDoesNotExist |
666
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
The entry does not exist. |
668
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
=head2 9, unlinkFailed |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
Failed to unlink the entry. |
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
=head2 10, openEntryFailed |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
Unable to open the entry file for reading. |
676
|
|
|
|
|
|
|
|
677
|
|
|
|
|
|
|
=head2 11, entryObjCreationFailed |
678
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
Generating a L object from a alredy existing entry failed. |
680
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
=head2 12, notAtoaderObj |
682
|
|
|
|
|
|
|
|
683
|
|
|
|
|
|
|
The object specified is not a L object. |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
=head2 13, getVCSerrored |
686
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
L->getVCS errored. |
688
|
|
|
|
|
|
|
|
689
|
|
|
|
|
|
|
=head2 14, VCSusableErrored |
690
|
|
|
|
|
|
|
|
691
|
|
|
|
|
|
|
L->usable errored. |
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
=head2 15, underVCSerrored |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
L->underVCS errored. |
696
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
=head2 16, VCSdeleteErrored |
698
|
|
|
|
|
|
|
|
699
|
|
|
|
|
|
|
L->delete errored. |
700
|
|
|
|
|
|
|
|
701
|
|
|
|
|
|
|
=head2 17, noToaderObj |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
No L object specified. |
704
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
=head2 18, helperNewErrored |
706
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
L->new errored. |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
=head2 19, cacheNewErrored |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
L->new errored. |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
=head2 20, cacheDirSetErrored |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
L->setDir errored. |
716
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
=head2 21, cacheUpdateAllErrored |
718
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
L->updateAll errored. |
720
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
=head2 22, entryNameSetErrored |
722
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
L->entryNameSet errored. |
724
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
=head2 23, entryWriteErrored |
726
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
L->write errored. |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
=head2 24, cacheDeleteEntryErrored |
730
|
|
|
|
|
|
|
|
731
|
|
|
|
|
|
|
L->deleteEntry errored. |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
If this errors it means the cache is screwed in some manner and |
734
|
|
|
|
|
|
|
needs reinited via L->reinit. |
735
|
|
|
|
|
|
|
|
736
|
|
|
|
|
|
|
=head1 AUTHOR |
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
Zane C. Bowers-Hadley, C<< >> |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
=head1 BUGS |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
Please report any bugs or feature requests to C, or through |
744
|
|
|
|
|
|
|
the web interface at L. I will be notified, and then you'll |
745
|
|
|
|
|
|
|
automatically be notified of progress on your bug as I make changes. |
746
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
|
748
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
|
750
|
|
|
|
|
|
|
=head1 SUPPORT |
751
|
|
|
|
|
|
|
|
752
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
perldoc Toader::Entry::Manage |
755
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
You can also look for information at: |
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
=over 4 |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
=item * RT: CPAN's request tracker |
762
|
|
|
|
|
|
|
|
763
|
|
|
|
|
|
|
L |
764
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
=item * AnnoCPAN: Annotated CPAN documentation |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
L |
768
|
|
|
|
|
|
|
|
769
|
|
|
|
|
|
|
=item * CPAN Ratings |
770
|
|
|
|
|
|
|
|
771
|
|
|
|
|
|
|
L |
772
|
|
|
|
|
|
|
|
773
|
|
|
|
|
|
|
=item * Search CPAN |
774
|
|
|
|
|
|
|
|
775
|
|
|
|
|
|
|
L |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
=back |
778
|
|
|
|
|
|
|
|
779
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
=head1 LICENSE AND COPYRIGHT |
784
|
|
|
|
|
|
|
|
785
|
|
|
|
|
|
|
Copyright 2014 Zane C. Bowers-Hadley. |
786
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it |
788
|
|
|
|
|
|
|
under the terms of either: the GNU General Public License as published |
789
|
|
|
|
|
|
|
by the Free Software Foundation; or the Artistic License. |
790
|
|
|
|
|
|
|
|
791
|
|
|
|
|
|
|
See http://dev.perl.org/licenses/ for more information. |
792
|
|
|
|
|
|
|
|
793
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
=cut |
795
|
|
|
|
|
|
|
|
796
|
|
|
|
|
|
|
1; # End of Toader |