ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Configuration/ConfigArea.pm
Revision: 1.35
Committed: Thu Jan 3 09:35:45 2008 UTC (17 years, 4 months ago) by muzaffar
Content type: text/plain
Branch: MAIN
CVS Tags: V1_1_7, V1_1_6, V1_1_5, V1_1_4, V1_1_3, V1_1_2, V1_1_0_reltag8, V1_1_0_reltag7, V1_1_0_reltag6, V1_1_1, V1_1_0_reltag5, V1_1_0_reltag4, V1_1_0_reltag3, V1_1_0_reltag2, V1_1_0_reltag1
Branch point for: forBinLess_SCRAM
Changes since 1.34: +1 -3 lines
Log Message:
now the install area will be the version name alone and no project name will be prefixed

File Contents

# User Rev Content
1 sashby 1.30 =head1 NAME
2    
3     Configuration::ConfigArea - Creates and manages a configuration area (i.e. a project area).
4    
5     =head1 SYNOPSIS
6    
7     my $obj = Configuration::ConfigArea->new();
8    
9     =head1 DESCRIPTION
10    
11     Create and manage SCRAM project configuration areas.
12    
13     =head1 METHODS
14    
15     =over
16    
17     =cut
18    
19     =item C<new()>
20    
21     Create a new Configuration::ConfigArea object.
22    
23     =item C<name()>
24    
25     Get/set project name.
26    
27     =item C<setup($dir[,$areaname])>
28    
29     Set up a fresh area in $dir.
30    
31     =item C<satellite($dir[,$areaname])>
32    
33     Set up a satellite area in $dir.
34    
35     =item C<version()>
36    
37     Get/set project version.
38    
39     =item C<location([$dir])>
40    
41     Set/return the location of the work area.
42    
43     =item C<bootstrapfromlocation([$location])>
44    
45     Bootstrap the object based on location.
46     No location specified - current directory used
47     Return 0 if succesful, 1 otherwise.
48    
49     =item C<requirementsdoc()>
50    
51     Get or set the requirements document.
52    
53     =item C<searchlocation([$startdir])>
54    
55     Returns the location directory. search starts
56     from current directory if not specified.
57    
58     =item C<scramversion()>
59    
60     Return the scram version associated with the area.
61    
62     =item C<configurationdir()>
63    
64     Return the location of the project configuration directory.
65    
66     =item C<copy($location)>
67    
68     Copy a configuration from $location.
69    
70     =item C<copysetup($location)>
71    
72     Copy the architecture-specific tool setup.
73     Returns 0 if successful, 1 otherwise.
74    
75     =item C<copyenv($ref)>
76    
77     Copy the area environment into the hashref $ref.
78    
79     =item C<toolbox()>
80    
81     Return the area toolbox object.
82    
83     =item C<save()>
84    
85     Save changes permanently.
86    
87     =item C<linkto($location)>
88    
89     Link the current area to that at location.
90    
91     =item C<unlinkarea()>
92    
93     Destroy link ($autosave).
94    
95     =item C<linkarea([Configuration::ConfigArea])>
96    
97     Link the current area to the specified area object.
98    
99     =item C<archname()>
100    
101     Get/set a string to indicate architecture.
102    
103     =item C<archdir()>
104    
105     Return the location of the administration
106     architecture-dependent directory.
107    
108     =item C<objectstore()>
109    
110     Return the B<objectStore> object of the area temporary.
111    
112     =item C<align()>
113    
114     Adjust hard paths to suit local location.
115    
116    
117     =back
118    
119     =head1 AUTHOR
120    
121     Originally written by Christopher Williams.
122    
123     =head1 MAINTAINER
124    
125     Shaun ASHBY
126    
127     =cut
128 williamc 1.1
129     package Configuration::ConfigArea;
130     require 5.004;
131 williamc 1.14 use URL::URLcache;
132 williamc 1.1 use Utilities::AddDir;
133 williamc 1.14 use Utilities::Verbose;
134 williamc 1.1 use ObjectUtilities::ObjectStore;
135 williamc 1.6 use Cwd;
136 williamc 1.14 @ISA=qw(Utilities::Verbose);
137 williamc 1.1
138 williamc 1.14 sub new {
139 muzaffar 1.33 my $class=shift;
140     my $self={};
141     bless $self, $class;
142    
143     # data init
144     $self->{admindir}=".SCRAM";
145     $self->{cachedir}="cache";
146     $self->{dbdir}="ObjectDB";
147     $self->{tbupdate}=0;
148     undef $self->{linkarea};
149    
150     return $self;
151 williamc 1.1 }
152    
153 williamc 1.14 sub cache {
154 muzaffar 1.33 my $self=shift;
155    
156     if ( @_ ) {
157     $self->{cache}=shift;
158     }
159     if ( ! defined $self->{cache} ) {
160     my $loc=$self->location()."/".$self->{admindir}."/".$self->{cachedir};
161     if ( -e $loc ) {
162 sashby 1.32 $self->{cache}=URL::URLcache->new($loc);
163 muzaffar 1.33 }
164     else {
165 williamc 1.19 $self->{cache}=undef;
166 muzaffar 1.33 }
167 williamc 1.19 }
168 muzaffar 1.33 return $self->{cache};
169 williamc 1.14 }
170 williamc 1.9
171 sashby 1.23 # Tool and project cache info:
172     sub cacheinfo
173     {
174     my $self=shift;
175     print "\n","<ConfigArea> cacheinfo: ToolCache = ",$self->{toolcachefile},
176     ", ProjectCache = ",$self->{projectcachefile},"\n";
177     }
178    
179     sub toolcachename
180     {
181     my $self=shift;
182     return ($self->location()."/".$self->{admindir}."/".$ENV{SCRAM_ARCH}."/ToolCache.db");
183     }
184    
185     sub projectcachename
186     {
187     my $self=shift;
188     return ($self->location()."/".$self->{admindir}."/".$ENV{SCRAM_ARCH}."/ProjectCache.db");
189     }
190    
191     sub _tbupdate
192     {
193     # Update toolbox relative to new RequirementsDoc:
194     my $self=shift;
195     @_?$self->{tbupdate}=shift
196     :$self->{tbupdate};
197     }
198    
199 williamc 1.18 sub _newcache {
200 williamc 1.19 my $self=shift;
201     my $loc=$self->location()."/".$self->{admindir}."/".$self->{cachedir};
202     $self->{cache}=URL::URLcache->new($loc);
203     return $self->{cache};
204 williamc 1.18 }
205    
206     sub _newobjectstore {
207 williamc 1.19 my $self=shift;
208     my $loc=$self->location()."/".$self->{admindir}."/".$self->{dbdir};
209     $self->{dbstore}=ObjectUtilities::ObjectStore->new($loc);
210     return $self->{dbstore};
211     }
212 williamc 1.18
213 williamc 1.14 sub objectstore {
214 williamc 1.19 my $self=shift;
215 williamc 1.16
216 williamc 1.19 if ( @_ ) {
217     $self->{dbstore}=shift;
218     }
219     if ( ! defined $self->{dbstore} ) {
220     my $loc=$self->location()."/".$self->{admindir}."/".$self->{dbdir};
221     if ( -e $loc ) {
222     $self->{dbstore}=ObjectUtilities::ObjectStore->new($loc);
223     }
224     else {
225     $self->{dbstore}=undef;
226     }
227     }
228     return $self->{dbstore}
229 williamc 1.9 }
230    
231 muzaffar 1.34 sub symlinks {
232     my $self=shift;
233     if (@_) {$self->{symlinks}=shift;}
234     return $self->{symlinks};
235     }
236    
237 williamc 1.14 sub name {
238 williamc 1.9 my $self=shift;
239 williamc 1.14 @_?$self->{name}=shift
240     :$self->{name};
241 williamc 1.9 }
242 williamc 1.7
243 williamc 1.14 sub version {
244 williamc 1.6 my $self=shift;
245 williamc 1.14 @_?$self->{version}=shift
246     :$self->{version};
247 williamc 1.9 }
248 williamc 1.8
249 williamc 1.1 sub setup {
250     my $self=shift;
251 williamc 1.14 my $location=shift;
252     my $areaname;
253 muzaffar 1.34 my $symlinks=0;
254 williamc 1.1
255 williamc 1.14 # -- check we have a project name and version
256     my $name=$self->name();
257     my $vers=$self->version();
258 sashby 1.23
259 williamc 1.14 if ( ( ! defined $name ) && ( ! defined $version )) {
260     $self->error("Set ConfigArea name and version before setup");
261     }
262    
263     # -- check arguments and set location
264 williamc 1.7 if ( ! defined $location ) {
265 williamc 1.14 $self->error("ConfigArea: Cannot setup new area without a location");
266 williamc 1.7 }
267 williamc 1.14 if ( @_ ) {
268     $areaname=shift;
269 williamc 1.6 }
270 muzaffar 1.34 if ( @_ ) {
271     $symlinks=shift || 0;
272     }
273 williamc 1.14 if ( (! defined $areaname) || ( $areaname eq "" ) ) {
274 muzaffar 1.35 $areaname=$vers;
275 williamc 1.1 }
276 williamc 1.14 my $arealoc=$location."/".$areaname;
277     my $workloc=$arealoc."/".$self->{admindir};
278     $self->verbose("Building at $arealoc");
279     $self->location($arealoc);
280 muzaffar 1.34 $self->symlinks($symlinks);
281 williamc 1.1
282 williamc 1.14 # -- create top level structure and work area
283     AddDir::adddir($workloc);
284 williamc 1.1
285 williamc 1.14 # -- add a cache
286 williamc 1.18 $self->_newcache();
287    
288 williamc 1.19 # -- add an Objectstore
289     $self->_newobjectstore();
290 williamc 1.5
291 williamc 1.14 # -- Save Environment File
292     $self->_SaveEnvFile();
293 williamc 1.3
294 williamc 1.9 }
295    
296 williamc 1.14 sub configurationdir {
297 williamc 1.9 my $self=shift;
298 williamc 1.14 if ( @_ ) {
299     $self->{configurationdir}=shift;
300     }
301     return (defined $self->{configurationdir})?$self->{configurationdir}:undef;
302 williamc 1.9 }
303    
304 sashby 1.23 sub sourcedir {
305     my $self=shift;
306     if ( @_ ) {
307     $self->{sourcedir}=shift;
308     }
309     return (defined $self->{sourcedir})?$self->{sourcedir}:undef;
310     }
311    
312 williamc 1.14 sub toolbox {
313 williamc 1.3 my $self=shift;
314 williamc 1.14 if ( ! defined $self->{toolbox} ) {
315 williamc 1.19 $self->{toolbox}=BuildSystem::ToolBox->new($self, $ENV{SCRAM_ARCH});
316 williamc 1.14 }
317     return $self->{toolbox};
318 williamc 1.4 }
319    
320 sashby 1.23 sub toolboxversion {
321     my $self=shift;
322     if ( @_ ) {
323     $self->{toolboxversion}=shift;
324     }
325     return (defined $self->{toolboxversion})?$self->{toolboxversion}:undef;
326     }
327    
328 williamc 1.14 sub requirementsdoc {
329 williamc 1.5 my $self=shift;
330 williamc 1.14 if ( @_ ) {
331     $self->{reqdoc}=shift;
332     }
333     if ( defined $self->{reqdoc} ) {
334     return $self->location()."/".$self->{reqdoc};
335 williamc 1.12 }
336     else {
337 williamc 1.14 return undef;
338 williamc 1.12 }
339 williamc 1.5 }
340    
341 williamc 1.14 sub scramversion {
342 williamc 1.4 my $self=shift;
343 williamc 1.14 if ( ! defined $self->{scramversion} ) {
344     my $filename=$self->location()."/".$self->configurationdir()."/".
345     "scram_version";
346     if ( -f $filename ) {
347     use FileHandle;
348     $fh=FileHandle->new();
349     open ($fh, "<".$filename);
350     my $version=<$fh>;
351     chomp $version;
352     $self->{scramversion}=$version;
353     undef $fh;
354     }
355     }
356     return $self->{scramversion};
357 williamc 1.1 }
358    
359 sashby 1.21 sub sitename
360     {
361     ###############################################################
362     # sitename() #
363     ###############################################################
364     # modified : Mon Dec 3 15:45:35 2001 / SFA #
365     # params : #
366     # : #
367     # : #
368     # : #
369     # function : Read the site name from config/site/sitename and #
370     # : export it. #
371     # : #
372     # : #
373     ###############################################################
374     my $self = shift;
375     my $sitefile = $self->location()."/".$self->configurationdir()."/site/sitename";
376    
377     $self->{sitename} = 'CERN'; # Use CERN as the default site name
378    
379     use FileHandle;
380     my $sitefh = FileHandle->new();
381 sashby 1.22
382     # Be verbose and print file we're going to read:
383     $self->verbose(">> Going to try to get sitename from: ".$sitefile." ");
384 sashby 1.21
385     # See if we can read from the file. If not, just
386     # use default site name:
387     open($sitefh,"<".$sitefile) ||
388     do
389     {
390 sashby 1.22 $self->verbose(">> Unable to read a site name definition file. Using \'CERN\' as the site name.");
391 sashby 1.21 return $self->{sitename};
392     };
393    
394     $sitename = <$sitefh>;
395     chomp($sitename);
396     $self->{sitename} = $sitename;
397    
398     # Close the file (be tidy!);
399     close($sitefile);
400     # Return:
401     return $self->{sitename};
402     }
403    
404 sashby 1.29 sub admindir()
405     {
406     my $self=shift;
407    
408     @_ ? $self->{admindir} = shift
409     : $self->{admindir};
410     }
411 sashby 1.21
412 williamc 1.14 sub bootstrapfromlocation {
413 williamc 1.1 my $self=shift;
414    
415 williamc 1.14 my $rv=0;
416    
417     my $location;
418     if ( ! defined ($location=$self->searchlocation(@_)) ) {
419     $rv=1;
420     $self->verbose("Unable to locate the top of local configuration area");
421 williamc 1.9 }
422     else {
423 williamc 1.14 $self->location($location);
424     $self->verbose("Found top ".$self->location());
425     $self->_LoadEnvFile();
426 williamc 1.9 }
427 williamc 1.14 return $rv;
428 williamc 1.1 }
429    
430     sub location {
431     my $self=shift;
432    
433 williamc 1.5 if ( @_ ) {
434 williamc 1.6 $self->{location}=shift;
435 williamc 1.5 }
436     elsif ( ! defined $self->{location} ) {
437     # try and find the release location
438 williamc 1.9 $self->{location}=$self->searchlocation();
439 williamc 1.5 }
440     return $self->{location};
441     }
442    
443     sub searchlocation {
444     my $self=shift;
445 sashby 1.20
446 williamc 1.5 #start search in current directory if not specified
447     my $thispath;
448 williamc 1.14 if ( @_ ) {
449     $thispath=shift
450     }
451     else {
452     $thispath=cwd();
453     }
454 sashby 1.20
455 williamc 1.5 my $rv=0;
456    
457 williamc 1.14 # chop off any files - we only want dirs
458     if ( -f $thispath ) {
459     $thispath=~s/(.*)\/.*/$1/;
460     }
461 williamc 1.6 Sloop:{
462     do {
463 williamc 1.14 $self->verbose("Searching $thispath");
464 williamc 1.8 if ( -e "$thispath/".$self->{admindir} ) {
465 williamc 1.14 $self->verbose("Found\n");
466 williamc 1.5 $rv=1;
467 williamc 1.6 last Sloop;
468 williamc 1.5 }
469 williamc 1.6 } while ( ($thispath=~s/(.*)\/.*/$1/)=~/./ ) };
470 sashby 1.20
471 williamc 1.5 return $rv?$thispath:undef;
472 williamc 1.1 }
473    
474 williamc 1.14 sub archname {
475 williamc 1.1 my $self=shift;
476 williamc 1.14 if ( @_ ) {
477     $self->{archname}=shift;
478     }
479     return $self->{archname};
480     }
481 williamc 1.1
482 williamc 1.14 sub archdir {
483     my $self=shift;
484     if ( @_ ) {
485     $self->{archdir}=shift;
486     }
487     if ( ! defined $self->{archdir} ) {
488     if ( defined $self->{archname} ) {
489     $self->{archdir}=$self->location()."/".$self->{admindir}."/".
490     $self->{archname};
491     }
492     else {
493     $self->error("ConfigArea : cannot create arch directory - ".
494     "architecture name not set")
495     }
496     }
497     return $self->{archdir};
498 williamc 1.1 }
499    
500 williamc 1.14 sub satellite {
501 williamc 1.1 my $self=shift;
502 williamc 1.14
503     # -- create the sat object
504     my $sat=Configuration::ConfigArea->new();
505     $sat->name($self->name());
506     $sat->version($self->version());
507     $sat->requirementsdoc($self->{reqdoc});
508     $sat->configurationdir($self->configurationdir());
509 sashby 1.23 $sat->sourcedir($self->sourcedir());
510     $sat->toolboxversion($self->toolboxversion());
511 williamc 1.14 $sat->setup(@_);
512    
513     # -- copy across the cache and ObjectStore
514 williamc 1.16 # -- make sure we dont try building new caches in release areas
515 williamc 1.18 my $rcache=$self->cache();
516 williamc 1.16 if ( defined $rcache ) {
517     copy($rcache->location(),$sat->cache()->location());
518     }
519    
520     # -- make sure we dont try building new objectstores in release areas
521 williamc 1.18 my $rostore=$self->objectstore();
522 williamc 1.16 if ( defined $rostore ) {
523     copy($rostore->location(),$sat->objectstore()->location());
524     }
525 williamc 1.14
526     # and make sure in reinitialises
527     undef ($sat->{cache});
528    
529     # -- link it to this area
530     $sat->linkarea($self);
531 williamc 1.1
532 williamc 1.14 # -- save it
533     $sat->save();
534    
535     return $sat;
536 williamc 1.1 }
537    
538 williamc 1.14 sub copy {
539 williamc 1.1 my $self=shift;
540 williamc 1.14 my $destination=shift;
541 williamc 1.1
542 williamc 1.14 # copy across the admin dir
543     my $temp=$self->location()."/".$self->{admindir};
544     AddDir::copydir($temp,"$destination/".$self->{admindir});
545 williamc 1.13 }
546    
547 williamc 1.14 sub align {
548 williamc 1.13 my $self=shift;
549 williamc 1.14 use File::Copy;
550    
551     $self->_LoadEnvFile();
552     my $Envfile=$self->location()."/".$self->{admindir}."/Environment";
553     my $tmpEnvfile=$Envfile.".bak";
554     my $rel=$self->{ENV}{RELEASETOP};
555     my $local=$self->location();
556    
557     rename( $Envfile, $tmpEnvfile );
558     use FileHandle;
559     my $fh=FileHandle->new();
560     my $fout=FileHandle->new();
561     open ( $fh, "<".$tmpEnvfile ) or
562     $self->error("Cannot find Environment file. Area Corrupted? ("
563     .$self->location().")\n $!");
564     open ( $fout, ">".$Envfile ) or
565     $self->error("Cannot find Environment file. Area Corrupted? ("
566     .$self->location().")\n $!");
567     while ( <$fh> ) {
568     $_=~s/\Q$rel\L/$local/g;
569     print $fout $_;
570     }
571     undef $fh;
572     undef $fout;
573 williamc 1.1 }
574    
575 williamc 1.14 sub copysetup {
576 williamc 1.9 my $self=shift;
577 sashby 1.24 my $dest=shift;
578     my $rv=1;
579     # copy across the admin dir
580     my $temp=$self->location()."/".$self->{admindir}."/".$self->arch();
581     my $temp2=$dest."/".$self->{admindir}."/".$self->arch();
582     if ( $temp ne $temp2 ) {
583     if ( -d $temp ) {
584     AddDir::copydir($temp,$temp2);
585     $rv=0;
586     }
587     }
588     return $rv;
589     }
590    
591 sashby 1.26 sub copyurlcache {
592     my $self=shift;
593     my $dest=shift;
594     my $rv=1;
595     # copy across the admin dir
596     my $temp=$self->location()."/".$self->{admindir}."/cache";
597     my $temp2=$dest."/".$self->{admindir}."/cache";
598     if ( $temp ne $temp2 ) {
599     if ( -d $temp ) {
600     AddDir::copydir($temp,$temp2);
601     $rv=0;
602     }
603     }
604     return $rv;
605     }
606    
607 sashby 1.24 sub copywithskip {
608     my $self=shift;
609 williamc 1.14 my $dest=shift;
610 muzaffar 1.33 my $filetoskip=shift || [];
611 williamc 1.14 my $rv=1;
612     # copy across the admin dir
613     my $temp=$self->location()."/".$self->{admindir}."/".$self->arch();
614     my $temp2=$dest."/".$self->{admindir}."/".$self->arch();
615     if ( $temp ne $temp2 ) {
616     if ( -d $temp ) {
617 muzaffar 1.33 my $fs=[];
618     foreach my $f (@$filetoskip) {push @$fs,"${temp}/${f}";}
619     AddDir::copydirwithskip($temp,$temp2,$fs);
620 williamc 1.14 $rv=0;
621     }
622 williamc 1.9 }
623 williamc 1.14 return $rv;
624 williamc 1.9 }
625    
626 williamc 1.14 sub copyenv {
627 williamc 1.9 my $self=shift;
628 williamc 1.14 my $hashref=shift;
629    
630     foreach $elem ( keys %{$self->{ENV}} ) {
631     $$hashref{$elem}=$self->{ENV}{$elem};
632 williamc 1.9 }
633     }
634    
635 williamc 1.14 sub arch {
636 williamc 1.9 my $self=shift;
637 williamc 1.14 return $ENV{SCRAM_ARCH};
638 williamc 1.9 }
639    
640 williamc 1.14 sub linkto {
641 williamc 1.9 my $self=shift;
642 williamc 1.14 my $location=shift;
643 sashby 1.23
644 williamc 1.14 if ( -d $location ) {
645     my $area=Configuration::ConfigArea->new();
646     $area->bootstrapfromlocation($location);
647     $self->linkarea($area);
648     }
649     else {
650     $self->error("ConfigArea : Unable to link to non existing directory ".
651     $location);
652 williamc 1.9 }
653     }
654    
655 williamc 1.14 sub unlinkarea {
656 williamc 1.9 my $self=shift;
657 williamc 1.14 undef $self->{linkarea};
658     $self->{linkarea}=undef;
659     $self->save();
660     }
661 williamc 1.9
662 williamc 1.14 sub linkarea {
663 williamc 1.1 my $self=shift;
664 williamc 1.14 my $area=shift;
665     if ( defined $area ) {
666     $self->{linkarea}=$area;
667     }
668     return (defined $self->{linkarea} && $self->{linkarea} ne "")?
669     $self->{linkarea}:undef;
670 williamc 1.1 }
671    
672 williamc 1.14 sub save {
673 williamc 1.1 my $self=shift;
674 williamc 1.14 $self->_SaveEnvFile();
675 williamc 1.1 }
676    
677 sashby 1.27 sub reqdoc()
678     {
679     my $self=shift;
680     my ($path)=@_;
681     return $path."/".$self->{reqdoc};
682     }
683    
684     sub creationtime()
685     {
686     my $self=shift;
687     my ($location)= @_;
688     $location||=$self->location();
689     my $requirementsdoc = $self->reqdoc($location);
690     my ($mode, $time) = (stat($requirementsdoc))[2, 9];
691     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
692    
693     ($sec < 10) ? ($sec = "0".$sec) : $sec;
694     ($min < 10) ? ($min = "0".$min) : $min;
695    
696     $year += 1900;
697     my $months =
698     {
699     0 => "Jan", 1 => "Feb",
700     2 => "Mar", 3 => "Apr",
701     4 => "May", 5 => "Jun",
702     6 => "Jul", 7 => "Aug",
703     8 => "Sept", 9 => "Oct",
704     10 => "Nov", 11 => "Dec" };
705    
706     my $days = { 1 => "Mon", 2 => "Tue", 3 => "Wed", 4 => "Thu", 5 => "Fri", 6 => "Sat", 7 => "Sun"};
707    
708     # Return the timestamp (as string) of the requirementsdoc:
709     return $days->{$wday}."-".$mday."-".$months->{$mon}."-".$year." ".$hour.":".$min.":".$sec;
710     }
711    
712 williamc 1.14 # ---- support routines
713 williamc 1.1
714 sashby 1.25 sub _SaveEnvFile
715     {
716     my $self=shift;
717     my $filemode = 0644;
718    
719     use FileHandle;
720     my $fh=FileHandle->new();
721     open ( $fh, ">".$self->location()."/".$self->{admindir}."/".
722     "Environment" ) or
723     $self->error("Cannot Open Environment file to Save ("
724     .$self->location().")\n $!");
725 williamc 1.14
726 sashby 1.25 print $fh "SCRAM_PROJECTNAME=".$self->name()."\n";
727     print $fh "SCRAM_PROJECTVERSION=".$self->version()."\n";
728     print $fh "SCRAM_CONFIGDIR=".$self->configurationdir()."\n";
729     print $fh "SCRAM_SOURCEDIR=".$self->sourcedir()."\n";
730     print $fh "SCRAM_ProjReqsDoc=".$self->{reqdoc}."\n";
731     print $fh "SCRAM_TOOLBOXVERSION=".$self->{toolboxversion}."\n";
732 muzaffar 1.34 print $fh "SCRAM_SYMLINKS=",$self->{symlinks},"\n";
733 williamc 1.9
734 sashby 1.25 if ( defined $self->linkarea() )
735     {
736     my $area=$self->linkarea()->location();
737     if ( $area ne "" )
738     {
739     print $fh "RELEASETOP=".$area."\n";
740     }
741     }
742    
743     undef $fh;
744    
745 sashby 1.31 # Repeat the exercise to save as XML:
746     my $fh=FileHandle->new();
747     open ( $fh, ">".$self->location()."/".$self->{admindir}."/".
748     "Environment.xml" ) or
749     $self->error("Cannot Open Environment.xml file to Save ("
750     .$self->location().")\n $!");
751     print $fh "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
752     print $fh "<doc type=\"Configuration::ProjectEnvironment\" version=\"1.0\">\n";
753     print $fh " <environment SCRAM_PROJECTNAME=\"".$self->name()."\"/>\n";
754     print $fh " <environment SCRAM_PROJECTVERSION=\"".$self->version()."\"/>\n";
755     print $fh " <environment SCRAM_CONFIGDIR=\"".$self->configurationdir()."\"/>\n";
756     print $fh " <environment SCRAM_SOURCEDIR=\"".$self->sourcedir()."\"/>\n";
757     print $fh " <environment SCRAM_ProjReqsDoc=\"".$self->{reqdoc}."\"/>\n";
758     print $fh " <environment SCRAM_TOOLBOXVERSION=\"".$self->{toolboxversion}."\"/>\n";
759 muzaffar 1.34 print $fh "<environment SCRAM_SYMLINKS=\"",$self->{symlinks},"\"/>\n";
760 sashby 1.31
761     if ( defined $self->linkarea() )
762     {
763     my $area=$self->linkarea()->location();
764     if ( $area ne "" )
765     {
766     print $fh " <environment RELEASETOP=\"".$area."\"/>\n";
767     }
768     }
769    
770     print $fh "</doc>\n";
771     undef $fh;
772    
773 sashby 1.25 # Set the default permissions (-rw-r--r--):
774     chmod $filemode, $self->location()."/".$self->{admindir}."/Environment";
775 sashby 1.31 chmod $filemode, $self->location()."/".$self->{admindir}."/Environment.xml";
776 sashby 1.25 }
777 williamc 1.1
778 sashby 1.23 sub _LoadEnvFile
779     {
780     my $self=shift;
781 williamc 1.9
782 sashby 1.23 use FileHandle;
783     my $fh=FileHandle->new();
784     open ( $fh, "<".$self->location()."/".$self->{admindir}."/".
785     "Environment" ) or
786     $self->error("Cannot find Environment file. Area Corrupted? ("
787     .$self->location().")\n $!");
788     while ( <$fh> )
789     {
790     chomp;
791     next if /^#/;
792     next if /^\s*$/ ;
793     ($name, $value)=split /=/;
794     eval "\$self->{ENV}{${name}}=\"$value\"";
795     }
796     undef $fh;
797 williamc 1.14
798 sashby 1.23 # -- set internal variables appropriately
799     if ( defined $self->{ENV}{"SCRAM_PROJECTNAME"} )
800     {
801     $self->name($self->{ENV}{"SCRAM_PROJECTNAME"});
802     }
803     if ( defined $self->{ENV}{"SCRAM_PROJECTVERSION"} )
804     {
805     $self->version($self->{ENV}{"SCRAM_PROJECTVERSION"});
806     }
807     if ( defined $self->{ENV}{"SCRAM_CONFIGDIR"} )
808     {
809     $self->configurationdir($self->{ENV}{"SCRAM_CONFIGDIR"});
810     }
811     if ( defined $self->{ENV}{"SCRAM_SOURCEDIR"} )
812     {
813     $self->sourcedir($self->{ENV}{"SCRAM_SOURCEDIR"});
814     }
815     if ( defined $self->{ENV}{"SCRAM_ProjReqsDoc"} )
816     {
817     $self->requirementsdoc($self->{ENV}{"SCRAM_ProjReqsDoc"});
818     }
819     if ( defined $self->{ENV}{"SCRAM_TOOLBOXVERSION"} )
820     {
821 sashby 1.28 if ($self->{ENV}{"SCRAM_TOOLBOXVERSION"} eq '')
822     {
823     $self->toolboxversion("STANDALONE");
824     }
825     else
826     {
827     $self->toolboxversion($self->{ENV}{"SCRAM_TOOLBOXVERSION"});
828     }
829 sashby 1.23 }
830    
831     if ( ( defined $self->{ENV}{"RELEASETOP"} ) &&
832     ($self->{ENV}{"RELEASETOP"} ne $self->location()))
833     {
834     $self->linkto($self->{ENV}{"RELEASETOP"});
835     }
836     }