ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.5
Committed: Tue Nov 14 15:18:41 2000 UTC (24 years, 5 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.4: +8 -5 lines
Log Message:
imported

File Contents

# User Rev Content
1 williamc 1.2 #
2     # ToolBox.pm
3     #
4     # Originally Written by Christopher Williams
5     #
6     # Description
7     # -----------
8     # tools and interface to access them
9     #
10     # Interface
11     # ---------
12 williamc 1.3 # new(ConfigArea,archstring) : A new toolbox object
13 williamc 1.2 # tools() : return a list of tools (name,version) pairs
14     # defaultversion(tool) : return the default version of the specified tool
15     # setdefault(tool,version) : set the default version of a given tool (permanant)
16     # versions(tool) : return a list of available versions of a given tool
17     # gettool(name[,version]) : get the tool object with the given name
18     # returns the default version if version not spec.
19     # returns undef if no setup tool is available
20     # toolsetup(name,version[,docurl]) : setup the named tool from the specified doc
21     # if docurl not specified try and use previous
22     # document; returns 0=OK 1=no version
23     # interactive(0|1) : set the setup mode
24     # searcher(SearchObject) : Set the search object for matching tools during setup
25     # copytools(ToolBox) : copy tools from this to the supplied toolbox
26    
27     package BuildSystem::ToolBox;
28     use FileHandle;
29     use BuildSystem::Tool;
30     use Utilities::Verbose;
31     use Utilities::AddDir;
32     use URL::URLhandler;
33    
34     @ISA=qw(Utilities::Verbose);
35     require 5.004;
36    
37     sub new {
38     my $class=shift;
39     my $area=shift;
40     my $self={};
41     bless $self, $class;
42 williamc 1.3 $self->{arch}=shift;
43 williamc 1.4 #$self->verbosity(1);
44 williamc 1.2 $self->init($area);
45     return $self;
46     }
47    
48     sub init {
49     my $self=shift;
50     my $area=shift;
51     my $top=$area->location();
52     my $config=$top."/".$area->configurationdir();
53 williamc 1.4
54     my $cache=$area->cache();
55 williamc 1.5 if ( defined $cache ) {
56     $self->{urlhandler}=URL::URLhandler->new($cache);
57     }
58 williamc 1.2 $self->{toolfiledir}="$top/.SCRAM/ToolFiles";
59 williamc 1.3 $self->{datastore}=$top."/.SCRAM/".$self->{arch};
60 williamc 1.2 #$self->{datastore}=$area->archdir();
61     $self->{tooladmin}=$self->{datastore}."/admin";
62     AddDir::adddir($self->{toolfiledir});
63     if ( -f $self->{tooladmin} ) {
64     $self->_restore($self->{tooladmin});
65     }
66     else {
67     # do we have toolfile dir and no admin? if so maybe its an old
68     # area and we can attempt to get something from the filenames
69     if ( -d $self->{datastore} ) {
70 williamc 1.5 my $dh=DirHandle->new();
71 williamc 1.2 opendir $dh, $self->{datastore};
72     my @files=grep /.*_.*/, readdir $dh;
73     undef $dh;
74     if ( $#files >= 0 ) {
75     $self->verbose("Backwards Compatability Mode");
76     foreach $file ( @files ) {
77     my ($name,$version)=($file=~/(.*)_(.*)\.dat/);
78     push @{$self->{toollist}}, $name;
79     push @{$self->{version}{$name}},$version;
80     $self->{defaults}{$name}=$version;
81     }
82     }
83     }
84     }
85     $self->_readdefaultsfile($config."/External_Dependencies");
86     }
87    
88     sub interactive {
89     my $self=shift;
90    
91     @_?$self->{interactive}=shift
92     :((defined $self->{interactive})?$self->{interactive}:0);
93     }
94    
95     sub tools {
96     my $self=shift;
97     return @{$self->{toollist}};
98     }
99    
100     sub toolsetup {
101     my $self=shift;
102     my $name=shift;
103    
104     AddDir::adddir($self->{datastore});
105     $name=~tr[A-Z][a-z];
106     my $rv=0;
107     # -- get version
108     my $version;
109     if ( @_ ) {
110     $version=shift;
111     }
112     else {
113     $version=$self->defaultversion($name);
114     if ( ! defined $version ) { $rv=1; return $rv; }
115     }
116    
117     my $url;
118    
119     # -- get a tool object
120     my ($tool)=$self->_toolobject($name,$version);
121    
122     # -- get the url
123     if ( @_ ) {
124     $url=shift;
125     $tool->url($url);
126     }
127     else {
128     # no url specified - try to get it from the tool
129     $url=$tool->url();
130     if ( ! defined $url ) {
131     $self->error("Unable to determine document for tool ".
132     $name." ".$version);
133     }
134     }
135     $filename=$self->_download($url, $name, $version);
136    
137     # -- the tool setup
138     print "\n ----------- Setting Up $name $version ---------------\n";
139     require BuildSystem::ToolDoc;
140     my $doc=BuildSystem::ToolDoc->new();
141     $doc->tool($tool);
142     $doc->verbosity($self->verbosity());
143     if ( defined $self->searcher() ) {
144     $doc->toolsearcher($self->searcher());
145     }
146     $doc->interactive($self->interactive());
147     $tool->reset();
148     if ( ! $doc->setup($filename,$name,$version) ) {
149     $tool->store($self->_toolfile($name,$version));
150     # -- keep an internal record of the tool
151     $name=~tr[A-Z][a-z];
152     # -- ad a new version if appropriate
153     if ( ! (grep { $_ eq $version; } @{$self->{version}{$name}}) ) {
154     push @{$self->{version}{$name}},$version;
155     }
156     # - if default version for this tool doesnt exist make it this version
157     if ( ! defined $self->{defaults}{$name} ) {
158     # add to toollist if we dont already have it
159     push @{$self->{toollist}}, $name;
160     $self->{defaults}{$name}=$version;
161     }
162     $self->_save();
163     }
164     else {
165     $self->error("Unable to find $name $version in $url");
166     }
167     undef $doc;
168    
169     return $rv;
170     }
171    
172     sub copytools {
173     my $self=shift;
174     my $newtoolbox=shift;
175    
176     # - copy over data dir and admin files
177     AddDir::copydir($self->datastore(),$newtoolbox->datastore());
178    
179     # - copy ToolFiles
180     AddDir::copydir($self->toolfiledir(),$newtoolbox->toolfiledir());
181    
182     # - reinitialise the toolobject
183     $newtoolbox->_restore($self->{tooladmin});
184     }
185    
186     sub toolfiledir {
187     my $self=shift;
188     return $self->{toolfiledir};
189     }
190    
191     sub datastore {
192     my $self=shift;
193     return $self->{datastore};
194     }
195    
196     sub searcher {
197     my $self=shift;
198    
199     if ( @_ ) {
200     $self->{toolboxsearcher}=shift;
201     }
202     return $self->{toolboxsearcher};
203     }
204    
205     sub versions {
206     my $self=shift;
207     my $toolname=shift;
208    
209     return @{$self->{'version'}{$toolname}};
210     }
211    
212     sub setdefault {
213     my $self=shift;
214     my $product=shift;
215     my $version=shift;
216    
217     $self->{defaults}{$product}=$version;
218     $self->_save();
219     }
220    
221     sub gettool {
222     my $self=shift;
223     my $product=shift;
224     my $version;
225    
226     $product=~tr[A-Z][a-z];
227     if ( @_ ) { $version=shift; }
228     else {
229     # lookup the default version
230     $version=$self->defaultversion($product);
231     return undef, if ( ! defined $version );
232     }
233     my ($tool,$rv)=$self->_toolobject($product,$version);
234 williamc 1.5 if ( $rv != 0 ) {
235     delete $self->{tools}{$product}{$version};
236     }
237 williamc 1.2 return ( $rv==0?$tool:undef ); # only return if already set up
238     }
239    
240     sub defaultversion {
241     my $self=shift;
242     my $product=shift;
243    
244     return $self->{defaults}{$product};
245     }
246    
247     sub _toolfile {
248     my $self=shift;
249     my $name=shift;
250     my $version=shift;
251    
252     $name=~tr[A-Z][a-z];
253     return $self->{datastore}."/".$name."_$version.dat";
254     }
255    
256     #
257     # Get a copy of the file we want in a place where users can easily find it
258     #
259     sub _download {
260     my $self=shift;
261     my $url=shift;
262     my $tool=shift;
263     my $version=shift;
264    
265     my $name=$tool."_".$version;
266     # -- make sure we have a copy of the file
267     my $filename=$self->{toolfiledir}."/".$name;
268     if ( ! -f $filename ) {
269     $self->verbose("Attempting Download of $url");
270     ($url,$filename)=$self->{urlhandler}->get($url);
271     use File::Copy;
272     my $tfname=$self->{toolfiledir}."/$name";
273     copy($filename, $tfname);
274     $self->verbose("Toolfile=".$tfname." copied from $filename");
275     $filename=$tfname;
276     }
277     return $filename;
278     }
279    
280     sub _save {
281     my $self=shift;
282     $self->_store($self->{tooladmin});
283     }
284    
285     sub _restore {
286     my $self=shift;
287     my $file=shift;
288    
289     my $fh=FileHandle->new();
290     $fh->open("<".$file);
291     $self->verbose("Restoring toolbox from $file");
292     my @versions;
293     my $ver;
294     while ( <$fh> ) {
295     chomp;
296     $name=$_;
297     push @{$self->{toollist}}, $name;
298     $ver=<$fh>;
299     chomp $ver;
300     @versions=split / /, $ver;
301     push @{$self->{version}{$name}},@versions;
302     $ver=<$fh>;
303     chomp $ver;
304     $self->{defaults}{$name}=$ver;
305     }
306     undef $fh;
307     }
308    
309     sub _store {
310     my $self=shift;
311     my $file=shift;
312     my $fh=FileHandle->new();
313     $fh->open(">".$file);
314    
315     # save as triplets - name, versions, default version
316     foreach $tool ( @{$self->{toollist}} ) {
317     print $fh $tool."\n";
318     my $vers=join " ",@{$self->{version}{$tool}};
319     print $fh $vers."\n";
320     print $fh $self->{defaults}{$tool}."\n";
321     }
322     undef $fh;
323     }
324    
325     sub _readdefaultsfile {
326     my $self=shift;
327     my $file=shift;
328    
329     # -- Read the default override file
330     my $fh=FileHandle->new();
331     $fh->open("<".$file);
332     while ( <$fh> ) {
333     chomp;
334     next if /^#/;
335     next if /^\s*$/;
336     ($product, $version)=split /:/;
337     $product=~tr[A-Z][a-z];
338     $self->{defaults}{$product}=$version;
339     }
340     undef $fh;
341     }
342    
343     sub _toolobject {
344     my $self=shift;
345     my $product=shift;
346     my $version=shift;
347    
348     my $rv=0;
349    
350     if ( ! exists $self->{tools}{$product}{$version} ) {
351 williamc 1.5 $self->verbose("$product $version being Initialised");
352 williamc 1.2 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
353     my $file=$self->_toolfile($product,$version);
354     if ( -f $file ) { # restore it from disk
355     $self->verbose("Recovering $product $version from $file");
356     $self->{tools}{$product}{$version}->restore($file);
357     }
358     else {
359     $rv=1;
360     $self->{tools}{$product}{$version}->name($product);
361     $self->{tools}{$product}{$version}->version($version);
362     $self->verbose("Tool $product $version needs set up");
363     }
364     # push @{$self->{toollist}}, [$product, $version];
365     }
366     return ($self->{tools}{$product}{$version}, $rv);
367     }