ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Configuration/ConfigArea.pm
Revision: 1.18
Committed: Fri Sep 22 08:05:47 2000 UTC (24 years, 7 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.17: +48 -39 lines
Log Message:
Update for proper objectstore and cache handling

File Contents

# User Rev Content
1 williamc 1.1 #
2     # ConfigArea.pm
3     #
4 williamc 1.14 # Written by Christopher Williams
5 williamc 1.1 #
6     # Description
7 williamc 1.9 # -----------
8     # creates and manages a configuration area
9     #
10 williamc 1.14 # Notes
11 williamc 1.9 # -------
12 williamc 1.14 # Persistency - remember to call the save method to make changes persistent
13 williamc 1.1 #
14     # Interface
15     # ---------
16 williamc 1.14 # new() : A new ConfigArea object
17     # name() : get/set project name
18     # setup(dir[,areaname]) : setup a fresh area in dir
19     # satellite(dir[,areaname]) : setup a satellite area in dir
20     # version() : get/set project version
21     # location([dir]) : set/return the location of the work area
22     # bootstrapfromlocation([location]) : bootstrap the object based on location.
23     # no location specified - cwd used
24     # return 0 if succesful 1 otherwise
25     # requirementsdoc() : get set the requirements doc
26 williamc 1.5 # searchlocation([startdir]) : returns the location directory. search starts
27     # from cwd if not specified
28 williamc 1.14 # scramversion() : return the scram version associated with
29     # area
30     # configurationdir() : return the location of the project
31     # configuration directory
32     # copy(location) : copy a configuration
33     # copysetup(location) : copy the architecture specific tool setup
34     # returns 0 if successful, 1 otherwise
35     # copyenv($ref) : copy the areas environment into the hashref
36     # toolbox() : return the areas toolbox object
37     # save() : save changes permanently
38     # linkto(location) : link the current area to that at location
39     # unlinkarea() : destroy link (autosave)
40 williamc 1.15 # linkarea([ConfigArea]) : get/set a link from the current area to the apec Area Object
41 williamc 1.14 # archname() : get/set a string to indicate architecture
42     # archdir() : return the location of the administration arch dep
43     # directory
44 williamc 1.18 # objectstore() : return the objectStore object of the area
45 williamc 1.14 # - temporary
46     # align() : adjust hard paths to suit local loaction
47 williamc 1.1
48     package Configuration::ConfigArea;
49     require 5.004;
50 williamc 1.14 use URL::URLcache;
51 williamc 1.1 use Utilities::AddDir;
52 williamc 1.14 use Utilities::Verbose;
53 williamc 1.1 use ObjectUtilities::ObjectStore;
54 williamc 1.6 use Cwd;
55 williamc 1.14 @ISA=qw(Utilities::Verbose);
56 williamc 1.1
57 williamc 1.14 sub new {
58     my $class=shift;
59     my $self={};
60     bless $self, $class;
61 williamc 1.5
62 williamc 1.14 # data init
63     $self->{admindir}=".SCRAM";
64     $self->{cachedir}="cache";
65     $self->{dbdir}="ObjectDB";
66     undef $self->{linkarea};
67 williamc 1.8
68 williamc 1.14 return $self;
69 williamc 1.1 }
70    
71 williamc 1.14 sub cache {
72 williamc 1.9 my $self=shift;
73 williamc 1.16
74 williamc 1.18 if ( @_ ) {
75     $self->{cache}=shift;
76     }
77     if ( ! defined $self->{cache} ) {
78     my $loc=$self->location()."/".$self->{admindir}."/".$self->{cachedir};
79     if ( -e $loc ) {
80     $self->{cache}=URL::URLcache->new($loc);
81     }
82     else {
83     $self->{cache}=undef;
84     }
85     }
86     return $self->{cache};
87 williamc 1.14 }
88 williamc 1.9
89 williamc 1.18 sub _newcache {
90     my $self=shift;
91     my $loc=$self->location()."/".$self->{admindir}."/".$self->{cachedir};
92     $self->{cache}=URL::URLcache->new($loc);
93     return $self->{cache};
94     }
95    
96     sub _newobjectstore {
97     my $self=shift;
98     my $loc=$self->location()."/".$self->{admindir}."/".$self->{dbdir};
99     $self->{dbstore}=ObjectUtilities::ObjectStore->new($loc);
100     return $self->{dbstore};
101     }
102    
103 williamc 1.14 sub objectstore {
104 williamc 1.18 my $self=shift;
105 williamc 1.16
106 williamc 1.18 if ( @_ ) {
107     $self->{dbstore}=shift;
108     }
109     if ( ! defined $self->{dbstore} ) {
110     my $loc=$self->location()."/".$self->{admindir}."/".$self->{dbdir};
111     if ( -e $loc ) {
112     $self->{dbstore}=ObjectUtilities::ObjectStore->new($loc);
113     }
114     else {
115     $self->{dbstore}=undef;
116     }
117     }
118     return $self->{dbstore}
119 williamc 1.9 }
120    
121 williamc 1.14 sub name {
122 williamc 1.9 my $self=shift;
123 williamc 1.14 @_?$self->{name}=shift
124     :$self->{name};
125 williamc 1.9 }
126 williamc 1.7
127 williamc 1.14 sub version {
128 williamc 1.6 my $self=shift;
129 williamc 1.14 @_?$self->{version}=shift
130     :$self->{version};
131 williamc 1.9 }
132 williamc 1.8
133 williamc 1.1 sub setup {
134     my $self=shift;
135 williamc 1.14 my $location=shift;
136     my $areaname;
137 williamc 1.1
138 williamc 1.14 # -- check we have a project name and version
139     my $name=$self->name();
140     my $vers=$self->version();
141     if ( ( ! defined $name ) && ( ! defined $version )) {
142     $self->error("Set ConfigArea name and version before setup");
143     }
144    
145     # -- check arguments and set location
146 williamc 1.7 if ( ! defined $location ) {
147 williamc 1.14 $self->error("ConfigArea: Cannot setup new area without a location");
148 williamc 1.7 }
149 williamc 1.14 if ( @_ ) {
150     $areaname=shift;
151 williamc 1.6 }
152 williamc 1.14 if ( (! defined $areaname) || ( $areaname eq "" ) ) {
153     # -- make up a name from the project name and version
154     $vers=~s/^$name\_//;
155     $areaname=$name."_".$vers;
156 williamc 1.1 }
157 williamc 1.14 my $arealoc=$location."/".$areaname;
158     my $workloc=$arealoc."/".$self->{admindir};
159     $self->verbose("Building at $arealoc");
160     $self->location($arealoc);
161 williamc 1.1
162 williamc 1.14 # -- create top level structure and work area
163     AddDir::adddir($workloc);
164 williamc 1.1
165 williamc 1.14 # -- add a cache
166 williamc 1.18 $self->_newcache();
167    
168     # -- add an Objectstore
169     $self->_newobjectstore();
170 williamc 1.5
171 williamc 1.14 # -- Save Environment File
172     $self->_SaveEnvFile();
173 williamc 1.3
174 williamc 1.9 }
175    
176 williamc 1.14 sub configurationdir {
177 williamc 1.9 my $self=shift;
178 williamc 1.14 if ( @_ ) {
179     $self->{configurationdir}=shift;
180     }
181     return (defined $self->{configurationdir})?$self->{configurationdir}:undef;
182 williamc 1.9 }
183    
184 williamc 1.14 sub toolbox {
185 williamc 1.3 my $self=shift;
186 williamc 1.14 if ( ! defined $self->{toolbox} ) {
187     $self->{toolbox}=BuildSystem::ToolBox->new($self);
188     }
189     return $self->{toolbox};
190 williamc 1.4 }
191    
192 williamc 1.14 sub requirementsdoc {
193 williamc 1.5 my $self=shift;
194 williamc 1.14 if ( @_ ) {
195     $self->{reqdoc}=shift;
196     }
197     if ( defined $self->{reqdoc} ) {
198     return $self->location()."/".$self->{reqdoc};
199 williamc 1.12 }
200     else {
201 williamc 1.14 return undef;
202 williamc 1.12 }
203 williamc 1.5 }
204    
205 williamc 1.14 sub scramversion {
206 williamc 1.4 my $self=shift;
207 williamc 1.14 if ( ! defined $self->{scramversion} ) {
208     my $filename=$self->location()."/".$self->configurationdir()."/".
209     "scram_version";
210     if ( -f $filename ) {
211     use FileHandle;
212     $fh=FileHandle->new();
213     open ($fh, "<".$filename);
214     my $version=<$fh>;
215     chomp $version;
216     $self->{scramversion}=$version;
217     undef $fh;
218     }
219     }
220     return $self->{scramversion};
221 williamc 1.1 }
222    
223 williamc 1.14 sub bootstrapfromlocation {
224 williamc 1.1 my $self=shift;
225    
226 williamc 1.14 my $rv=0;
227    
228     my $location;
229     if ( ! defined ($location=$self->searchlocation(@_)) ) {
230     $rv=1;
231     $self->verbose("Unable to locate the top of local configuration area");
232 williamc 1.9 }
233     else {
234 williamc 1.14 $self->location($location);
235     $self->verbose("Found top ".$self->location());
236     my $infofile=$self->location()."/".$self->{admindir}."/ConfigArea.dat";
237     $self->_LoadEnvFile();
238 williamc 1.9 }
239 williamc 1.14 return $rv;
240 williamc 1.1 }
241    
242     sub location {
243     my $self=shift;
244    
245 williamc 1.5 if ( @_ ) {
246 williamc 1.6 $self->{location}=shift;
247 williamc 1.5 }
248     elsif ( ! defined $self->{location} ) {
249     # try and find the release location
250 williamc 1.9 $self->{location}=$self->searchlocation();
251 williamc 1.5 }
252     return $self->{location};
253     }
254    
255     sub searchlocation {
256     my $self=shift;
257    
258     #start search in current directory if not specified
259     my $thispath;
260 williamc 1.14 if ( @_ ) {
261     $thispath=shift
262     }
263     else {
264     $thispath=cwd();
265     }
266 williamc 1.5
267     my $rv=0;
268    
269 williamc 1.14 # chop off any files - we only want dirs
270     if ( -f $thispath ) {
271     $thispath=~s/(.*)\/.*/$1/;
272     }
273 williamc 1.6 Sloop:{
274     do {
275 williamc 1.14 $self->verbose("Searching $thispath");
276 williamc 1.8 if ( -e "$thispath/".$self->{admindir} ) {
277 williamc 1.14 $self->verbose("Found\n");
278 williamc 1.5 $rv=1;
279 williamc 1.6 last Sloop;
280 williamc 1.5 }
281 williamc 1.6 } while ( ($thispath=~s/(.*)\/.*/$1/)=~/./ ) };
282 williamc 1.5
283     return $rv?$thispath:undef;
284 williamc 1.1 }
285    
286 williamc 1.14 sub archname {
287 williamc 1.1 my $self=shift;
288 williamc 1.14 if ( @_ ) {
289     $self->{archname}=shift;
290     }
291     return $self->{archname};
292     }
293 williamc 1.1
294 williamc 1.14 sub archdir {
295     my $self=shift;
296     if ( @_ ) {
297     $self->{archdir}=shift;
298     }
299     if ( ! defined $self->{archdir} ) {
300     if ( defined $self->{archname} ) {
301     $self->{archdir}=$self->location()."/".$self->{admindir}."/".
302     $self->{archname};
303     }
304     else {
305     $self->error("ConfigArea : cannot create arch directory - ".
306     "architecture name not set")
307     }
308     }
309     return $self->{archdir};
310 williamc 1.1 }
311    
312 williamc 1.14 sub satellite {
313 williamc 1.1 my $self=shift;
314 williamc 1.14
315     # -- create the sat object
316     my $sat=Configuration::ConfigArea->new();
317     $sat->name($self->name());
318     $sat->version($self->version());
319     $sat->requirementsdoc($self->{reqdoc});
320     $sat->configurationdir($self->configurationdir());
321     $sat->setup(@_);
322    
323     # -- copy across the cache and ObjectStore
324 williamc 1.16 # -- make sure we dont try building new caches in release areas
325 williamc 1.18 my $rcache=$self->cache();
326 williamc 1.16 if ( defined $rcache ) {
327     copy($rcache->location(),$sat->cache()->location());
328     }
329    
330     # -- make sure we dont try building new objectstores in release areas
331 williamc 1.18 my $rostore=$self->objectstore();
332 williamc 1.16 if ( defined $rostore ) {
333     copy($rostore->location(),$sat->objectstore()->location());
334     }
335 williamc 1.14
336     # and make sure in reinitialises
337     undef ($sat->{cache});
338    
339     # -- link it to this area
340     $sat->linkarea($self);
341 williamc 1.1
342 williamc 1.14 # -- save it
343     $sat->save();
344    
345     return $sat;
346 williamc 1.1 }
347    
348 williamc 1.14 sub copy {
349 williamc 1.1 my $self=shift;
350 williamc 1.14 my $destination=shift;
351 williamc 1.1
352 williamc 1.14 # copy across the admin dir
353     my $temp=$self->location()."/".$self->{admindir};
354     AddDir::copydir($temp,"$destination/".$self->{admindir});
355 williamc 1.13 }
356    
357 williamc 1.14 sub align {
358 williamc 1.13 my $self=shift;
359 williamc 1.14 use File::Copy;
360    
361     $self->_LoadEnvFile();
362     my $Envfile=$self->location()."/".$self->{admindir}."/Environment";
363     my $tmpEnvfile=$Envfile.".bak";
364     my $rel=$self->{ENV}{RELEASETOP};
365     my $local=$self->location();
366    
367     rename( $Envfile, $tmpEnvfile );
368     use FileHandle;
369     my $fh=FileHandle->new();
370     my $fout=FileHandle->new();
371     open ( $fh, "<".$tmpEnvfile ) or
372     $self->error("Cannot find Environment file. Area Corrupted? ("
373     .$self->location().")\n $!");
374     open ( $fout, ">".$Envfile ) or
375     $self->error("Cannot find Environment file. Area Corrupted? ("
376     .$self->location().")\n $!");
377     while ( <$fh> ) {
378     $_=~s/\Q$rel\L/$local/g;
379     print $fout $_;
380     }
381     undef $fh;
382     undef $fout;
383 williamc 1.1 }
384    
385 williamc 1.14 sub copysetup {
386 williamc 1.9 my $self=shift;
387 williamc 1.14 my $dest=shift;
388    
389     my $rv=1;
390     # copy across the admin dir
391     my $temp=$self->location()."/".$self->{admindir}."/".$self->arch();
392     my $temp2=$dest."/".$self->{admindir}."/".$self->arch();
393     if ( $temp ne $temp2 ) {
394     if ( -d $temp ) {
395     AddDir::copydir($temp,$temp2);
396     $rv=0;
397     }
398 williamc 1.9 }
399 williamc 1.14 return $rv;
400 williamc 1.9 }
401    
402 williamc 1.14 sub copyenv {
403 williamc 1.9 my $self=shift;
404 williamc 1.14 my $hashref=shift;
405    
406     foreach $elem ( keys %{$self->{ENV}} ) {
407     $$hashref{$elem}=$self->{ENV}{$elem};
408 williamc 1.9 }
409     }
410    
411 williamc 1.14 sub arch {
412 williamc 1.9 my $self=shift;
413 williamc 1.14 return $ENV{SCRAM_ARCH};
414 williamc 1.9 }
415    
416 williamc 1.14 sub linkto {
417 williamc 1.9 my $self=shift;
418 williamc 1.14 my $location=shift;
419     if ( -d $location ) {
420     my $area=Configuration::ConfigArea->new();
421     $area->bootstrapfromlocation($location);
422     $self->linkarea($area);
423     }
424     else {
425     $self->error("ConfigArea : Unable to link to non existing directory ".
426     $location);
427 williamc 1.9 }
428     }
429    
430 williamc 1.14 sub unlinkarea {
431 williamc 1.9 my $self=shift;
432 williamc 1.14 undef $self->{linkarea};
433     $self->{linkarea}=undef;
434     $self->save();
435     }
436 williamc 1.9
437 williamc 1.14 sub linkarea {
438 williamc 1.1 my $self=shift;
439 williamc 1.14 my $area=shift;
440     if ( defined $area ) {
441     $self->{linkarea}=$area;
442     }
443     return (defined $self->{linkarea} && $self->{linkarea} ne "")?
444     $self->{linkarea}:undef;
445 williamc 1.1 }
446    
447 williamc 1.14 sub save {
448 williamc 1.1 my $self=shift;
449 williamc 1.14 $self->_SaveEnvFile();
450 williamc 1.1 }
451    
452 williamc 1.14 # ---- support routines
453 williamc 1.1
454 williamc 1.14 sub _SaveEnvFile {
455 williamc 1.9 my $self=shift;
456 williamc 1.14 use FileHandle;
457     my $fh=FileHandle->new();
458     open ( $fh, ">".$self->location()."/".$self->{admindir}."/".
459     "Environment" ) or
460     $self->error("Cannot Open Environment file to Save ("
461     .$self->location().")\n $!");
462    
463     print $fh "SCRAM_PROJECTNAME=".$self->name()."\n";
464     print $fh "SCRAM_PROJECTVERSION=".$self->version()."\n";
465     print $fh "projconfigdir=".$self->configurationdir()."\n";
466     print $fh "SCRAM_ProjReqsDoc=".$self->{reqdoc}."\n";
467     if ( defined $self->linkarea() ) {
468     my $area=$self->linkarea()->location();
469     if ( $area ne "" ) {
470     print $fh "RELEASETOP=".$area."\n";
471     }
472 williamc 1.9 }
473 williamc 1.14 undef $fh;
474 williamc 1.9 }
475    
476 williamc 1.1
477 williamc 1.14 sub _LoadEnvFile {
478 williamc 1.9 my $self=shift;
479    
480 williamc 1.14 use FileHandle;
481     my $fh=FileHandle->new();
482     open ( $fh, "<".$self->location()."/".$self->{admindir}."/".
483     "Environment" ) or
484     $self->error("Cannot find Environment file. Area Corrupted? ("
485     .$self->location().")\n $!");
486     while ( <$fh> ) {
487     chomp;
488     next if /^#/;
489     next if /^\s*$/ ;
490     ($name, $value)=split /=/;
491     eval "\$self->{ENV}{${name}}=\"$value\"";
492     }
493     undef $fh;
494    
495     # -- set internal variables appropriately
496     if ( defined $self->{ENV}{"SCRAM_PROJECTNAME"} ) {
497     $self->name($self->{ENV}{"SCRAM_PROJECTNAME"});
498     }
499     if ( defined $self->{ENV}{"SCRAM_PROJECTVERSION"} ) {
500     $self->version($self->{ENV}{"SCRAM_PROJECTVERSION"});
501     }
502     if ( defined $self->{ENV}{"projconfigdir"} ) {
503     $self->configurationdir($self->{ENV}{projconfigdir});
504     }
505     if ( defined $self->{ENV}{"SCRAM_ProjReqsDoc"} ) {
506     $self->requirementsdoc($self->{ENV}{SCRAM_ProjReqsDoc});
507     }
508     if ( ( defined $self->{ENV}{"RELEASETOP"} ) &&
509     ($self->{ENV}{"RELEASETOP"} ne $self->location())) {
510     $self->linkto($self->{ENV}{"RELEASETOP"});
511 williamc 1.9 }
512     else {
513 williamc 1.14 $self->{ENV}{"RELEASETOP"}=$self->location();
514 williamc 1.9 }
515     }