ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Configuration/ConfigArea.pm
Revision: 1.16
Committed: Thu Sep 21 13:52:07 2000 UTC (24 years, 7 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.15: +33 -7 lines
Log Message:
Merge differences from V0_15_0

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