ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Configuration/ConfigArea.pm
Revision: 1.22
Committed: Tue Dec 4 19:24:04 2001 UTC (23 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_7, V0_19_6, V0_19_6p1, V0_19_5, SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2, V0_19_4_pre1, V0_19_3, V0_19_2, V0_19_1
Branch point for: SCRAM_V1_BRANCH, V0_19_4_B
Changes since 1.21: +4 -1 lines
Log Message:
*** empty log message ***

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.19 # linkarea([ConfigArea]) : link 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.19 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 williamc 1.19 my $self=shift;
91     my $loc=$self->location()."/".$self->{admindir}."/".$self->{cachedir};
92     $self->{cache}=URL::URLcache->new($loc);
93     return $self->{cache};
94 williamc 1.18 }
95    
96     sub _newobjectstore {
97 williamc 1.19 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 williamc 1.18
103 williamc 1.14 sub objectstore {
104 williamc 1.19 my $self=shift;
105 williamc 1.16
106 williamc 1.19 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 williamc 1.19 # -- 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 williamc 1.19 $self->{toolbox}=BuildSystem::ToolBox->new($self, $ENV{SCRAM_ARCH});
188 williamc 1.14 }
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 sashby 1.21 sub sitename
224     {
225     ###############################################################
226     # sitename() #
227     ###############################################################
228     # modified : Mon Dec 3 15:45:35 2001 / SFA #
229     # params : #
230     # : #
231     # : #
232     # : #
233     # function : Read the site name from config/site/sitename and #
234     # : export it. #
235     # : #
236     # : #
237     ###############################################################
238     my $self = shift;
239     my $sitefile = $self->location()."/".$self->configurationdir()."/site/sitename";
240    
241     $self->{sitename} = 'CERN'; # Use CERN as the default site name
242    
243     use FileHandle;
244     my $sitefh = FileHandle->new();
245 sashby 1.22
246     # Be verbose and print file we're going to read:
247     $self->verbose(">> Going to try to get sitename from: ".$sitefile." ");
248 sashby 1.21
249     # See if we can read from the file. If not, just
250     # use default site name:
251     open($sitefh,"<".$sitefile) ||
252     do
253     {
254 sashby 1.22 $self->verbose(">> Unable to read a site name definition file. Using \'CERN\' as the site name.");
255 sashby 1.21 return $self->{sitename};
256     };
257    
258     $sitename = <$sitefh>;
259     chomp($sitename);
260     $self->{sitename} = $sitename;
261    
262     # Close the file (be tidy!);
263     close($sitefile);
264     # Return:
265     return $self->{sitename};
266     }
267    
268    
269 williamc 1.14 sub bootstrapfromlocation {
270 williamc 1.1 my $self=shift;
271    
272 williamc 1.14 my $rv=0;
273    
274     my $location;
275     if ( ! defined ($location=$self->searchlocation(@_)) ) {
276     $rv=1;
277     $self->verbose("Unable to locate the top of local configuration area");
278 williamc 1.9 }
279     else {
280 williamc 1.14 $self->location($location);
281     $self->verbose("Found top ".$self->location());
282     my $infofile=$self->location()."/".$self->{admindir}."/ConfigArea.dat";
283     $self->_LoadEnvFile();
284 williamc 1.9 }
285 williamc 1.14 return $rv;
286 williamc 1.1 }
287    
288     sub location {
289     my $self=shift;
290    
291 williamc 1.5 if ( @_ ) {
292 williamc 1.6 $self->{location}=shift;
293 williamc 1.5 }
294     elsif ( ! defined $self->{location} ) {
295     # try and find the release location
296 williamc 1.9 $self->{location}=$self->searchlocation();
297 williamc 1.5 }
298     return $self->{location};
299     }
300    
301     sub searchlocation {
302     my $self=shift;
303 sashby 1.20
304 williamc 1.5 #start search in current directory if not specified
305     my $thispath;
306 williamc 1.14 if ( @_ ) {
307     $thispath=shift
308     }
309     else {
310     $thispath=cwd();
311     }
312 sashby 1.20
313 williamc 1.5 my $rv=0;
314    
315 williamc 1.14 # chop off any files - we only want dirs
316     if ( -f $thispath ) {
317     $thispath=~s/(.*)\/.*/$1/;
318     }
319 williamc 1.6 Sloop:{
320     do {
321 williamc 1.14 $self->verbose("Searching $thispath");
322 williamc 1.8 if ( -e "$thispath/".$self->{admindir} ) {
323 williamc 1.14 $self->verbose("Found\n");
324 williamc 1.5 $rv=1;
325 williamc 1.6 last Sloop;
326 williamc 1.5 }
327 williamc 1.6 } while ( ($thispath=~s/(.*)\/.*/$1/)=~/./ ) };
328 sashby 1.20
329 williamc 1.5 return $rv?$thispath:undef;
330 williamc 1.1 }
331    
332 williamc 1.14 sub archname {
333 williamc 1.1 my $self=shift;
334 williamc 1.14 if ( @_ ) {
335     $self->{archname}=shift;
336     }
337     return $self->{archname};
338     }
339 williamc 1.1
340 williamc 1.14 sub archdir {
341     my $self=shift;
342     if ( @_ ) {
343     $self->{archdir}=shift;
344     }
345     if ( ! defined $self->{archdir} ) {
346     if ( defined $self->{archname} ) {
347     $self->{archdir}=$self->location()."/".$self->{admindir}."/".
348     $self->{archname};
349     }
350     else {
351     $self->error("ConfigArea : cannot create arch directory - ".
352     "architecture name not set")
353     }
354     }
355     return $self->{archdir};
356 williamc 1.1 }
357    
358 williamc 1.14 sub satellite {
359 williamc 1.1 my $self=shift;
360 williamc 1.14
361     # -- create the sat object
362     my $sat=Configuration::ConfigArea->new();
363     $sat->name($self->name());
364     $sat->version($self->version());
365     $sat->requirementsdoc($self->{reqdoc});
366     $sat->configurationdir($self->configurationdir());
367     $sat->setup(@_);
368    
369     # -- copy across the cache and ObjectStore
370 williamc 1.16 # -- make sure we dont try building new caches in release areas
371 williamc 1.18 my $rcache=$self->cache();
372 williamc 1.16 if ( defined $rcache ) {
373     copy($rcache->location(),$sat->cache()->location());
374     }
375    
376     # -- make sure we dont try building new objectstores in release areas
377 williamc 1.18 my $rostore=$self->objectstore();
378 williamc 1.16 if ( defined $rostore ) {
379     copy($rostore->location(),$sat->objectstore()->location());
380     }
381 williamc 1.14
382     # and make sure in reinitialises
383     undef ($sat->{cache});
384    
385     # -- link it to this area
386     $sat->linkarea($self);
387 williamc 1.1
388 williamc 1.14 # -- save it
389     $sat->save();
390    
391     return $sat;
392 williamc 1.1 }
393    
394 williamc 1.14 sub copy {
395 williamc 1.1 my $self=shift;
396 williamc 1.14 my $destination=shift;
397 williamc 1.1
398 williamc 1.14 # copy across the admin dir
399     my $temp=$self->location()."/".$self->{admindir};
400     AddDir::copydir($temp,"$destination/".$self->{admindir});
401 williamc 1.13 }
402    
403 williamc 1.14 sub align {
404 williamc 1.13 my $self=shift;
405 williamc 1.14 use File::Copy;
406    
407     $self->_LoadEnvFile();
408     my $Envfile=$self->location()."/".$self->{admindir}."/Environment";
409     my $tmpEnvfile=$Envfile.".bak";
410     my $rel=$self->{ENV}{RELEASETOP};
411     my $local=$self->location();
412    
413     rename( $Envfile, $tmpEnvfile );
414     use FileHandle;
415     my $fh=FileHandle->new();
416     my $fout=FileHandle->new();
417     open ( $fh, "<".$tmpEnvfile ) or
418     $self->error("Cannot find Environment file. Area Corrupted? ("
419     .$self->location().")\n $!");
420     open ( $fout, ">".$Envfile ) or
421     $self->error("Cannot find Environment file. Area Corrupted? ("
422     .$self->location().")\n $!");
423     while ( <$fh> ) {
424     $_=~s/\Q$rel\L/$local/g;
425     print $fout $_;
426     }
427     undef $fh;
428     undef $fout;
429 williamc 1.1 }
430    
431 williamc 1.14 sub copysetup {
432 williamc 1.9 my $self=shift;
433 williamc 1.14 my $dest=shift;
434    
435     my $rv=1;
436     # copy across the admin dir
437     my $temp=$self->location()."/".$self->{admindir}."/".$self->arch();
438     my $temp2=$dest."/".$self->{admindir}."/".$self->arch();
439     if ( $temp ne $temp2 ) {
440     if ( -d $temp ) {
441     AddDir::copydir($temp,$temp2);
442     $rv=0;
443     }
444 williamc 1.9 }
445 williamc 1.14 return $rv;
446 williamc 1.9 }
447    
448 williamc 1.14 sub copyenv {
449 williamc 1.9 my $self=shift;
450 williamc 1.14 my $hashref=shift;
451    
452     foreach $elem ( keys %{$self->{ENV}} ) {
453     $$hashref{$elem}=$self->{ENV}{$elem};
454 williamc 1.9 }
455     }
456    
457 williamc 1.14 sub arch {
458 williamc 1.9 my $self=shift;
459 williamc 1.14 return $ENV{SCRAM_ARCH};
460 williamc 1.9 }
461    
462 williamc 1.14 sub linkto {
463 williamc 1.9 my $self=shift;
464 williamc 1.14 my $location=shift;
465     if ( -d $location ) {
466     my $area=Configuration::ConfigArea->new();
467     $area->bootstrapfromlocation($location);
468     $self->linkarea($area);
469     }
470     else {
471     $self->error("ConfigArea : Unable to link to non existing directory ".
472     $location);
473 williamc 1.9 }
474     }
475    
476 williamc 1.14 sub unlinkarea {
477 williamc 1.9 my $self=shift;
478 williamc 1.14 undef $self->{linkarea};
479     $self->{linkarea}=undef;
480     $self->save();
481     }
482 williamc 1.9
483 williamc 1.14 sub linkarea {
484 williamc 1.1 my $self=shift;
485 williamc 1.14 my $area=shift;
486     if ( defined $area ) {
487     $self->{linkarea}=$area;
488     }
489     return (defined $self->{linkarea} && $self->{linkarea} ne "")?
490     $self->{linkarea}:undef;
491 williamc 1.1 }
492    
493 williamc 1.14 sub save {
494 williamc 1.1 my $self=shift;
495 williamc 1.14 $self->_SaveEnvFile();
496 williamc 1.1 }
497    
498 williamc 1.14 # ---- support routines
499 williamc 1.1
500 williamc 1.14 sub _SaveEnvFile {
501 williamc 1.9 my $self=shift;
502 williamc 1.14 use FileHandle;
503     my $fh=FileHandle->new();
504     open ( $fh, ">".$self->location()."/".$self->{admindir}."/".
505     "Environment" ) or
506     $self->error("Cannot Open Environment file to Save ("
507     .$self->location().")\n $!");
508    
509     print $fh "SCRAM_PROJECTNAME=".$self->name()."\n";
510     print $fh "SCRAM_PROJECTVERSION=".$self->version()."\n";
511     print $fh "projconfigdir=".$self->configurationdir()."\n";
512     print $fh "SCRAM_ProjReqsDoc=".$self->{reqdoc}."\n";
513     if ( defined $self->linkarea() ) {
514     my $area=$self->linkarea()->location();
515     if ( $area ne "" ) {
516     print $fh "RELEASETOP=".$area."\n";
517     }
518 williamc 1.9 }
519 williamc 1.14 undef $fh;
520 williamc 1.9 }
521    
522 williamc 1.1
523 williamc 1.14 sub _LoadEnvFile {
524 williamc 1.9 my $self=shift;
525    
526 williamc 1.14 use FileHandle;
527     my $fh=FileHandle->new();
528     open ( $fh, "<".$self->location()."/".$self->{admindir}."/".
529     "Environment" ) or
530     $self->error("Cannot find Environment file. Area Corrupted? ("
531     .$self->location().")\n $!");
532     while ( <$fh> ) {
533     chomp;
534     next if /^#/;
535     next if /^\s*$/ ;
536     ($name, $value)=split /=/;
537     eval "\$self->{ENV}{${name}}=\"$value\"";
538     }
539     undef $fh;
540    
541     # -- set internal variables appropriately
542     if ( defined $self->{ENV}{"SCRAM_PROJECTNAME"} ) {
543     $self->name($self->{ENV}{"SCRAM_PROJECTNAME"});
544     }
545     if ( defined $self->{ENV}{"SCRAM_PROJECTVERSION"} ) {
546     $self->version($self->{ENV}{"SCRAM_PROJECTVERSION"});
547     }
548     if ( defined $self->{ENV}{"projconfigdir"} ) {
549     $self->configurationdir($self->{ENV}{projconfigdir});
550     }
551     if ( defined $self->{ENV}{"SCRAM_ProjReqsDoc"} ) {
552     $self->requirementsdoc($self->{ENV}{SCRAM_ProjReqsDoc});
553     }
554     if ( ( defined $self->{ENV}{"RELEASETOP"} ) &&
555     ($self->{ENV}{"RELEASETOP"} ne $self->location())) {
556     $self->linkto($self->{ENV}{"RELEASETOP"});
557 williamc 1.9 }
558     else {
559 williamc 1.14 $self->{ENV}{"RELEASETOP"}=$self->location();
560 williamc 1.9 }
561     }