Annotation of loncom/build/parse.pl, revision 1.14

1.1       harris41    1: #!/usr/bin/perl
                      2: 
                      3: # Scott Harrison
                      4: # November 2000
                      5: 
1.2       harris41    6: # Read in loncapa tags and metagroup tags
1.1       harris41    7: 
1.4       harris41    8: # ---------------------------------------------- Read in command line arguments
1.1       harris41    9: my ($file,$mode)=@ARGV;
1.2       harris41   10: 
1.4       harris41   11: # ---------------------------------------------------- Read in master data file
1.1       harris41   12: open IN,"<$file";
                     13: my @lines=<IN>;
                     14: close IN;
1.5       harris41   15: my $info1=join('',@lines);
                     16: my $info2=$info1; # value to allow for meta data group retrieval
1.1       harris41   17: 
1.4       harris41   18: # ------------------------------------------------------- Make default settings
                     19: my $distribution="redhat6.2";
                     20: my $date=`date +'%B %e, %Y'`; chop $date;
                     21: my $buildhost=`hostname`; chop $buildhost;
1.5       harris41   22: # file category mappings
                     23: my %fcm=(
                     24: 	 'conf' => 'configurable',
                     25: 	 'graphic file' => 'graphicfile',
                     26: 	 'handler' => 'handler',
                     27: 	 'interface file' => 'interfacefile',
                     28: 	 'symbolic link' => 'link',
                     29: 	 'root script' => 'rootscript',
                     30: 	 'script' => 'script',
                     31: 	 'setuid script' => 'setuid',
                     32: 	 'static conf' => 'static',
                     33: 	 'system file' => 'systemfile',
                     34: 	 );
1.4       harris41   35: 
                     36: # ---------------------------------------------------- Parse the marked up data
                     37: my %info; # big data storage object
1.5       harris41   38: while ($info1=~/\<loncapa\s+(.*?)\>/isg) {
1.1       harris41   39:     my $keystring=$1;
1.4       harris41   40:     # In the parsing of LON-CAPA tags, remove boundary white-space,
                     41:     # and handle quotation commands.
1.2       harris41   42:     my %hash=map {my ($key,$value)=split(/\=(?!")|\=(?=\s*"[^"]*"[^"]*$)/);
                     43:                                    $value=~s/^"//;
                     44:  				   $value=~s/"$//;
                     45:                                    (uc($key),$value);}
                     46:              split(/\s+(?=\w+\s*\=)/,$keystring);
1.4       harris41   47:     # Handle the different types of commands
1.1       harris41   48:     if (uc($hash{'TYPE'}) eq "OWNERSHIP") {
                     49:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
                     50:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
                     51:     }
                     52:     elsif (uc($hash{'TYPE'}) eq "DEVOWNERSHIP") {
                     53:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHMOD'}=$hash{'CHMOD'};
                     54:         $info{$hash{'TYPE'}}{$hash{'CATEGORY'}}{'CHOWN'}=$hash{'CHOWN'};
                     55:     }
                     56:     elsif (uc($hash{'TYPE'}) eq "RPM") {
                     57:         $hash{'VALUE'}=~s/\\n/\n/g;
                     58:         $info{$hash{'TYPE'}}{$hash{'NAME'}}=$hash{'VALUE'};
                     59:     }
                     60:     elsif (uc($hash{'TYPE'}) eq "DIRECTORY") {
1.4       harris41   61:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}=
                     62:                                                        $hash{'CATEGORY'};
                     63:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'DESCRIPTION'}=
                     64:                                $hash{'DESCRIPTION'} if $hash{'DESCRIPTION'};
1.1       harris41   65:     }
                     66:     elsif (uc($hash{'TYPE'}) eq "LOCATION") {
1.5       harris41   67:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'CATEGORY'}=                               $hash{'CATEGORY'};
1.10      harris41   68:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'LINKTO'}=                               $hash{'LINKTO'};
1.5       harris41   69:         $info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{'SOURCE'}=                                               $hash{'SOURCE'};
1.1       harris41   70:         # get surrounding metagroup information
                     71:         my $ckeystring=$keystring; $ckeystring=~s/(SOURCE\=\"[^"]*)\*/$1\\\*/g;
1.5       harris41   72:         $ckeystring=~s/(TARGET\=\"[^"]*)\*/$1\\\*/g;
1.1       harris41   73:         $info2=~/.*\<(?:metagroup|metasupergroup)\>(.*?)\<loncapa\s+$ckeystring\>(.*?)\<\/(?:metagroup|metasupergroup)\>/is;
                     74: 	my $data=$1.$2;
                     75:         my @meta=('description','build','dependencies','files','note');
                     76:         foreach my $m (@meta) {
                     77: 	    if ($data=~/\<($m)\>(.*?)\<\/$m\>/sgi) {
                     78: 		my ($key,$value)=($1,$2);
1.9       harris41   79: 		$info{$hash{'TYPE'}}{$hash{'DIST'}}{$hash{'TARGET'}}{uc($key)}=
1.4       harris41   80: 		                                                    $value;
1.1       harris41   81: 	    }
                     82:         }
                     83:     }
                     84:     else {
                     85:         warn("WARNING: this tag text will be ignored since it cannot be understood\n---> $keystring\n");
                     86:     }
                     87: }
                     88: 
1.10      harris41   89: my $a;
                     90: my @directories;
                     91: if ($mode eq "HTML") {
1.4       harris41   92:     $a=&begin_description_page;
                     93:     print $a;
                     94:     $a=&make_rpm_description_block;
                     95:     print $a;
                     96:     @directories=&determine_directory_structure;
                     97:     $a=&make_directory_structure_description_block(\@directories);
                     98:     print $a;
1.6       harris41   99:     $a=&make_file_type_ownership_and_permissions_description_block;
                    100:     print $a;
1.4       harris41  101:     $a=&make_directory_and_file_structure_description_block(\@directories);
                    102:     print $a;
                    103:     $a=&end_description_page;
                    104:     print $a;
                    105: }
1.10      harris41  106: elsif ($mode eq "SPEC") {
                    107:     my $out=$info{'RPM'}{'Name'} . '-' . $info{'RPM'}{'Version'} . '.spec';
                    108:     open OUT,">$out";
                    109:     $a=&make_rpm_spec_block;
                    110:     print OUT $a;
                    111:     $a=&make_rpm_build_block;
                    112:     print OUT $a;
                    113:     @directories=&determine_directory_structure;
                    114:     $a=&make_directory_structure_spec_block(\@directories);
                    115:     print OUT $a;
                    116:     $a=&make_directory_and_file_structure_spec_block(\@directories);
                    117:     print OUT $a;
                    118:     $a=&end_spec_page;
                    119:     print OUT $a;
                    120:     close OUT;
                    121: }
                    122: elsif ($mode eq "LCMakefile") {
                    123:     @directories=&determine_directory_structure;
1.14    ! harris41  124:     $a=&make_directory_LCMakefile_segment(\@directories);
1.10      harris41  125:     print $a;
1.14    ! harris41  126:     $a=&make_files_LCMakefile_segment(\@directories);
1.10      harris41  127:     print $a;
1.14    ! harris41  128:     $a=&make_links_LCMakefile_segment(\@directories);
1.10      harris41  129:     print $a;
                    130: }
1.11      harris41  131: elsif ($mode eq "BinaryRoot") {
                    132:     mkdir "BinaryRoot",0755;
                    133:     open OUT,">Makefile.BinaryRoot";
                    134:     @directories=&determine_directory_structure;
                    135:     $a=&make_directory_binaryroot_segment(\@directories);
                    136:     print OUT $a;
                    137:     $a=&make_files_binaryroot_segment(\@directories);
                    138:     print OUT $a;
                    139:     $a=&make_links_binaryroot_segment(\@directories);
                    140:     print OUT $a;
                    141:     close OUT;
                    142:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' directories`;
                    143:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' files`;
                    144:     print `make -f Makefile.BinaryRoot TARGET='BinaryRoot' SOURCE='../..' links`;
                    145:     open OUT,">base_file_list.txt";
                    146:     $a=&make_file_list(\@directories);
                    147:     print OUT $a;
                    148:     close OUT;
                    149:     
                    150: }
1.10      harris41  151: elsif ($mode eq "status") {
                    152: }
                    153: elsif ($mode eq "update") {
                    154: }
1.14    ! harris41  155: elsif ($mode eq "install") {
        !           156:     @directories=&determine_directory_structure;
        !           157:     $a=&make_directory_install_segment(\@directories);
        !           158:     print $a;
        !           159:     $a=&make_files_install_segment(\@directories);
        !           160:     print $a;
        !           161:     $a=&make_links_install_segment(\@directories);
        !           162:     print $a;
1.11      harris41  163: }
                    164: 
                    165: # ------------------------------------------------------ a list of file targets
                    166: sub make_file_list {
                    167:     my ($dirs)=@_;
                    168:     my $description;
                    169:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    170:     foreach my $d (@$dirs) {
                    171: 	# set other values
                    172: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    173: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    174: 	# find files that are contained in this directory
                    175: 	my @files;
                    176: 	my @filesfull;
                    177: 	foreach my $f (@allfiles) {
                    178: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    179: 		push @files,$1;
                    180: 		push @filesfull,$f;
                    181: 	    }
                    182: 	}
                    183: 	# render starting HTML formatting elements
                    184: 	if (@files) {
                    185:         }
1.12      harris41  186: 	my $pwd=`pwd`; chop $pwd;
1.11      harris41  187: 	if (@files) {
                    188:             foreach my $i (0..$#files) {
                    189: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    190: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    191: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    192: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    193: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    194: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    195: 		my $rot="/".$filesfull[$i];
                    196: 		if ($rot=~/\*/) {
                    197: 		    $rot=~s/[^\/]+$// if $rot=~/\*/;
                    198: 		    my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
                    199: 		    chop $listing;
                    200: 		    my @list=split(/\s+/,$listing);
                    201: 		    my $rot2;
                    202: 		    foreach my $l (@list) {
                    203: 			$l=~s/^\s*//; $l=~s/\s*$//;
1.12      harris41  204: 			$rot2.="BinaryRoot$rot$l\n" if length($l);
1.11      harris41  205: 		    }
                    206: 		    chop $rot2;
                    207: 		    $rot=$rot2;
1.12      harris41  208: 		}
                    209: 		else {
                    210: 		    $rot="BinaryRoot$rot";
1.11      harris41  211: 		}
1.13      harris41  212: 		if ($category eq "conf") {
                    213: 		    $rot.=" # config";
                    214: 		}
1.11      harris41  215: 		$description.=<<END;
                    216: $rot
                    217: END
                    218: 	    }
                    219: 	}
                    220:     }
                    221:     $description.=<<END;
                    222: 
                    223: END
                    224:     return $description;
                    225: }
                    226: 
                    227: # --------------------------------- Commands to make BinaryRoot directories
                    228: sub make_directory_binaryroot_segment {
                    229:     my ($dirs)=@_;
                    230:     my $description=<<END;
                    231: directories:
                    232: END
                    233:     foreach my $d (@$dirs) {
                    234: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    235: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    236: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    237: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    238: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    239: 	my $own=$devchown; $own=~s/\:/\,/;
                    240: 	$description.=<<END;
                    241: \tinstall -m $devchmod -d \$(TARGET)/$d
                    242: END
                    243:     }
                    244:     $description.=<<END;
                    245: 
                    246: END
                    247:     return $description;
                    248: }
                    249: 
                    250: # --------------------------------------- Commands to make BinaryRoot files
                    251: sub make_files_binaryroot_segment {
                    252:     my ($dirs)=@_;
                    253:     my $description=<<END;
                    254: files:
                    255: END
                    256:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    257:     foreach my $d (@$dirs) {
                    258: 	# set other values
                    259: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    260: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    261: 	# find files that are contained in this directory
                    262: 	my @files;
                    263: 	my @filesfull;
                    264: 	foreach my $f (@allfiles) {
                    265: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    266: 		push @files,$1;
                    267: 		push @filesfull,$f;
                    268: 	    }
                    269: 	}
                    270: 	# render starting HTML formatting elements
                    271: 	if (@files) {
                    272: 	    $description.=<<END;
                    273: \t# $d $dirdescription
                    274: END
                    275:         }
                    276: 	if (@files) {
                    277:             foreach my $i (0..$#files) {
                    278: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    279: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    280: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    281: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    282: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    283: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
                    284: 		my $rot=$filesfull[$i];
                    285: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    286: 		$description.=<<END if $category ne 'symbolic link';
                    287: \tinstall -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
                    288: END
                    289: 	    }
                    290: 	}
                    291:     }
                    292:     $description.=<<END;
                    293: 
                    294: END
                    295:     return $description;
                    296: }
                    297: 
                    298: # ------------------------------ Commands to make BinaryRoot symbolic links
                    299: sub make_links_binaryroot_segment {
                    300:     my ($dirs)=@_;
                    301:     my $description=<<END;
                    302: links:
                    303: END
                    304:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    305:     foreach my $d (@$dirs) {
                    306: 	# find files that are contained in this directory
                    307: 	my @files;
                    308: 	my @filesfull;
                    309: 	foreach my $f (@allfiles) {
                    310: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    311: 		push @files,$1;
                    312: 		push @filesfull,$f;
                    313: 	    }
                    314: 	}
                    315: 	# render starting HTML formatting elements
                    316: 	if (@files) {
                    317:             foreach my $i (0..$#files) {
                    318: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    319: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
                    320: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    321: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    322: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    323: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    324: 		$description.=<<END if $category eq 'symbolic link';
                    325: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
                    326: END
                    327: 	    }
                    328: 	}
                    329:     }
                    330:     $description.=<<END;
                    331: 
                    332: END
                    333:     return $description;
1.10      harris41  334: }
                    335: 
1.14    ! harris41  336: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
        !           337: sub make_directory_LCMakefile_segment {
        !           338:     my ($dirs)=@_;
        !           339:     my $description=<<END;
        !           340: directories:
        !           341: END
        !           342:     foreach my $d (@$dirs) {
        !           343: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
        !           344: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
        !           345: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
        !           346: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
        !           347: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
        !           348: 	my $own=$devchown; $own=~s/\:/\,/;
        !           349: 	$description.=<<END;
        !           350: \tinstall -m $devchmod -d \$(SOURCE)/$d \$(ROOT)/$d
        !           351: END
        !           352:     }
        !           353:     $description.=<<END;
        !           354: 
        !           355: END
        !           356:     return $description;
        !           357: }
        !           358: 
        !           359: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
        !           360: sub make_files_LCMakefile_segment {
        !           361:     my ($dirs)=@_;
        !           362:     my $description=<<END;
        !           363: files:
        !           364: END
        !           365:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
        !           366:     foreach my $d (@$dirs) {
        !           367: 	# set other values
        !           368: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
        !           369: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
        !           370: 	# find files that are contained in this directory
        !           371: 	my @files;
        !           372: 	my @filesfull;
        !           373: 	foreach my $f (@allfiles) {
        !           374: 	    if ($f=~/^$d\/([^\/]+)$/) {
        !           375: 		push @files,$1;
        !           376: 		push @filesfull,$f;
        !           377: 	    }
        !           378: 	}
        !           379: 	# render starting HTML formatting elements
        !           380: 	if (@files) {
        !           381: 	    $description.=<<END;
        !           382: \t# $d $dirdescription
        !           383: END
        !           384:         }
        !           385: 	if (@files) {
        !           386:             foreach my $i (0..$#files) {
        !           387: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
        !           388: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
        !           389: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
        !           390: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
        !           391: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
        !           392: 		my $rot=$filesfull[$i];
        !           393: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
        !           394: 		$description.=<<END if $category ne 'symbolic link';
        !           395: \tinstall -m $devchmod \$(SOURCE)/$filesfull[$i] \$(ROOT)/$rot
        !           396: END
        !           397: 	    }
        !           398: 	}
        !           399:     }
        !           400:     $description.=<<END;
        !           401: 
        !           402: END
        !           403:     return $description;
        !           404: }
        !           405: 
        !           406: # ------ Installation commands for a Makefile used only by a rpm -ba invocation
        !           407: sub make_links_LCMakefile_segment {
        !           408:     my ($dirs)=@_;
        !           409:     my $description=<<END;
        !           410: links:
        !           411: END
        !           412:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
        !           413:     foreach my $d (@$dirs) {
        !           414: 	# find files that are contained in this directory
        !           415: 	my @files;
        !           416: 	my @filesfull;
        !           417: 	foreach my $f (@allfiles) {
        !           418: 	    if ($f=~/^$d\/([^\/]+)$/) {
        !           419: 		push @files,$1;
        !           420: 		push @filesfull,$f;
        !           421: 	    }
        !           422: 	}
        !           423: 	# render starting HTML formatting elements
        !           424: 	if (@files) {
        !           425:             foreach my $i (0..$#files) {
        !           426: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
        !           427: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
        !           428: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
        !           429: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
        !           430: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
        !           431: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
        !           432: 		$description.=<<END if $category eq 'symbolic link';
        !           433: \tln -s /$linkto \$(ROOT)/$filesfull[$i]
        !           434: END
        !           435: 	    }
        !           436: 	}
        !           437:     }
        !           438:     $description.=<<END;
        !           439: 
        !           440: END
        !           441:     return $description;
        !           442: }
        !           443: 
1.10      harris41  444: # --------------------------------- Installation commands to install directories
                    445: sub make_directory_install_segment {
                    446:     my ($dirs)=@_;
                    447:     my $description=<<END;
                    448: directories:
                    449: END
                    450:     foreach my $d (@$dirs) {
                    451: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
1.14    ! harris41  452: 	my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10      harris41  453: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    454: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    455: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    456: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    457: 	my $own=$devchown; $own=~s/\:/\,/;
                    458: 	$description.=<<END;
1.14    ! harris41  459: \tinstall -m $devchmod -d \$(TARGET)/$d
1.10      harris41  460: END
                    461:     }
                    462:     $description.=<<END;
                    463: 
                    464: END
                    465:     return $description;
                    466: }
                    467: 
                    468: # --------------------------------------- Installation commands to install files
                    469: sub make_files_install_segment {
                    470:     my ($dirs)=@_;
                    471:     my $description=<<END;
                    472: files:
                    473: END
                    474:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    475:     foreach my $d (@$dirs) {
                    476: 	# set other values
                    477: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    478: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    479: 	# find files that are contained in this directory
                    480: 	my @files;
                    481: 	my @filesfull;
                    482: 	foreach my $f (@allfiles) {
                    483: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    484: 		push @files,$1;
                    485: 		push @filesfull,$f;
                    486: 	    }
                    487: 	}
                    488: 	# render starting HTML formatting elements
                    489: 	if (@files) {
                    490: 	    $description.=<<END;
                    491: \t# $d $dirdescription
                    492: END
                    493:         }
                    494: 	if (@files) {
                    495:             foreach my $i (0..$#files) {
                    496: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
1.14    ! harris41  497: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.10      harris41  498: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    499: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    500: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    501: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    502: 		my $rot=$filesfull[$i];
                    503: 		$rot=~s/[^\/]+$/\./ if $rot=~/\*/;
                    504: 		$description.=<<END if $category ne 'symbolic link';
1.14    ! harris41  505: \tinstall -m $devchmod \$(SOURCE)/$source \$(TARGET)/$rot
1.10      harris41  506: END
                    507: 	    }
                    508: 	}
                    509:     }
                    510:     $description.=<<END;
                    511: 
                    512: END
                    513:     return $description;
                    514: }
                    515: 
                    516: # ------------------------------ Installation commands to install symbolic links
                    517: sub make_links_install_segment {
                    518:     my ($dirs)=@_;
                    519:     my $description=<<END;
                    520: links:
                    521: END
                    522:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    523:     foreach my $d (@$dirs) {
                    524: 	# find files that are contained in this directory
                    525: 	my @files;
                    526: 	my @filesfull;
                    527: 	foreach my $f (@allfiles) {
                    528: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    529: 		push @files,$1;
                    530: 		push @filesfull,$f;
                    531: 	    }
                    532: 	}
                    533: 	# render starting HTML formatting elements
                    534: 	if (@files) {
                    535:             foreach my $i (0..$#files) {
                    536: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    537: 		my $linkto=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'LINKTO'};
                    538: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    539: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    540: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    541: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    542: 		$description.=<<END if $category eq 'symbolic link';
1.14    ! harris41  543: \tln -s /$linkto \$(TARGET)/$filesfull[$i]
1.10      harris41  544: END
                    545: 	    }
                    546: 	}
                    547:     }
                    548:     $description.=<<END;
1.4       harris41  549: 
1.10      harris41  550: END
                    551:     return $description;
                    552: }
                    553: 
                    554: # --------------------------------------------------------- Make RPM .spec block
                    555: sub make_rpm_spec_block {
                    556:     my $pwd=`pwd`; chop $pwd;
                    557:     my $buildroot="$pwd/LON-CAPA-BuildRoot";
                    558:     my $source=$info{'RPM'}{'Name'} . "-" . $info{'RPM'}{'Version'} . '.tar.gz';
                    559:     my $description=<<END;
                    560: Summary: $info{'RPM'}{'Summary'}
                    561: Name: $info{'RPM'}{'Name'}
                    562: Version: $info{'RPM'}{'Version'}
                    563: Release: $info{'RPM'}{'Release'}
                    564: Vendor: $info{'RPM'}{'Vendor'} 
                    565: BuildRoot: $buildroot
                    566: Copyright: $info{'RPM'}{'Copyright'}
                    567: Group: $info{'RPM'}{'Group'}
                    568: Source: $source
                    569: AutoReqProv: $info{'RPM'}{'AutoReqProv'}
                    570: \%description
                    571: $info{'RPM'}{'description'}
                    572: 
                    573: END
                    574:     return $description;
                    575: }
                    576: 
                    577: # --------------------------------------------------- Make RPM build .spec block
                    578: sub make_rpm_build_block {
                    579:     my $pwd=`pwd`; chop $pwd;
                    580:     my $buildroot="$pwd/LON-CAPA-BuildRoot";
                    581:     my $sourceroot="$pwd/LON-CAPA-SourceRoot";
                    582:     my $description=<<END;
                    583: 
                    584: \%prep
                    585: \%setup
                    586: 
                    587: \%build
                    588: rm -Rf "$buildroot"
                    589: 
                    590: \%install
                    591: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" directories
                    592: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" files
                    593: make -f LCMakefile ROOT="\$RPM_BUILD_ROOT" SOURCE="$sourceroot" links
                    594: 
                    595: \%pre
                    596: $info{'RPM'}{'pre'}
                    597: 
                    598: \%post
                    599: \%postun
                    600: 
                    601: \%files
                    602: # \%doc README COPYING ChangeLog LICENSE
                    603: END
                    604:     return $description;
                    605: }
                    606: 
                    607: # ------------------------------------- Make directory structure RPM .spec block
                    608: sub make_directory_structure_spec_block {
                    609:     my ($dirs)=@_;
                    610:     foreach my $d (@$dirs) {
                    611: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    612: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    613: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    614: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    615: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    616: 	my $own=$devchown; $own=~s/\:/\,/;
                    617: 	$description.=<<END;
                    618: \%dir \%attr($devchmod,$own) /$d
                    619: END
                    620:     }
                    621:     return $description;
                    622: }
                    623: 
                    624: # ---------------------------- Make directory and file structure RPM .spec block
                    625: sub make_directory_and_file_structure_spec_block {
                    626:     my ($dirs)=@_;
                    627:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    628:     foreach my $d (@$dirs) {
                    629: 	# set other values
                    630: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    631: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    632: 	# find files that are contained in this directory
                    633: 	my @files;
                    634: 	my @filesfull;
                    635: 	foreach my $f (@allfiles) {
                    636: 	    if ($f=~/^$d\/([^\/]+)$/) {
                    637: 		push @files,$1;
                    638: 		push @filesfull,$f;
                    639: 	    }
                    640: 	}
                    641: 	# render starting HTML formatting elements
                    642: 	if (@files) {
                    643: 	    $description.=<<END;
                    644: # $d $dirdescription
                    645: END
                    646:         }
                    647: 	if (@files) {
                    648:             foreach my $i (0..$#files) {
                    649: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    650: 		my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    651: 		my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    652: 		my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    653: 		my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    654: 		my $own=$devchown; $own=~s/\:/\,/;
                    655: 		my $config="";
                    656: 		$config="\%config " if $category eq 'conf';
                    657: 		$devchmod='-' if $category eq 'symbolic link';
                    658: 		$description.=<<END;
                    659: $config\%attr($devchmod,$own) /$filesfull[$i]
                    660: END
                    661: 	    }
                    662: 	}
                    663:     }
                    664:     return $description;
                    665: }
                    666: 
                    667: # ----------------------------------------------------------- End RPM .spec page
                    668: sub end_spec_page {
                    669: }
                    670: 
                    671: # ------------------------------------------------------- Begin description page
1.4       harris41  672: sub begin_description_page {
                    673:     my $description=<<END;
                    674: <HTML>
                    675: <HEAD>
                    676: <TITLE>LON-CAPA Software Description Page ($distribution, $date)</TITLE>
                    677: </HEAD>
                    678: <BODY>
                    679: <FONT SIZE=+2>LON-CAPA Software Description Page ($distribution, $date)</FONT>
                    680: <BR>Michigan State University
                    681: <BR>Learning Online with CAPA
                    682: <BR>Contact korte\@lon-capa.org
                    683: <UL>
                    684: <LI>About this file
                    685: <LI>Software Package Description
                    686: <LI>Directory Structure
1.7       harris41  687: <LI>File Type Ownership and Permissions
1.4       harris41  688: <LI>File and Directory Structure
                    689: </UL>
                    690: <FONT SIZE=+2>About this file</FONT>
                    691: <P>
                    692: This file is generated dynamically by <TT>parse.pl</TT> as
                    693: part of a development compilation process.  See 
                    694: http://install.lon-capa.org/compile/index.html for more
                    695: information.
                    696: </P>
                    697: END
                    698:     return $description;
                    699: }
                    700: 
                    701: # ------------------------------------------------- End description page
                    702: sub end_description_page {
                    703:     my $description=<<END;
                    704: <HR>
1.5       harris41  705: <FONT SIZE=-1>LON-CAPA Software Development Team</FONT>
1.4       harris41  706: </BODY>
                    707: </HTML>
                    708: END
                    709:     return $description;
                    710: }
                    711: 
                    712: # ------------------------------------------------- Make RPM description block
                    713: sub make_rpm_description_block {
                    714:     my $description=<<END;
                    715: <FONT SIZE=+2>Rolled in a RedHat 6.2 RPM, $date</FONT>
                    716: <P>
                    717: <TABLE BGCOLOR=#FFFFFF BORDER=0 CELLPADDING=10 CELLSPACING=0>
                    718: <TR><TD>
                    719: <PRE>
                    720: Name        : $info{'RPM'}{'Name'}
                    721: Version     : $info{'RPM'}{'Version'}
                    722: Vendor      : $info{'RPM'}{'Vendor'} 
                    723: Release     : $info{'RPM'}{'Release'}                             
                    724: Build Host  : $buildhost
                    725: Group       : $info{'RPM'}{'Group'}
                    726: License     : $info{'RPM'}{'Copyright'}
                    727: Summary     : $info{'RPM'}{'Summary'}
                    728: Description : 
                    729: $info{'RPM'}{'description'}
                    730: </PRE>
                    731: </TD></TR>
                    732: </TABLE>
                    733: </P>
                    734: END
                    735:     return $description;
                    736: }
                    737: 
                    738: # ----------------------------------------------- Determine directory structure
                    739: sub determine_directory_structure {
                    740:     my @directories=keys %{$info{'DIRECTORY'}{$distribution}};
                    741:     return (sort @directories);
                    742: }
1.1       harris41  743: 
1.4       harris41  744: 
                    745: # ---------------------------------- Make directory structure description block
                    746: sub make_directory_structure_description_block {
                    747:     my ($dirs)=@_;
                    748:     my $description=<<END;
                    749: <FONT SIZE=+2>Directory Structure Description, $date</FONT>
                    750: <P>
1.9       harris41  751: The directory structure description below shows only those
                    752: directories which either contain LON-CAPA specific files
                    753: or normally do not exist on a RedHat Linux system (and
                    754: must be generated to allow proper placement of files
                    755: during LON-CAPA run-time operation).
                    756: </P>
                    757: <P>
1.4       harris41  758: <TABLE BORDER=1 CELLPADDING=3 CELLSPACING=0>
                    759: END
                    760:     my $maxcount=0;
1.8       harris41  761:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
                    762:     my %diraccount; # hash to track which directories are accounted for
                    763:     foreach my $file (@allfiles) {
                    764: 	$file=~/^(.*)\/([^\/]+)$/;
                    765: 	$diraccount{$1}=1;
                    766:     }
1.4       harris41  767:     foreach my $d (@$dirs) {
                    768:         my (@matches)=($d=~/\//g);
                    769: 	my $count=scalar(@matches);
                    770: 	$maxcount=$count if $count>$maxcount;
1.8       harris41  771: 	delete $diraccount{$d};
1.4       harris41  772:     }
                    773:     $description.=<<END;
                    774: <TR>
                    775: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Category</TH>
                    776: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
                    777: <TH ALIGN=LEFT BGCOLOR=#FFFFFF><FONT COLOR=#FF0000>Development<BR>Permissions</FONT></TH>
                    778: END
                    779:     $description.="<TH ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+1).">Directory Path</TH>\n";
1.8       harris41  780:     if (keys %diraccount) {
                    781: 	$description.= "<TR><TD ALIGN=LEFT BGCOLOR=#FFFFFF COLSPAN=".($maxcount+4)."><I><PRE>Directories that are unaccounted for: \n";
                    782: 	foreach my $d (keys %diraccount) {
                    783: 	    $description.="$d\n";
                    784: 	}
                    785: 	$description.="</PRE></I></TH></TR>\n";
                    786:     }
1.4       harris41  787:     foreach my $d (@$dirs) {
                    788: 	my $dtable=$d;
                    789: 	$dtable=~s/\//\<\/TD\>\<TD\>/g;
                    790: 	my $category=$info{'DIRECTORY'}{$distribution}{$d}{'CATEGORY'};
                    791: 	my $chown=$info{'OWNERSHIP'}{$category}{'CHOWN'};
                    792: 	my $chmod=$info{'OWNERSHIP'}{$category}{'CHMOD'};
                    793: 	my $devchown=$info{'DEVOWNERSHIP'}{$category}{'CHOWN'};
                    794: 	my $devchmod=$info{'DEVOWNERSHIP'}{$category}{'CHMOD'};
                    795: 	$description.=<<END;
                    796: <TR>
                    797: <TD BGCOLOR=#FFFFFF>$category</TD>
                    798: <TD BGCOLOR=#FFFFFF><TT>$chmod $chown</TT></TD>
                    799: <TD BGCOLOR=#FFFFFF><FONT COLOR=#FF0000><TT>$devchmod $devchown</TT></FONT></TD>
                    800: <TD>
                    801: $dtable
                    802: </TD>
                    803: </TR>
                    804: END
                    805:     }
                    806:     $description.=<<END;
                    807: </TABLE>
                    808: </P>
                    809: END
                    810:     return $description;
                    811: }
                    812: 
1.6       harris41  813: # ------------------- Make file type ownership and permissions description block
                    814: sub make_file_type_ownership_and_permissions_description_block {
                    815:     my $description=<<END;
                    816: <FONT SIZE=+2>File Type Ownership and Permissions Descriptions, $date</FONT>
                    817: <P>
                    818: This table shows what permissions and ownership settings correspond
                    819: to each kind of file type.
                    820: </P>
                    821: <P>
                    822: <TABLE BORDER=1 CELLPADDING=5 WIDTH=60%>
                    823: <TR>
                    824: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Icon</TH>
                    825: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Type</TH>
                    826: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Permissions</TH>
                    827: <TH ALIGN=LEFT BGCOLOR=#FFFFFF>Development Permissions</TH>
                    828: </TR>
                    829: END
                    830:     foreach my $type (keys %{$info{'OWNERSHIP'}}) {
                    831: 	if (defined($fcm{$type})) {
                    832: 	    my $chmod=$info{'OWNERSHIP'}{$type}{'CHMOD'};
                    833: 	    my $chown=$info{'OWNERSHIP'}{$type}{'CHOWN'};
                    834: 	    my $devchmod=$info{'DEVOWNERSHIP'}{$type}{'CHMOD'};
                    835: 	    my $devchown=$info{'DEVOWNERSHIP'}{$type}{'CHOWN'};
                    836: 	    $description.=<<END;
                    837: <TR>
                    838: <TD><IMG SRC="$fcm{$type}.gif" ALT="$type"></TD>
                    839: <TD>$type</TD>
                    840: <TD><TT>$chmod $chown</TT></TD>
                    841: <TD><TT>$devchmod $devchown</TT></TD>
                    842: </TR>
                    843: END
                    844:         }
                    845:     }
                    846:     $description.=<<END;
                    847: </TABLE>
                    848: </P>
                    849: END
                    850: }
                    851: 
1.4       harris41  852: # ------------------------- Make directory and file structure description block
                    853: sub make_directory_and_file_structure_description_block {
                    854:     my ($dirs)=@_;
                    855:     my $description=<<END;
                    856: <FONT SIZE=+2>Directory and File Structure Description, $date</FONT>
1.6       harris41  857: <P>
                    858: The icons on the left column correspond to the file type
                    859: specified in the second column.  The last column "Notes" shows compilation,
1.7       harris41  860: dependency, and configuration information.  The CVS location
                    861: shows the location of the binary source file (if applicable) needed to
                    862: be copied to the target.  If the binary source file is not at
                    863: the specified location, then the text is shown in 
                    864: <FONT COLOR=#FF0000>red</FONT>.
1.6       harris41  865: </P>
1.4       harris41  866: <P>
1.9       harris41  867: <TABLE BORDER=1 CELLPADDING=5 WIDTH=500>
1.4       harris41  868: END
                    869:     my $counter=0;
                    870:     my @colorindex=("#80FF80","#80FFFF","#FFFF80");
1.5       harris41  871:     my @allfiles=keys %{$info{'LOCATION'}{$distribution}};
1.4       harris41  872:     foreach my $d (@$dirs) {
                    873: 	# set color
                    874: 	my $color=$colorindex[$counter%3];
                    875: 	# set other values
                    876: 	my $dirdescription=$info{'DIRECTORY'}{$distribution}{$d}{'DESCRIPTION'};
                    877: 	$dirdescription="(" . $dirdescription . ")" if $dirdescription;
                    878: 	# find subdirectories that are contained in this directory
                    879: 	my @subdirs;
                    880: 	foreach my $d2 (@$dirs) {
1.5       harris41  881: 	    if ($d2=~/^$d\/([^\/]+)$/) {
1.4       harris41  882: 		push @subdirs,$1;
                    883: 	    }
                    884: 	}
                    885: 	# find files that are contained in this directory
                    886: 	my @files;
1.5       harris41  887: 	my @filesfull;
1.4       harris41  888: 	foreach my $f (@allfiles) {
1.5       harris41  889: 	    if ($f=~/^$d\/([^\/]+)$/) {
1.4       harris41  890: 		push @files,$1;
1.5       harris41  891: 		push @filesfull,$f;
1.4       harris41  892: 	    }
                    893: 	}
                    894: 	# render starting HTML formatting elements
                    895: 	if (@subdirs || @files) {
                    896: 	    my $subdirstring="<BR>* Relevant subdirectories: " . join(", ",@subdirs) if @subdirs;
                    897: 	    $description.=<<END;
1.5       harris41  898: <TR><TD BGCOLOR=#000000 COLSPAN=6><FONT COLOR=$color><IMG SRC="directory.gif" ALT="directory">DIRECTORY -- $d $dirdescription
                    899: $subdirstring</FONT></TD></TR>
1.4       harris41  900: END
                    901:         }
                    902: 	else {
                    903: 	    $description.=<<END;
1.5       harris41  904: <TR><TD BGCOLOR=#000000 COLSPAN=6><FONT COLOR=$color><IMG SRC="emptydirectory.gif" ALT="empty directory">EMPTY DIRECTORY - $d $dirdescription</FONT></TD></TR>
1.4       harris41  905: END
                    906:         }
                    907: 	if (@files) {
                    908: 	    $description.=<<END;
                    909: <TR>
1.5       harris41  910: <TH BGCOLOR=$color ALIGN=LEFT COLSPAN=2>Type</TH>
                    911: <TH BGCOLOR=$color ALIGN=LEFT>File Name</TH>
                    912: <TH BGCOLOR=$color ALIGN=LEFT>Function</TH>
                    913: <TH BGCOLOR=$color ALIGN=LEFT>CVS Location</TH>
                    914: <TH BGCOLOR=$color ALIGN=LEFT>Notes</TH>
1.4       harris41  915: </TR>
                    916: END
1.5       harris41  917:             foreach my $i (0..$#files) {
                    918: 		my $category=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'CATEGORY'};
                    919: 		my $fdescription=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DESCRIPTION'};
                    920: 		my $source=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'SOURCE'};
1.9       harris41  921: 		my $note=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'NOTE'};
                    922: 		$note.="<BR>" if $note;
                    923: 		my $listing=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'FILES'};
                    924: 		my @E=split(/\s+/,$listing);
                    925: 		$source=~/(.*)\/[^\/]+$/;
                    926: 		my $sd=$1;
                    927: 		my $eflag=0;
                    928: 		foreach my $e (@E) {
                    929: 		    unless (-e "../../$sd/$e") {
                    930: 			$e="<FONT COLOR=#FF0000>$e</FONT>";
                    931: 			$eflag=1;
                    932: 		    }
                    933: 		}
                    934: 		$listing=join("\n",@E);
                    935: 		$listing="<B>listing</B><BR><FONT SIZE=-2>$listing</FONT>" if $listing;
                    936: 		$listing.="<BR>" if $listing;
                    937: 		my $build=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'BUILD'};
                    938: 		$build="<B>build</B><BR>$build" if $build;
                    939: 		$build.="<BR>" if $build;
                    940: 		my $dependencies=$info{'LOCATION'}{$distribution}{$filesfull[$i]}{'DEPENDENCIES'};
                    941: 		$dependencies="<B>dependencies</B><BR>$dependencies" if $dependencies;
                    942: 		$dependencies.="<BR>" if $dependencies;
1.7       harris41  943: 		unless (-e "../../$source") {
                    944: 		    $source=~/([^\/]+)$/;
                    945: 		    my $s=$1;
1.9       harris41  946: 		    if ($source!~/\*/) {
                    947: 			$source="<FONT COLOR=#FF0000>$source</FONT>";
                    948: 		    }
                    949: 		    elsif ($eflag) {
                    950: 			$source="<FONT COLOR=#FF0000>$source</FONT>";
                    951: 		    }
1.7       harris41  952: 		}
1.5       harris41  953: 		$description.=<<END;
                    954: <TR>
                    955: <TD BGCOLOR=#A0A0A0><IMG SRC="$fcm{$category}.gif" ALT="$category"></TD>
                    956: <TD BGCOLOR=$color>$category</TD>
                    957: <TD BGCOLOR=$color>$files[$i]</TD>
                    958: <TD BGCOLOR=$color>$fdescription&nbsp;</TD>
                    959: <TD BGCOLOR=$color>$source</TD>
1.9       harris41  960: <TD BGCOLOR=$color>$note$listing$build$dependencies&nbsp;</TD>
1.4       harris41  961: </TR>
                    962: END
1.5       harris41  963: 	    }
                    964: 	}
1.4       harris41  965: 	$counter++;
                    966:     }
                    967:     $description.=<<END;
                    968: </TABLE>
                    969: </P>
                    970: END
                    971:     return $description;
                    972: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>