ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/Requirements.pm
Revision: 1.4
Committed: Tue Jul 10 15:04:15 2001 UTC (23 years, 10 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_0
Changes since 1.3: +0 -1 lines
Log Message:
Adding recent changes.

File Contents

# User Rev Content
1 williamc 1.2 # Requirements Doc - just to get ordering info
2     #
3     # Interface
4     # ---------
5     # new(ActiveStore,url[,arch]) : new requirements doc
6     # setup(toolbox): set up the requirements into the specified toolbox object
7     # download(toolbox) : download description files (into toolbox cache)
8     # tools() : Return list of ALL requirements (ordered)
9     # selectedtools() : Return list of only those tools selected
10     # version(tool) : return the version of a given tool
11     # toolurl(tool) : return the url of a given tool
12     # getreqforarch(arch) : Return a RequirementsObject corresponding to the
13     # specified architecture
14     # toolcomment(tool,version) : return the comment string for the specified tool
15     # distributionurl(tool,version) : return the dist info url for the tool
16    
17     package BuildSystem::Requirements;
18     use ActiveDoc::ActiveDoc;
19     use Utilities::Verbose;
20    
21     require 5.004;
22     @ISA=qw(Utilities::Verbose);
23    
24     sub new {
25     my $class=shift;
26     my $self={};
27     bless $self, $class;
28     $self->{dbstore}=shift;
29     $self->{file}=shift;
30     $self->{cache}=$self->{dbstore}->cache();
31     if ( @_ ) {
32     $self->arch(shift);
33     }
34 williamc 1.3 $self->verbose("Initialising a new Requirements Doc");
35 williamc 1.2 $self->{mydocversion}="2.0";
36     $self->{Arch}=1;
37     push @{$self->{ARCHBLOCK}}, $self->{Arch};
38     $self->init($self->{file});
39     return $self;
40     }
41    
42     sub url {
43     my $self=shift;
44     if ( @_ ) {
45     $self->{file}=shift;
46     }
47     return $self->{file}
48     }
49    
50     sub setup {
51     my $self=shift;
52     my $toolbox=shift;
53    
54     my $tool;
55     foreach $tool ( $self->selectedtools() ) {
56     $self->verbose("Setting Up Tool $tool");
57     $toolbox->toolsetup($tool, $self->version($tool), $self->toolurl($tool));
58     }
59     }
60    
61     sub tools {
62     my $self=shift;
63     return @{$self->{tools}};
64     }
65    
66     sub selectedtools {
67     my $self=shift;
68     my @toollist=();
69     foreach $tool ( @{$self->{tools}} ) {
70     if ( $self->{selected}{$tool} == 1 ) {
71     push @toollist, $tool;
72     }
73     }
74     return @toollist;
75     }
76    
77     sub toolcomment {
78     my $self=shift;
79     my $tool=shift;
80     my $version=shift;
81    
82     return $self->{reqtext}{$tool}{$version};
83     }
84    
85     sub distributionurl {
86     my $self=shift;
87     my $tool=shift;
88     my $version=shift;
89    
90     return ( defined $self->{dist}{$tool}{$version})?
91     $self->{dist}{$tool}{$version}:undef;
92     }
93    
94     sub version {
95     my $self=shift;
96     my $tool=shift;
97     return $self->{'version'}{$tool};
98     }
99    
100     sub toolurl {
101     my $self=shift;
102     my $tool=shift;
103     return $self->{'url'}{$tool};
104     }
105    
106     sub init {
107     my $self=shift;
108     my $url=shift;
109    
110     my $switch=ActiveDoc::ActiveDoc->new($self->{dbstore});
111     $switch->verbosity($self->verbosity());
112     $switch->url($url);
113     $switch->newparse("ordering");
114     $switch->addbasetags("ordering");
115     $switch->addtag("ordering","Architecture",
116     \&Arch_Start,$self,
117     "", $self,
118     \&Arch_End, $self);
119     $switch->addtag("ordering","Restrict",
120     \&Restrict_start,$self,
121     "", $self,
122     \&Restrict_end, $self);
123     $switch->addtag("ordering","deselect",
124     \&deselect_start,$self,
125     "", $self,
126     "", $self);
127     $switch->addtag("ordering","select",
128     \&select_start,$self,
129     "", $self,
130     "", $self);
131     $switch->addtag("ordering","distribution",
132     \&disttag,$self);
133     $switch->grouptag("Architecture","ordering");
134     $switch->addtag("ordering","require",
135     \&require_start,$self,
136     \&require_text, $self,
137     \&require_end, $self);
138    
139     $self->{reqcontext}=0;
140     $self->{switch}=$switch;
141     undef $self->{restrictstack};
142     @{$self->{tools}}=();
143    
144     my($doctype,$docversion)=$switch->doctype();
145     # -- for backwards compatability only parse if we have a docversion
146     # defined
147     if ( defined $docversion ) {
148     if ( $docversion eq $self->{mydocversion} ) {
149     @{$self->{ArchStack}}=();
150 williamc 1.3 $self->verbose("Initial Document Parse");
151 williamc 1.2 $self->{switch}->parse("ordering");
152     }
153 williamc 1.3 else {
154     $self->verbose("wrong doc version - not parsing");
155     }
156 williamc 1.2 }
157     else {
158 williamc 1.3 $self->verbose("wrong doc type - not parsing");
159 williamc 1.2 }
160     }
161    
162     sub arch {
163     my $self=shift;
164     if ( @_ ) {
165     $self->{arch}=shift
166     }
167     else {
168     if ( ! defined $self->{arch} ) {
169     $self->{arch}="";
170     }
171     }
172     return $self->{arch};
173     }
174    
175     sub archlist {
176     my $self=shift;
177     return @{$self->{ArchStack}};
178     }
179    
180     sub getreqforarch {
181     my $self=shift;
182     my $arch=shift;
183    
184     if ( ! defined $self->{reqsforarch}{$arch} ) {
185     $self->{reqsforarch}{$arch}=
186     BuildSystem::Requirements->new($self->{dbstore},$self->{file},
187     $arch);
188     }
189     return $self->{reqsforarch}{$arch};
190     }
191    
192    
193     sub download {
194     my $self=shift;
195    
196     my $tool;
197     foreach $tool ( $self->tools() ) {
198     $self->verbose("Downloading ".$self->toolurl($tool));
199     # get into the cache
200     $self->{switch}->urlget($self->toolurl($tool));
201     }
202     }
203    
204     sub _autoselect {
205     my $self=shift;
206     if ( @_ ) {
207     $self->{autoselect}=shift;
208     }
209     # -- default is true
210     return ((defined $self->{autoselect})?$self->{autoselect}:1);
211     }
212    
213     # ---- Tag routines
214    
215     sub Restrict_start {
216     my $self=shift;
217     my $name=shift;
218     my $hashref=shift;
219    
220     $self->{switch}->checktag( $name, $hashref, 'autoselect');
221     if ( $self->{Arch} ) {
222     # -- create selection state stack
223     push @{$self->{restrictstack}}, $self->_autoselect();
224     $self->_autoselect(
225     (($$hashref{'autoselect'}=~/true/i)?1:0));
226     }
227     }
228    
229     sub Restrict_end {
230     my $self=shift;
231     my $name=shift;
232    
233     if ( $self->{Arch} ) {
234     if ( $#{$self->{restrictstack}} >= 0 ) {
235     $self->_autoselect(pop @{$self->{restrictstack}});
236     }
237     else {
238     $self->{switch}->parseerror("Unmatched </$name>");
239     }
240     }
241     }
242    
243     sub require_start {
244     my $self=shift;
245     my $name=shift;
246     my $hashref=shift;
247    
248     $self->{switch}->checktag( $name, $hashref, 'version');
249     $self->{switch}->checktag( $name, $hashref, 'name');
250     $self->{switch}->checktag( $name, $hashref, 'url');
251    
252     if ( $self->{reqcontext} == 1 ) {
253     $self->{switch}->parseerror(
254     "Open new $name conext without previous </$name>");
255     }
256     $self->{reqcontext}=1;
257     $$hashref{'name'}=~tr[A-Z][a-z];
258     push @{$self->{tools}}, $$hashref{'name'};
259     $self->{version}{$$hashref{'name'}}=$$hashref{'version'};
260     # -- make sure the full url is taken
261     my $urlobj=$self->{switch}->expandurl($$hashref{'url'});
262     $self->{url}{$$hashref{'name'}}=$urlobj->url();
263    
264     # -- selection
265     if ( $self->{Arch} ) {
266     if ( $self->_autoselect() ) {
267     $self->{selected}{$$hashref{'name'}}=1;
268     }
269     else {
270     $self->{selected}{$$hashref{'name'}}=0;
271     }
272     }
273     $self->{creqtool}=$$hashref{'name'};
274     $self->{creqversion}=$$hashref{'version'};
275     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}="";
276     }
277    
278     sub require_text {
279     my $self=shift;
280     my $name=shift;
281     my $string=shift;
282    
283     chomp $string;
284     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}=
285     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}.
286     $string;
287    
288     }
289    
290     sub require_end {
291     my $self=shift;
292     my $name=shift;
293    
294     if ( $self->{reqcontext} != 1 ) {
295     $self->{switch}->parseerror("No matching tag for </$name>");
296     }
297     else {
298     $self->{reqcontext}=0;
299     }
300     }
301    
302     sub select_start {
303     my $self=shift;
304     my $name=shift;
305     my $hashref=shift;
306    
307     $self->{switch}->checktag( $name, $hashref, 'name');
308     $$hashref{'name'}=~tr[A-Z][a-z];
309     if ( $self->{Arch} ) {
310     $self->verbose("Selecting ".$$hashref{'name'});
311     $self->{selected}{$$hashref{'name'}}=1;
312     }
313     }
314    
315     sub deselect_start {
316     my $self=shift;
317     my $name=shift;
318     my $hashref=shift;
319    
320     $self->{switch}->checktag( $name, $hashref, 'name');
321     $$hashref{'name'}=~tr[A-Z][a-z];
322     if ( $self->{Arch} ) {
323     $self->verbose("Deselecting ".$$hashref{'name'});
324     $self->{selected}{$$hashref{'name'}}=0;
325     }
326     }
327    
328     sub Arch_Start {
329     my $self=shift;
330     my $name=shift;
331     my $hashref=shift;
332    
333     $self->{switch}->checktag($name, $hashref,'name');
334    
335     ( ($self->arch()=~/$$hashref{name}.*/) )? ($self->{Arch}=1)
336     : ($self->{Arch}=0);
337     $self->verbose(($self->{Arch}?"OK":"skipping")." ".$$hashref{name});
338     push @{$self->{ARCHBLOCK}}, $self->{Arch};
339     push @{$self->{ArchStack}}, $$hashref{'name'};
340     }
341    
342     sub Arch_End {
343     my $self=shift;
344     my $name=shift;
345    
346     pop @{$self->{ARCHBLOCK}};
347     $self->{Arch}=$self->{ARCHBLOCK}[$#{$self->{ARCHBLOCK}}];
348     }
349    
350     sub disttag {
351     my $self=shift;
352     my $name=shift;
353     my $hashref=shift;
354    
355     if ( exists $$hashref{'url'} ) {
356     $self->{dist}{$self->{creqtool}}{$self->{creqversion}}=
357     $$hashref{'url'};
358     }
359     }