ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Scram/ScramFunctions.pm
Revision: 1.7
Committed: Wed Sep 13 15:46:18 2000 UTC (24 years, 8 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.6: +10 -0 lines
Log Message:
Add webget function

File Contents

# User Rev Content
1 williamc 1.2 #
2     # ScramFunctions.pm
3     #
4     # Written by Christopher Williams
5     #
6     # Description
7     #
8     # Interface
9     # ---------
10     # new() : A new ScramCommands object
11     # project(urlstring,dir[,areaname]): Create a project from the given url file
12     # return the area
13     # satellite(name,version,installdirectory[,areaname]): create a satellite
14     # project from the specified name version
15     # addareatoDB(ConfigArea[,name[,version]]) : add area to the db
16     # globalcache([cachedirectory])) : return the global cache object/set at dir.
17     # scramprojectdb() : return the scram project DB object
18     # areatoolbox(ConfigArea) : return the toolbox of the specified area
19     # setuptoolsinarea($area[,$toolname[,$toolversion[,toolfile]) : setup
20     # arch() : get/set the architecture string
21 williamc 1.6 # scramobjectinterface(Class) : print out the interface of a scram class
22 williamc 1.7 # webget(area,url) : get the url into the cache of the specified area
23 williamc 1.2
24     package Scram::ScramFunctions;
25     use URL::URLcache;
26     use Utilities::Verbose;
27     require 5.004;
28    
29     @ISA=qw(Utilities::Verbose);
30    
31     sub new {
32     my $class=shift;
33     $self={};
34     bless $self, $class;
35     # -- default settings
36 williamc 1.5 $self->{cachedir}=$ENV{HOME}."/.scramrc/globalcache";
37 williamc 1.2 $self->{scramprojectsdbdir}=$ENV{SCRAM_LOOKUPDB};
38     return $self;
39     }
40    
41     sub project {
42     my $self=shift;
43     my $url=shift;
44     my $installarea=shift;
45    
46     my $areaname="";
47     if ( @_ ) {
48     $areaname=shift;
49     }
50     require Configuration::BootStrapProject;
51     my $bs=Configuration::BootStrapProject->
52     new($self->globalcache(),$installarea);
53     $self->verbose("BootStrapping $url");
54     my $area=$bs->boot($url,$areaname);
55     if ( ! defined $area ) {
56     $self->error("Unable to create project area");
57     }
58     $area->archname($self->arch());
59    
60     # -- download all tool description files
61     my $req=$self->arearequirements($area);
62     if ( defined $req ) {
63     $req->download($self->areatoolbox($area));
64     }
65    
66     return $area;
67     }
68    
69     sub setuptoolsinarea {
70     my $self=shift;
71     my $area=shift;
72    
73     # -- initialise
74     $self->_allprojectinitsearcher();
75    
76     # -- create a new toolbox object
77     my $toolbox=$self->areatoolbox($area);
78     $toolbox->searcher($self->_projsearcher());
79    
80     if ( @_ ) {
81     # -- specific tool specified
82     if ( my $rv=$toolbox->toolsetup(@_) ) {
83     if ( $rv eq 1 ) {
84     print "Unknown tool $toolname @ARGV\n";
85     exit 1;
86     }
87     }
88     }
89     else {
90     # -- setup all tools specified in the requirements doc
91     my $reqs=$self->arearequirements($area);
92     $self->verbose("Setup ToolBox from Requirements doc ($reqs)");
93     $reqs->setup($toolbox);
94     }
95     }
96    
97     sub satellite {
98     my $self=shift;
99     my $name=shift;
100     my $version=shift;
101     my $installarea=shift;
102    
103 williamc 1.4 my $areaname=undef;
104 williamc 1.2 if ( @_ ) {
105     $areaname=shift;
106     }
107    
108     # -- look up scram database for location
109     my $relarea=$self->_lookupareaindb($name,$version);
110     if ( ! defined $relarea ) {
111     $self->error("Unable to Find Project $name $version");
112 williamc 1.4 }
113    
114     # -- fix for old broken areas
115     if ( (! defined $relarea->version()) || ($relarea->version() eq "") ) {
116     $relarea->version($version);
117 williamc 1.2 }
118    
119     # -- create satellite
120     my $area=$relarea->satellite($installarea,$areaname);
121     $area->archname($self->arch());
122    
123     # -- copy setup info - deprecated by toolbox copy method
124     #$relarea->copysetup($area->location());
125    
126     # -- copy toolbox
127     my $rtb=$self->areatoolbox($relarea);
128     my $tb=$self->areatoolbox($area);
129     $rtb->copytools($tb);
130    
131     # -- copy configuration directory
132     if ( ! -d $area->location()."/".$area->configurationdir() ) {
133     use Utilities::AddDir;
134     AddDir::copydir($relarea->location()."/".$relarea->configurationdir(),
135     $area->location()."/".$area->configurationdir() );
136     }
137    
138     # -- copy RequirementsDoc
139     if ( ! -f $area->requirementsdoc() ) {
140 williamc 1.3 use File::Copy;
141 williamc 1.2 copy( $relarea->requirementsdoc() , $area->requirementsdoc());
142     }
143    
144     return $area;
145 williamc 1.7 }
146    
147     sub webget {
148     my $self=shift;
149     my $area=shift;
150     my $url=shift;
151    
152     my $handler=URL::URLhandler->new($area->cache());
153     return ($handler->get($url));
154 williamc 1.2 }
155    
156     sub addareatoDB {
157     my $self=shift;
158     my $area=shift;
159     my $tagname=shift;
160     my $version=shift;
161    
162     # -- create defaults if necessary
163     if ( (! defined $version) || ( $version eq "") ) {
164     $version=$area->version();
165     }
166     if ( (! defined $tagname) || ( $tagname eq "") ) {
167     $tagname=$area->name();
168     }
169    
170     # -- Add to the DB
171     $self->scramprojectdb()->addarea($tagname,$version,$area);
172     }
173    
174     sub globalcache {
175     my $self=shift;
176     if ( @_ ) {
177     $self->{cachedir}=shift;
178     }
179     if ( ! defined $self->{globalcache} ) {
180     $self->{globalcache}=URL::URLcache->new($self->{cachedir});
181     }
182     return $self->{globalcache};
183     }
184    
185    
186     sub scramprojectdb {
187     my $self=shift;
188     if ( @_ ) {
189     $self->{scramprojectsdbdir}=shift;
190     }
191     if ( ! defined $self->{scramprojectsdb} ) {
192     require Scram::ScramProjectDB;
193     $self->{scramprojectsdb}=Scram::ScramProjectDB->new(
194     $self->{scramprojectsdbdir} );
195     $self->{scramprojectsdb}->verbosity($self->verbosity());
196     }
197     return $self->{scramprojectsdb};
198     }
199    
200     sub areatoolbox {
201     my $self=shift;
202     my $area=shift;
203    
204     my $name=$area->location();
205     if ( ! defined $self->{toolboxes}{$name} ) {
206     # -- create a new toolbox object
207     require BuildSystem::ToolBox;
208     $self->{toolboxes}{$name}=BuildSystem::ToolBox->new($area);
209     $self->{toolboxes}{$name}->verbosity($self->verbosity());
210     }
211     return $self->{toolboxes}{$name};
212     }
213    
214     sub arearequirements {
215     my $self=shift;
216     my $area=shift;
217    
218     my $name=$area->location();
219     if ( ! defined $self->{requirements}{$name} ) {
220     # -- create a new toolbox object
221     require BuildSystem::Requirements;
222     my $doc=$area->requirementsdoc();
223     my $cache=$area->cache();
224     my $db=$area->objectstore();
225     require ActiveDoc::ActiveStore;
226     my $astore=ActiveDoc::ActiveStore->new($db,$cache);
227     $self->{requirements}{$name}=
228     BuildSystem::Requirements->new($astore,"file:".$doc,
229     $ENV{SCRAM_ARCH});
230     $self->{requirements}{$name}->verbosity($self->verbosity());
231     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.
232     ") for area :\n $name\n initiated from $doc");
233     }
234     else {
235     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.")");
236     }
237     return $self->{requirements}{$name};
238     }
239    
240     sub arch {
241     my $self=shift;
242    
243     @_?$self->{arch}=shift
244     :$self->{arch};
245 williamc 1.6 }
246    
247     sub scramobjectinterface {
248     my $self=shift;
249     my $class=shift;
250    
251     my $file;
252     ($file=$class."\.pm")=~s/::/\//g;
253     $file=$ENV{TOOL_HOME}."/".$file;
254    
255     if ( ! -f $file ) {
256     $self->error("Unable to find $class in ".$ENV{TOOL_HOME});
257     }
258     print "--------------------- $class ------------------\n";
259     my $fh=FileHandle->new();
260     $fh->open("<$file");
261     while ( <$fh> ) {
262     if ( $_=~/#\s*Interface/g ) {
263     $intregion=1;
264     next;
265     }
266     if ( $intregion ) { # if we are in the interface documentation
267     if ( ( $_!~/^#/ ) || ( $_=~/^#\s?-{40}/ ) ) { #moving out of Int doc
268     $intregion=0;
269     next;
270     }
271     print $_;
272     if ( $_=~/^#\s*(.*)\((.*)\)?:(.*)/ ) {
273     $interface=$1;
274     $args=$2;
275     $rest=$3;
276     next if ($interface eq "");
277     push @interfaces,$interface;
278     $interfaceargs{$interface}=$args;
279     }
280     }
281     }
282     print "\n";
283     undef $fh;
284 williamc 1.2 }
285    
286     # -------------- Support Routines ------------------------------
287    
288    
289     sub _allprojectinitsearcher {
290     if ( ! defined $self->{projsearcher} ) {
291     my $search=_projsearcher();
292     foreach $proj ( $self->scramprojectdb()->list() ) {
293     $search->addproject($$proj[0],$$proj[1]);
294     }
295     }
296     }
297    
298     sub _projsearcher {
299     if ( ! defined $self->{projsearcher} ) {
300     require Scram::ProjectSearcher;
301     $self->{projsearcher}=Scram::ProjectSearcher->new(
302     $self->scramprojectdb());
303     }
304     return $self->{projsearcher};
305     }
306    
307    
308     sub _lookupareaindb {
309     my $self=shift;
310    
311     my $area=undef;
312     # -- Look up the area in the databse
313     my @areas=$self->scramprojectdb()->getarea(@_);
314     if ( $#areas > 0 ) { #ambigous
315     # could ask user - for now just error
316     $self->error("Ambigous request - please be more specific");
317     }
318     elsif ( $#areas != 0 ) { #not found
319     $self->error("The project requested has not been found");
320     }
321     else {
322     $area=$areas[0];
323     }
324     return $area;
325     }