ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/Requirements.pm
Revision: 1.5
Committed: Mon Oct 1 16:11:07 2001 UTC (23 years, 7 months ago) by sashby
Content type: text/plain
Branch: MAIN
Changes since 1.4: +5 -4 lines
Log Message:
Committing some 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 sashby 1.5 foreach $tool ( $self->selectedtools() )
56     {
57     $self->verbose("Setting Up Tool $tool");
58     $toolbox->toolsetup($tool, $self->version($tool), $self->toolurl($tool));
59     }
60 williamc 1.2 }
61    
62     sub tools {
63     my $self=shift;
64     return @{$self->{tools}};
65     }
66    
67     sub selectedtools {
68     my $self=shift;
69     my @toollist=();
70     foreach $tool ( @{$self->{tools}} ) {
71     if ( $self->{selected}{$tool} == 1 ) {
72     push @toollist, $tool;
73     }
74     }
75     return @toollist;
76     }
77    
78     sub toolcomment {
79     my $self=shift;
80     my $tool=shift;
81     my $version=shift;
82    
83     return $self->{reqtext}{$tool}{$version};
84     }
85    
86     sub distributionurl {
87     my $self=shift;
88     my $tool=shift;
89     my $version=shift;
90    
91     return ( defined $self->{dist}{$tool}{$version})?
92     $self->{dist}{$tool}{$version}:undef;
93     }
94    
95     sub version {
96     my $self=shift;
97     my $tool=shift;
98     return $self->{'version'}{$tool};
99     }
100    
101     sub toolurl {
102     my $self=shift;
103     my $tool=shift;
104     return $self->{'url'}{$tool};
105     }
106    
107     sub init {
108     my $self=shift;
109     my $url=shift;
110    
111     my $switch=ActiveDoc::ActiveDoc->new($self->{dbstore});
112     $switch->verbosity($self->verbosity());
113     $switch->url($url);
114     $switch->newparse("ordering");
115     $switch->addbasetags("ordering");
116     $switch->addtag("ordering","Architecture",
117     \&Arch_Start,$self,
118     "", $self,
119     \&Arch_End, $self);
120     $switch->addtag("ordering","Restrict",
121     \&Restrict_start,$self,
122     "", $self,
123     \&Restrict_end, $self);
124     $switch->addtag("ordering","deselect",
125     \&deselect_start,$self,
126     "", $self,
127     "", $self);
128     $switch->addtag("ordering","select",
129     \&select_start,$self,
130     "", $self,
131     "", $self);
132     $switch->addtag("ordering","distribution",
133     \&disttag,$self);
134     $switch->grouptag("Architecture","ordering");
135     $switch->addtag("ordering","require",
136     \&require_start,$self,
137     \&require_text, $self,
138     \&require_end, $self);
139    
140     $self->{reqcontext}=0;
141     $self->{switch}=$switch;
142     undef $self->{restrictstack};
143     @{$self->{tools}}=();
144    
145     my($doctype,$docversion)=$switch->doctype();
146     # -- for backwards compatability only parse if we have a docversion
147     # defined
148     if ( defined $docversion ) {
149     if ( $docversion eq $self->{mydocversion} ) {
150     @{$self->{ArchStack}}=();
151 williamc 1.3 $self->verbose("Initial Document Parse");
152 williamc 1.2 $self->{switch}->parse("ordering");
153     }
154 williamc 1.3 else {
155     $self->verbose("wrong doc version - not parsing");
156     }
157 williamc 1.2 }
158     else {
159 williamc 1.3 $self->verbose("wrong doc type - not parsing");
160 williamc 1.2 }
161     }
162    
163     sub arch {
164     my $self=shift;
165     if ( @_ ) {
166     $self->{arch}=shift
167     }
168     else {
169     if ( ! defined $self->{arch} ) {
170     $self->{arch}="";
171     }
172     }
173     return $self->{arch};
174     }
175    
176     sub archlist {
177     my $self=shift;
178     return @{$self->{ArchStack}};
179     }
180    
181     sub getreqforarch {
182     my $self=shift;
183     my $arch=shift;
184    
185     if ( ! defined $self->{reqsforarch}{$arch} ) {
186     $self->{reqsforarch}{$arch}=
187     BuildSystem::Requirements->new($self->{dbstore},$self->{file},
188     $arch);
189     }
190     return $self->{reqsforarch}{$arch};
191     }
192    
193    
194     sub download {
195     my $self=shift;
196    
197     my $tool;
198     foreach $tool ( $self->tools() ) {
199     $self->verbose("Downloading ".$self->toolurl($tool));
200     # get into the cache
201     $self->{switch}->urlget($self->toolurl($tool));
202     }
203     }
204    
205     sub _autoselect {
206     my $self=shift;
207     if ( @_ ) {
208     $self->{autoselect}=shift;
209     }
210     # -- default is true
211     return ((defined $self->{autoselect})?$self->{autoselect}:1);
212     }
213    
214     # ---- Tag routines
215    
216     sub Restrict_start {
217     my $self=shift;
218     my $name=shift;
219     my $hashref=shift;
220    
221     $self->{switch}->checktag( $name, $hashref, 'autoselect');
222     if ( $self->{Arch} ) {
223     # -- create selection state stack
224     push @{$self->{restrictstack}}, $self->_autoselect();
225     $self->_autoselect(
226     (($$hashref{'autoselect'}=~/true/i)?1:0));
227     }
228     }
229    
230     sub Restrict_end {
231     my $self=shift;
232     my $name=shift;
233    
234     if ( $self->{Arch} ) {
235     if ( $#{$self->{restrictstack}} >= 0 ) {
236     $self->_autoselect(pop @{$self->{restrictstack}});
237     }
238     else {
239     $self->{switch}->parseerror("Unmatched </$name>");
240     }
241     }
242     }
243    
244     sub require_start {
245     my $self=shift;
246     my $name=shift;
247     my $hashref=shift;
248    
249     $self->{switch}->checktag( $name, $hashref, 'version');
250     $self->{switch}->checktag( $name, $hashref, 'name');
251     $self->{switch}->checktag( $name, $hashref, 'url');
252    
253     if ( $self->{reqcontext} == 1 ) {
254     $self->{switch}->parseerror(
255     "Open new $name conext without previous </$name>");
256     }
257     $self->{reqcontext}=1;
258     $$hashref{'name'}=~tr[A-Z][a-z];
259     push @{$self->{tools}}, $$hashref{'name'};
260     $self->{version}{$$hashref{'name'}}=$$hashref{'version'};
261     # -- make sure the full url is taken
262     my $urlobj=$self->{switch}->expandurl($$hashref{'url'});
263     $self->{url}{$$hashref{'name'}}=$urlobj->url();
264    
265     # -- selection
266     if ( $self->{Arch} ) {
267     if ( $self->_autoselect() ) {
268     $self->{selected}{$$hashref{'name'}}=1;
269     }
270     else {
271     $self->{selected}{$$hashref{'name'}}=0;
272     }
273     }
274     $self->{creqtool}=$$hashref{'name'};
275     $self->{creqversion}=$$hashref{'version'};
276     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}="";
277     }
278    
279     sub require_text {
280     my $self=shift;
281     my $name=shift;
282     my $string=shift;
283    
284     chomp $string;
285     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}=
286     $self->{reqtext}{$self->{creqtool}}{$self->{creqversion}}.
287     $string;
288    
289     }
290    
291     sub require_end {
292     my $self=shift;
293     my $name=shift;
294    
295     if ( $self->{reqcontext} != 1 ) {
296     $self->{switch}->parseerror("No matching tag for </$name>");
297     }
298     else {
299     $self->{reqcontext}=0;
300     }
301     }
302    
303     sub select_start {
304     my $self=shift;
305     my $name=shift;
306     my $hashref=shift;
307    
308     $self->{switch}->checktag( $name, $hashref, 'name');
309     $$hashref{'name'}=~tr[A-Z][a-z];
310     if ( $self->{Arch} ) {
311     $self->verbose("Selecting ".$$hashref{'name'});
312     $self->{selected}{$$hashref{'name'}}=1;
313     }
314     }
315    
316     sub deselect_start {
317     my $self=shift;
318     my $name=shift;
319     my $hashref=shift;
320    
321     $self->{switch}->checktag( $name, $hashref, 'name');
322     $$hashref{'name'}=~tr[A-Z][a-z];
323     if ( $self->{Arch} ) {
324     $self->verbose("Deselecting ".$$hashref{'name'});
325     $self->{selected}{$$hashref{'name'}}=0;
326     }
327     }
328    
329     sub Arch_Start {
330     my $self=shift;
331     my $name=shift;
332     my $hashref=shift;
333    
334     $self->{switch}->checktag($name, $hashref,'name');
335    
336     ( ($self->arch()=~/$$hashref{name}.*/) )? ($self->{Arch}=1)
337     : ($self->{Arch}=0);
338     $self->verbose(($self->{Arch}?"OK":"skipping")." ".$$hashref{name});
339     push @{$self->{ARCHBLOCK}}, $self->{Arch};
340     push @{$self->{ArchStack}}, $$hashref{'name'};
341     }
342    
343     sub Arch_End {
344     my $self=shift;
345     my $name=shift;
346    
347     pop @{$self->{ARCHBLOCK}};
348     $self->{Arch}=$self->{ARCHBLOCK}[$#{$self->{ARCHBLOCK}}];
349     }
350    
351     sub disttag {
352     my $self=shift;
353     my $name=shift;
354     my $hashref=shift;
355    
356     if ( exists $$hashref{'url'} ) {
357     $self->{dist}{$self->{creqtool}}{$self->{creqversion}}=
358     $$hashref{'url'};
359     }
360     }