ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/TreeItem.pm
Revision: 1.2
Committed: Fri Dec 10 13:41:38 2004 UTC (20 years, 4 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_0_0
Changes since 1.1: +399 -0 lines
Log Message:
Merged V1_0 branch to HEAD

File Contents

# User Rev Content
1 sashby 1.2 #____________________________________________________________________
2     # File: TreeItem.pm
3     #____________________________________________________________________
4     #
5     # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6     # Update: 2004-06-24 12:24:57+0200
7     # Revision: $Id: TreeItem.pm,v 1.1.2.6 2004/11/18 13:01:24 sashby Exp $
8     #
9     # Copyright: 2004 (C) Shaun Ashby
10     #
11     #--------------------------------------------------------------------
12     package BuildSystem::TreeItem;
13     require 5.004;
14     use Exporter;
15     @ISA=qw(Exporter);
16     @EXPORT_OK=qw( );
17    
18     sub new()
19     ###############################################################
20     # new #
21     ###############################################################
22     # modified : Thu Jun 24 12:25:02 2004 / SFA #
23     # params : #
24     # : #
25     # function : #
26     # : #
27     ###############################################################
28     {
29     my $proto=shift;
30     my $class=ref($proto) || $proto;
31     my $self={};
32    
33     bless $self,$class;
34     $self->{METABF} = [];
35     return $self;
36     }
37    
38     sub safepath()
39     {
40     my $self=shift;
41    
42     if ($self->{PATH})
43     {
44     # Make a safe path from our path:
45     ($safepath = $self->{PATH}) =~ s|/|_|g;
46     $self->{SAFEPATH} = $safepath;
47     }
48    
49     # Return the safe version of the current path:
50     return $self->{SAFEPATH};
51     }
52    
53     sub path()
54     {
55     my $self=shift;
56     @_ ? $self->{PATH} = shift
57     : $self->{PATH};
58     }
59    
60     sub class()
61     {
62     my $self=shift;
63     my ($class)=@_;
64     # Set/return the part of the ClassPath that matched a template name.
65     # Note that we store it as uppercase! The template name is, of course,
66     # exactly as it appears in the ClassPath:
67     if ($class)
68     {
69     # Store template name. We add the standard suffix:
70     $self->template($class."_template.tmpl");
71     $self->{CLASS} = uc($class);
72     }
73     else
74     {
75     return $self->{CLASS};
76     }
77     }
78    
79     sub template()
80     {
81     my $self=shift;
82     @_ ? $self->{TEMPLATE} = shift
83     : $self->{TEMPLATE};
84     }
85    
86     sub classdir()
87     {
88     my $self=shift;
89     # Set/return the part of the ClassPath that matched:
90     @_ ? $self->{CLASSDIR} = shift
91     : $self->{CLASSDIR};
92     }
93    
94     sub suffix()
95     {
96     my $self=shift;
97     # Set/return the part of the ClassPath that didn't match:
98     @_ ? $self->{SUFFIX} = shift
99     : $self->{SUFFIX};
100     }
101    
102     sub name()
103     {
104     my $self=shift;
105    
106     # Don't bother doing any work if the NAME exists already - just return it:
107     if (! exists($self->{NAME}))
108     {
109     my $classdir = $self->{CLASSDIR}; # Make a copy for protection
110     # Here we want to return a name that can be used in the templates.
111     # The name could be the name of the subsystem or the package:
112     if ($self->{CLASS} eq 'PACKAGE')
113     {
114     ($self->{NAME}) = ($classdir =~ m|^.*/(.*)?$|);
115     }
116     elsif ($self->{CLASS} eq 'SUBSYSTEM')
117     {
118     # We want the name of the subsystem:
119     ($self->{NAME}) = ($classdir =~ m|^.*/(.*)?$|);
120     }
121     else
122     {
123     # Here we have a path that ends in src/bin/test/doc etc. (for real
124     # build products). We still want to return the package name:
125     ($self->{NAME}) = ($classdir =~ m|^.*/(.*)/.*?$|);
126     }
127     }
128     else
129     {
130     return $self->{NAME};
131     }
132     }
133    
134     sub rawdata()
135     {
136     my $self=shift;
137     my ($rawdata)=@_;
138    
139     if ($rawdata)
140     {
141     $self->{RAWDATA} = $rawdata;
142     return $self;
143     }
144     else
145     {
146     if (exists ($self->{RAWDATA}))
147     {
148     return $self->{RAWDATA};
149     }
150     else
151     {
152     return undef;
153     }
154     }
155     }
156    
157     sub parent()
158     {
159     my $self=shift;
160     my ($datapath)=@_;
161     my $thisloc;
162    
163     if ($datapath)
164     {
165     # We don't want to store the parent of src (it has no parent):
166     if ($datapath eq $ENV{SCRAM_SOURCEDIR})
167     {
168     return;
169     }
170    
171     # Given a path like a/b/c we want to return the parent a/b:
172     ($thisloc) = ($datapath =~ m|^(.*)/.*?$|);
173    
174     if ($thisloc ne '')
175     {
176     $self->{PARENT} = $thisloc;
177     }
178     else
179     {
180     $self->{PARENT} = $ENV{SCRAM_SOURCEDIR};
181     }
182     }
183     else
184     {
185     (exists ($self->{PARENT})) ? return $self->{PARENT} : '' ;
186     }
187     }
188    
189     sub children()
190     {
191     my $self=shift;
192     my ($filecache) = @_;
193     my $safesubs=[];
194    
195     if ($filecache)
196     {
197     if (exists $filecache->{$self->{PATH}})
198     {
199     # Get array ref:
200     my @subdirs=@{$filecache->{$self->{PATH}}};
201     my $children=[];
202    
203     foreach my $SD (@subdirs)
204     {
205     # We don't want timestamps or CVS directories:
206     if ($SD !~ /.*CVS/ && $SD !~ /^[0-9]+$/)
207     {
208     my $datapath;
209     # We want to store the data paths for the children:
210     ($datapath = $SD) =~ s|^\Q$ENV{SCRAM_SOURCEDIR}\L/||;
211     push(@$children,$datapath);
212     push(@$safesubs,$SD);
213     }
214     }
215    
216     # Store the children only if there were some:
217     if ($#$children > -1)
218     {
219     $self->{CHILDREN} = $children;
220     # Make safe versions of each subdir:
221     $self->safesubdirs(@$safesubs);
222     }
223     }
224     }
225     else
226     {
227     (exists ($self->{CHILDREN})) ? return @{$self->{CHILDREN}} : undef ;
228     }
229     }
230    
231     sub metabf()
232     {
233     my $self=shift;
234     my (@metabf) = @_;
235    
236     if (@metabf)
237     {
238     foreach my $mbf (@metabf)
239     {
240     if (! grep($mbf eq $_, @{$self->{METABF}})) # Remove duplicates!!
241     {
242     push(@{$self->{METABF}}, $mbf);
243     }
244     }
245     }
246     else
247     {
248     return $self->{METABF};
249     }
250     }
251    
252     sub branchmetadata()
253     {
254     my $self=shift;
255     my ($meta)=@_;
256    
257     # Method to store/retrieve data for complete branch:
258     if ($meta)
259     {
260     # Delete unneeded entries:
261     $meta->clean(qw( EXPORT DEFINED_GROUP CLASSPATH ));
262     $self->{BRANCHMETA} = $meta;
263     }
264     else
265     {
266     return $self->{BRANCHMETA};
267     }
268     }
269    
270     sub branchdata()
271     {
272     my $self=shift;
273     @_ ? $self->{BRANCHDATA} = shift
274     : $self->{BRANCHDATA};
275     }
276    
277     sub clearmeta()
278     {
279     my $self=shift;
280     delete $self->{BRANCHDATA}, if (exists $self->{BRANCHDATA});
281     }
282    
283     sub updatechildlist()
284     {
285     my $self=shift;
286     my ($child)=@_;
287    
288     # Loop over list of children, removing the one specified:
289     my $uchildren = [];
290     my $uchilddirs = [];
291    
292     foreach my $c (@{$self->{CHILDREN}})
293     {
294     if ($c ne $child)
295     {
296     push(@$uchildren, $c);
297     # Convert this datapath into a path to be converted to a safepath:
298     push(@{$uchilddirs}, 'src/'.$c);
299     }
300     else
301     {
302     print "TreeItem: Removing $child from parents child list.","\n",if ($ENV{SCRAM_DEBUG});
303     }
304     }
305    
306     # Now store the new list of children:
307     $self->{CHILDREN} = [ @$uchildren ];
308     # Update the safe subdir names:
309     $self->updatesafesubdirs(@$uchilddirs);
310     }
311    
312     sub updatesafesubdirs()
313     {
314     my $self=shift;
315     my (@subdirs)=@_;
316     # Reset the SAFESUBDIRS to the list of subdirs given:
317     delete $self->{SAFESUBDIRS};
318     $self->safesubdirs(@subdirs);
319     }
320    
321     sub updateparentstatus()
322     {
323     my $self=shift;
324     my ($child) = @_;
325    
326     # Add child to CHILDREN (check to make sure it isn't there already):
327     if (exists($self->{CHILDREN}))
328     {
329     if (! grep($child eq $_, @{$self->{CHILDREN}})) # Remove duplicates!!
330     {
331     push(@{$self->{CHILDREN}},$child);
332     }
333     }
334     else
335     {
336     $self->{CHILDREN} = [ $child ];
337     }
338    
339     # Add the SAFESUBDIRS:
340     my $safedir = [ 'src/'.$child ];
341     $self->safesubdirs(@$safedir);
342     }
343    
344     sub template()
345     {
346     my $self=shift;
347     @_ ? $self->{TEMPLATE} = shift
348     : $self->{TEMPLATE};
349     }
350    
351     sub safesubdirs()
352     {
353     my $self=shift;
354     my (@subdirs)=@_;
355    
356     if (@subdirs)
357     {
358     # If we already have SAFESUBDIRS, add to them, don't overwrite:
359     if (exists($self->{SAFESUBDIRS}))
360     {
361     # Store the safe paths of all the children:
362     foreach my $sd (@subdirs)
363     {
364     $sd =~ s|/|_|g;
365     if (! grep($sd eq $_, @{$self->{SAFESUBDIRS}})) # Remove duplicates!!
366     {
367     push(@{$self->{SAFESUBDIRS}}, $sd);
368     }
369     }
370     }
371     else
372     {
373     my $safesubs=[];
374     map {$_ =~ s|/|_|g; push(@$safesubs, $_)} @subdirs;
375     $self->{SAFESUBDIRS} = $safesubs;
376     }
377     }
378     else
379     {
380     # Return formatted as a string:
381     return join(" ",@{$self->{SAFESUBDIRS}});
382     }
383     }
384    
385     sub scramprojectbases()
386     {
387     my $self=shift;
388     # This is needed at project level only:
389     @_ ? $self->{SCRAM_PROJECT_BASES} = shift
390     : $self->{SCRAM_PROJECT_BASES};
391     }
392    
393     sub clean()
394     {
395     my $self=shift;
396     delete $self->{BRANCHMETA};
397     }
398    
399     1;