Diff for /loncom/build/lpml_parse.pl between versions 1.11 and 1.29

version 1.11, 2001/09/17 20:44:38 version 1.29, 2001/12/07 04:45:16
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
   
 # Scott Harrison  # The LearningOnline Network with CAPA
   # lpml_parse.pl - Linux Packaging Markup Language parser
   #
   # $Id$
   #
   # Written by Scott Harrison, harris41@msu.edu
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # YEAR=2001  # YEAR=2001
 # May 2001  # May 2001
 # 06/19/2001,06/20,06/24 - Scott Harrison  # 06/19/2001,06/20,06/24 - Scott Harrison
 # 9/5/2001,9/6,9/7,9/8 - Scott Harrison  # 9/5/2001,9/6,9/7,9/8 - Scott Harrison
   # 9/17,9/18 - Scott Harrison
   # 11/4,11/5,11/6,11/7,11/16,11/17 - Scott Harrison
   # 12/2,12/3,12/4,12/5,12/6 - Scott Harrison
   #
   ###
   
 ###############################################################################  ###############################################################################
 ##                                                                           ##  ##                                                                           ##
Line 14 Line 47
 ## 3. First pass through (grab distribution-specific information)            ##  ## 3. First pass through (grab distribution-specific information)            ##
 ## 4. Second pass through (parse out what is not necessary)                  ##  ## 4. Second pass through (parse out what is not necessary)                  ##
 ## 5. Third pass through (translate markup according to specified mode)      ##  ## 5. Third pass through (translate markup according to specified mode)      ##
   ## 6. Functions (most all just format contents of different markup tags)     ##
   ## 7. POD (plain old documentation, CPAN style)                              ##
 ##                                                                           ##  ##                                                                           ##
 ###############################################################################  ###############################################################################
   
Line 42  Only the 1st argument is mandatory for t Line 77  Only the 1st argument is mandatory for t
 Example:  Example:
   
 cat ../../doc/loncapafiles.lpml |\\  cat ../../doc/loncapafiles.lpml |\\
 perl lpml_parse.pl html default /home/sherbert/loncapa /tmp/install  perl lpml_parse.pl html development default /home/sherbert/loncapa /tmp/install
 END  END
   
 # ------------------------------------------------- Grab command line arguments  # ------------------------------------------------- Grab command line arguments
Line 70  if (@ARGV) { Line 105  if (@ARGV) {
   
 my $targetroot;  my $targetroot;
 my $sourceroot;  my $sourceroot;
   my $targetrootarg;
   my $sourcerootarg;
 if (@ARGV) {  if (@ARGV) {
     $sourceroot = shift @ARGV;      $sourceroot = shift @ARGV;
 }  }
Line 78  if (@ARGV) { Line 115  if (@ARGV) {
 }  }
 $sourceroot=~s/\/$//;  $sourceroot=~s/\/$//;
 $targetroot=~s/\/$//;  $targetroot=~s/\/$//;
   $sourcerootarg=$sourceroot;
   $targetrootarg=$targetroot;
   
   my $logcmd='| tee -a WARNINGS';
   
 my $invocation;  my $invocation;
 # --------------------------------------------------- Record program invocation  # --------------------------------------------------- Record program invocation
 if ($mode eq 'install') {  if ($mode eq 'install' or $mode eq 'configinstall' or $mode eq 'build') {
     $invocation=(<<END);      $invocation=(<<END);
 # Invocation: STDINPUT | lpml_parse.pl  # Invocation: STDINPUT | lpml_parse.pl
 #             1st argument (mode) is: $mode  #             1st argument (mode) is: $mode
Line 184  $cleanstring=~s/\>\s*\n\s*\</\>\</g; Line 225  $cleanstring=~s/\>\s*\n\s*\</\>\</g;
 # storage variables  # storage variables
 my $lpml;  my $lpml;
 my $categories;  my $categories;
   my @categorynamelist;
 my $category;  my $category;
 my $category_att_name;  my $category_att_name;
 my $category_att_type;  my $category_att_type;
 my $chown;  my $chown;
 my $chmod;  my $chmod;
   my $abbreviation; # space-free abbreviation; esp. for image names
 my $rpm;  my $rpm;
 my $rpmSummary;  my $rpmSummary;
 my $rpmName;  my $rpmName;
Line 220  my $target; Line 263  my $target;
 my $source;  my $source;
 my $note;  my $note;
 my $build;  my $build;
   my $buildlink;
 my $commands;  my $commands;
 my $command;  my $command;
 my $status;  my $status;
Line 227  my $dependencies; Line 271  my $dependencies;
 my $dependency;  my $dependency;
 my @links;  my @links;
 my %categoryhash;  my %categoryhash;
   my $dpathlength;
   my %fab; # file category abbreviation
   my $directory_count;
   my $file_count;
   my $link_count;
   my $fileglob_count;
   my $fileglobnames_count;
   my %categorycount;
   # START TEMP WAY
   #my %bytecount;  # TEMP WAY TO COUNT INFORMATION
   #my %linecount;  # TEMP WAY TO COUNT INFORMATION
   # END TEMP WAY
   
 my @buildall;  my @buildall;
   my @buildinfo;
   
   my @configall;
   
 # Make new parser with distribution specific input  # Make new parser with distribution specific input
 undef $parser;  undef $parser;
Line 237  $parser = HTML::TokeParser->new(\$cleans Line 296  $parser = HTML::TokeParser->new(\$cleans
 $parser->xml_mode('1');  $parser->xml_mode('1');
   
 # Define handling methods for mode-dependent text rendering  # Define handling methods for mode-dependent text rendering
   
 $parser->{textify}={  $parser->{textify}={
     targetroot => \&format_targetroot,      targetroot => \&format_targetroot,
     sourceroot => \&format_sourceroot,      sourceroot => \&format_sourceroot,
     categories => \&format_categories,      categories => \&format_categories,
     category => \&format_category,      category => \&format_category,
       abbreviation => \&format_abbreviation,
     targetdir => \&format_targetdir,      targetdir => \&format_targetdir,
     chown => \&format_chown,      chown => \&format_chown,
     chmod => \&format_chmod,      chmod => \&format_chmod,
Line 274  $parser->{textify}={ Line 335  $parser->{textify}={
     build => \&format_build,      build => \&format_build,
     status => \&format_status,      status => \&format_status,
     dependencies => \&format_dependencies,      dependencies => \&format_dependencies,
       buildlink => \&format_buildlink,
     glob => \&format_glob,      glob => \&format_glob,
     sourcedir => \&format_sourcedir,      sourcedir => \&format_sourcedir,
     filenames => \&format_filenames,      filenames => \&format_filenames,
Line 298  while ($token = $parser->get_tag('lpml') Line 360  while ($token = $parser->get_tag('lpml')
 }  }
 exit;  exit;
   
   # ---------- Functions (most all just format contents of different markup tags)
   
   # ------------------------ Final output at end of markup parsing and formatting
 sub end {  sub end {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return "<br />THE END\n";   # START TEMP WAY
   # my $totallinecount;
   # my $totalbytecount;
   # map {$totallinecount+=$linecount{$_};
   #     $totalbytecount+=$bytecount{$_}}
   #  @categorynamelist;
           # END TEMP WAY
    return "<br />&nbsp;<br />".
       "<a name='summary' /><font size='+2'>Summary of Source Repository".
       "</font>".
       "<br />&nbsp;<br />".
       "<table border='1' cellpadding='5'>".
       "<caption>Files, Directories, and Symbolic Links</caption>".
       "<tr><td>Files (not referenced by globs)</td><td>$file_count</td>".
       "</tr>".
       "<tr><td>Files (referenced by globs)</td>".
       "<td>$fileglobnames_count</td>".
       "</tr>".
       "<tr><td>Total Files</td>".
       "<td>".($fileglobnames_count+$file_count)."</td>".
       "</tr>".
       "<tr><td>File globs</td>".
       "<td>".$fileglob_count."</td>".
       "</tr>".
       "<tr><td>Directories</td>".
       "<td>".$directory_count."</td>".
       "</tr>".
       "<tr><td>Symbolic links</td>".
       "<td>".$link_count."</td>".
       "</tr>".
       "</table>".
       "<table border='1' cellpadding='5'>".
       "<caption>File Category Count</caption>".
       "<tr><th>Icon</th><th>Name</th><th>Number of Occurrences</th>".
       join("\n",(map {"<tr><td><img src='$fab{$_}.gif' ".
    "alt='$_ icon' /></td>".
             "<td>$_</td><td>$categorycount{$_}</td></tr>"}
    @categorynamelist)).
       "</table>".
       "</body></html>\n";
   
   # START TEMP WAY
   #    join("\n",(map {"<tr><td><img src='$fab{$_}.gif' ".
   # "alt='$_ icon' /></td>".
   #         "<td>$_</td><td>$categorycount{$_}</td><td>$linecount{$_}</td><td>$bytecount{$_}</td></tr>"}
   # @categorynamelist)).
   #    "<br />&nbsp;<br />".
   #    "Total Lines of Code: $totallinecount".
   #    "<br />&nbsp;<br />".
   #    "Total Bytes: $totalbytecount".
   # END TEMP WAY
     }      }
     if ($mode eq 'install') {      if ($mode eq 'install') {
  return '';   return '';
Line 319  sub format_lpml { Line 434  sub format_lpml {
     my (@tokeninfo)=@_;      my (@tokeninfo)=@_;
     my $date=`date`; chop $date;      my $date=`date`; chop $date;
     if ($mode eq 'html') {      if ($mode eq 'html') {
  $lpml = "<br />LPML BEGINNING: $date";   $lpml=<<END;
   <html>
   <head>
   <title>LPML Description Page
   (dist=$dist, categorytype=$categorytype, $date)</title>
   </head>
   <body>
   END
    $lpml .= "<br /><font size='+2'>LPML Description Page (dist=$dist, ".
       "categorytype=$categorytype, $date)".
       "</font>";
    $lpml .=<<END;
   <ul>
   <li><a href='#about'>About this file</a></li>
   <li><a href='#ownperms'>File Type Ownership and Permissions
   Descriptions</a></li>
   <li><a href='#package'>Software Package Description</a></li>
   <li><a href='#directories'>Directory Structure</a></li>
   <li><a href='#files'>Files</a></li>
   <li><a href='#summary'>Summary of Source Repository</a></li>
   </ul>
   END
           $lpml .=<<END;
   <br />&nbsp;<br /><a name='about' />
   <font size='+2'>About this file</font>
   <p>
   This file is generated dynamically by <tt>lpml_parse.pl</tt> as
   part of a development compilation process.</p>
   <p>LPML written by Scott Harrison (harris41\@msu.edu).
   </p>
   END
       }
       elsif ($mode eq 'text') {
    $lpml = "LPML Description Page (dist=$dist, $date)";
    $lpml .=<<END;
   
   * About this file
   * Software Package Description
   * Directory Structure
   * File Type Ownership and Permissions
   * Files
   END
           $lpml .=<<END;
   
   About this file
   
   This file is generated dynamically by lpml_parse.pl as
   part of a development compilation process.  Author: Scott
   Harrison (harris41\@msu.edu).
   
   END
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install') {
  print '# LPML install targets. Linux Packaging Markup Language,';   print '# LPML install targets. Linux Packaging Markup Language,';
  print ' by Scott Harrison 2001'."\n";   print ' by Scott Harrison 2001'."\n";
  print '# This file was automatically generated on '.`date`;   print '# This file was automatically generated on '.`date`;
  print "\n".$invocation;   print "\n".$invocation;
    $lpml .= "SHELL=\"/bin/bash\"\n\n";
       }
       elsif ($mode eq 'configinstall') {
    print '# LPML configuration file targets (configinstall).'."\n";
    print '# Linux Packaging Markup Language,';
    print ' by Scott Harrison 2001'."\n";
    print '# This file was automatically generated on '.`date`;
    print "\n".$invocation;
    $lpml .= "SHELL=\"/bin/bash\"\n\n";
     }      }
     elsif ($mode eq 'build') {      elsif ($mode eq 'build') {
  $lpml = "# Dynamic Makefile generated by LON-CAPA build process\n";   $lpml = "# LPML build targets. Linux Packaging Markup Language,";
    $lpml .= ' by Scott Harrison 2001'."\n";
  $lpml .= '# This file was automatically generated on '.`date`;   $lpml .= '# This file was automatically generated on '.`date`;
  $lpml .= "\n";   $lpml .= "\n".$invocation;
  $lpml .= "SHELL=\"/bin/sh\"\n\n";   $lpml .= "SHELL=\"/bin/sh\"\n\n";
     }      }
     else {      else {
Line 345  sub format_targetroot { Line 520  sub format_targetroot {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $targetroot="\n<br />TARGETROOT: $text";   return $targetroot="\n<br />TARGETROOT: $text";
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install' or $mode eq 'build' or
  return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n";     $mode eq 'configinstall') {
     }  
     elsif ($mode eq 'build') {  
  return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n";   return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n";
     }      }
     else {      else {
Line 363  sub format_sourceroot { Line 536  sub format_sourceroot {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $sourceroot="\n<br />SOURCEROOT: $text";   return $sourceroot="\n<br />SOURCEROOT: $text";
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install' or $mode eq 'build' or
  return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";;     $mode eq 'configinstall') {
     }  
     elsif ($mode eq 'build') {  
  return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";;   return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";;
     }      }
     else {      else {
Line 378  sub format_categories { Line 549  sub format_categories {
     my $text=&trim($parser->get_text('/categories'));      my $text=&trim($parser->get_text('/categories'));
     $parser->get_tag('/categories');      $parser->get_tag('/categories');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $categories="\n<br />BEGIN CATEGORIES\n$text\n".   return $categories="\n<br />&nbsp;<br />".
     "<br />END CATEGORIES\n";      "\n<a name='ownperms'>".
       "\n<font size='+2'>File Type Ownership and Permissions".
       " Descriptions</font>".
       "\n<p>This table shows what permissions and ownership settings ".
       "correspond to each category.</p>".
       "\n<table border='1' cellpadding='5' width='60%'>\n".
       "<tr>".
       "<th align='left' bgcolor='#ffffff'>Icon</th>".
       "<th align='left' bgcolor='#ffffff'>Category Name</th>".
       "<th align='left' bgcolor='#ffffff'>Permissions ".
       "($categorytype)</th>".
       "</tr>".
       "\n$text\n".
       "</table>\n";
       }
       elsif ($mode eq 'text') {
    return $categories="\n".
       "\nFile Type Ownership and Permissions".
       " Descriptions".
       "\n$text".
       "\n";
     }      }
     else {      else {
  return '';   return '';
Line 390  sub format_category { Line 581  sub format_category {
     my (@tokeninfo)=@_;      my (@tokeninfo)=@_;
     $category_att_name=$tokeninfo[2]->{'name'};      $category_att_name=$tokeninfo[2]->{'name'};
     $category_att_type=$tokeninfo[2]->{'type'};      $category_att_type=$tokeninfo[2]->{'type'};
     $chmod='';$chown='';      $abbreviation=''; $chmod='';$chown='';
     $parser->get_text('/category');      $parser->get_text('/category');
     $parser->get_tag('/category');      $parser->get_tag('/category');
       $fab{$category_att_name}=$abbreviation;
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $category="\n<br />CATEGORY $category_att_name ".   if ($category_att_type eq $categorytype) {
     "$category_att_type $chmod $chown";      push @categorynamelist,$category_att_name;
       $categoryhash{$category_att_name}="$chmod $chown";
       return $category="<tr>".
    "<td><img src='$abbreviation.gif' ".
              "alt='${category_att_name}' /></td>\n".
    "<td>${category_att_name}</td>\n".
    "<td>$chmod $chown</td>\n".
    "</tr>".
    "\n";
   # return $category="\n<br />CATEGORY $category_att_name ".
   #    "$category_att_type $chmod $chown";
    }
     }      }
     else {      else {
  if ($category_att_type eq $categorytype) {   if ($category_att_type eq $categorytype) {
Line 406  sub format_category { Line 609  sub format_category {
  return '';   return '';
     }      }
 }  }
   # --------------------------------------------------- Format categories section
   sub format_abbreviation {
       my @tokeninfo=@_;
       $abbreviation='';
       my $text=&trim($parser->get_text('/abbreviation'));
       if ($text) {
    $parser->get_tag('/abbreviation');
    $abbreviation=$text;
       }
       return '';
   }
 # -------------------------------------------------------- Format chown section  # -------------------------------------------------------- Format chown section
 sub format_chown {  sub format_chown {
     my @tokeninfo=@_;      my @tokeninfo=@_;
Line 433  sub format_rpm { Line 647  sub format_rpm {
     my $text=&trim($parser->get_text('/rpm'));      my $text=&trim($parser->get_text('/rpm'));
     $parser->get_tag('/rpm');      $parser->get_tag('/rpm');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpm="\n<br />BEGIN RPM\n$text\n<br />END RPM";   return $rpm=<<END;
   <br />&nbsp;<br />
   <a name='package' />
   <font size='+2'>Software Package Description</font>
   <p>
   <table bgcolor='#ffffff' border='0' cellpadding='10' cellspacing='0'>
   <tr><td><pre>
   $text
   </pre></td></tr>
   </table>
   END
       }
       elsif ($mode eq 'text') {
    return $rpm=<<END;
   Software Package Description
   
   $text
   END
     }      }
     else {      else {
  return '';   return '';
Line 444  sub format_rpmSummary { Line 675  sub format_rpmSummary {
     my $text=&trim($parser->get_text('/rpmSummary'));      my $text=&trim($parser->get_text('/rpmSummary'));
     $parser->get_tag('/rpmSummary');      $parser->get_tag('/rpmSummary');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmSummary="\n<br />RPMSUMMARY $text";   return $rpmSummary="\nSummary     : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmSummary="\nSummary     : $text";
     }      }
     else {      else {
  return '';   return '';
Line 455  sub format_rpmName { Line 689  sub format_rpmName {
     my $text=&trim($parser->get_text('/rpmName'));      my $text=&trim($parser->get_text('/rpmName'));
     $parser->get_tag('/rpmName');      $parser->get_tag('/rpmName');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmName="\n<br />RPMNAME $text";   return $rpmName="\nName        : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmName="\nName        : $text";
     }      }
     else {      else {
  return '';   return '';
Line 466  sub format_rpmVersion { Line 703  sub format_rpmVersion {
     my $text=$parser->get_text('/rpmVersion');      my $text=$parser->get_text('/rpmVersion');
     $parser->get_tag('/rpmVersion');      $parser->get_tag('/rpmVersion');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmVersion="\n<br />RPMVERSION $text";   return $rpmVersion="\nVersion     : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmVersion="\nVersion     : $text";
     }      }
     else {      else {
  return '';   return '';
Line 477  sub format_rpmRelease { Line 717  sub format_rpmRelease {
     my $text=$parser->get_text('/rpmRelease');      my $text=$parser->get_text('/rpmRelease');
     $parser->get_tag('/rpmRelease');      $parser->get_tag('/rpmRelease');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmRelease="\n<br />RPMRELEASE $text";   return $rpmRelease="\nRelease     : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmRelease="\nRelease     : $text";
     }      }
     else {      else {
  return '';   return '';
Line 488  sub format_rpmVendor { Line 731  sub format_rpmVendor {
     my $text=$parser->get_text('/rpmVendor');      my $text=$parser->get_text('/rpmVendor');
     $parser->get_tag('/rpmVendor');      $parser->get_tag('/rpmVendor');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmVendor="\n<br />RPMVENDOR $text";   return $rpmVendor="\nVendor      : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmVendor="\nVendor      : $text";
     }      }
     else {      else {
  return '';   return '';
Line 499  sub format_rpmBuildRoot { Line 745  sub format_rpmBuildRoot {
     my $text=$parser->get_text('/rpmBuildRoot');      my $text=$parser->get_text('/rpmBuildRoot');
     $parser->get_tag('/rpmBuildRoot');      $parser->get_tag('/rpmBuildRoot');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmBuildRoot="\n<br />RPMBUILDROOT $text";   return $rpmBuildRoot="\nBuild Root  : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmBuildRoot="\nBuild Root  : $text";
     }      }
     else {      else {
  return '';   return '';
Line 510  sub format_rpmCopyright { Line 759  sub format_rpmCopyright {
     my $text=$parser->get_text('/rpmCopyright');      my $text=$parser->get_text('/rpmCopyright');
     $parser->get_tag('/rpmCopyright');      $parser->get_tag('/rpmCopyright');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmCopyright="\n<br />RPMCOPYRIGHT $text";   return $rpmCopyright="\nLicense     : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmCopyright="\nLicense     : $text";
     }      }
     else {      else {
  return '';   return '';
Line 521  sub format_rpmGroup { Line 773  sub format_rpmGroup {
     my $text=$parser->get_text('/rpmGroup');      my $text=$parser->get_text('/rpmGroup');
     $parser->get_tag('/rpmGroup');      $parser->get_tag('/rpmGroup');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmGroup="\n<br />RPMGROUP $text";   return $rpmGroup="\nGroup       : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmGroup="\nGroup       : $text";
     }      }
     else {      else {
  return '';   return '';
Line 532  sub format_rpmSource { Line 787  sub format_rpmSource {
     my $text=$parser->get_text('/rpmSource');      my $text=$parser->get_text('/rpmSource');
     $parser->get_tag('/rpmSource');      $parser->get_tag('/rpmSource');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmSource="\n<br />RPMSOURCE $text";   return $rpmSource="\nSource      : $text";
       }
       elsif ($mode eq 'text') {
    return $rpmSource="\nSource      : $text";
     }      }
     else {      else {
  return '';   return '';
Line 543  sub format_rpmAutoReqProv { Line 801  sub format_rpmAutoReqProv {
     my $text=$parser->get_text('/rpmAutoReqProv');      my $text=$parser->get_text('/rpmAutoReqProv');
     $parser->get_tag('/rpmAutoReqProv');      $parser->get_tag('/rpmAutoReqProv');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmAutoReqProv="\n<br />RPMAUTOREQPROV $text";   return $rpmAutoReqProv="\nAutoReqProv : $text";
       }
       if ($mode eq 'text') {
    return $rpmAutoReqProv="\nAutoReqProv : $text";
     }      }
     else {      else {
  return '';   return '';
Line 554  sub format_rpmdescription { Line 815  sub format_rpmdescription {
     my $text=$parser->get_text('/rpmdescription');      my $text=$parser->get_text('/rpmdescription');
     $parser->get_tag('/rpmdescription');      $parser->get_tag('/rpmdescription');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmdescription="\n<br />RPMDESCRIPTION $text";   $text=~s/\n//g;
    $text=~s/\\n/\n/g;
    return $rpmdescription="\nDescription : $text";
       }
       elsif ($mode eq 'text') {
    $text=~s/\n//g;
    $text=~s/\\n/\n/g;
    return $rpmdescription="\nDescription : $text";
     }      }
     else {      else {
  return '';   return '';
Line 565  sub format_rpmpre { Line 833  sub format_rpmpre {
     my $text=$parser->get_text('/rpmpre');      my $text=$parser->get_text('/rpmpre');
     $parser->get_tag('/rpmpre');      $parser->get_tag('/rpmpre');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmpre="\n<br />RPMPRE $text";  # return $rpmpre="\n<br />RPMPRE $text";
    return '';
     }      }
     else {      else {
  return '';   return '';
Line 576  sub format_directories { Line 845  sub format_directories {
     my $text=$parser->get_text('/directories');      my $text=$parser->get_text('/directories');
     $parser->get_tag('/directories');      $parser->get_tag('/directories');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $directories="\n<br />BEGIN DIRECTORIES\n$text\n<br />".   $text=~s/\[\{\{\{\{\{DPATHLENGTH\}\}\}\}\}\]/$dpathlength/g;
     "END DIRECTORIES\n";   return $directories="\n<br />&nbsp;<br />".
       "<a name='directories' />".
       "<font size='+2'>Directory Structure</font>".
       "\n<br />&nbsp;<br />".
       "<table border='1' cellpadding='3' cellspacing='0'>\n".
       "<tr><th bgcolor='#ffffff'>Category</th>".
       "<th bgcolor='#ffffff'>Status</th>\n".
       "<th bgcolor='#ffffff'>Expected Permissions & Ownership</th>\n".
       "<th bgcolor='#ffffff' colspan='$dpathlength'>Target Directory ".
       "Path</th></tr>\n".
        "\n$text\n</table><br />"."\n";
       }
       elsif ($mode eq 'text') {
    return $directories="\nDirectory Structure\n$text\n".
       "\n";
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install') {
  return "\n".'directories:'."\n".$text;   return "\n".'directories:'."\n".$text;
Line 592  sub format_directory { Line 875  sub format_directory {
     $targetdir='';$categoryname='';$description='';      $targetdir='';$categoryname='';$description='';
     $parser->get_text('/directory');      $parser->get_text('/directory');
     $parser->get_tag('/directory');      $parser->get_tag('/directory');
       $directory_count++;
       $categorycount{$categoryname}++;
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $directory="\n<br />DIRECTORY $targetdir $categoryname ".   my @a;
    @a=($targetdir=~/\//g);
    my $d=scalar(@a)+1;
    $dpathlength=$d if $d>$dpathlength;
    my $thtml=$targetdir;
    $thtml=~s/\//\<\/td\>\<td bgcolor='#ffffff'\>/g;
    my ($chmod,$chown)=split(/\s/,$categoryhash{$categoryname});
    return $directory="\n<tr><td rowspan='2' bgcolor='#ffffff'>".
       "$categoryname</td>".
       "<td rowspan='2' bgcolor='#ffffff'><!-- POSTEVAL verify.pl directory /$targetdir $categoryhash{$categoryname} -->&nbsp;</td>".
       "<td rowspan='2' bgcolor='#ffffff'>$chmod<br />$chown</td>".
       "<td bgcolor='#ffffff'>$thtml</td></tr>".
       "<tr><td bgcolor='#ffffff' colspan='[{{{{{DPATHLENGTH}}}}}]'>".
       "$description</td></tr>";
       }
       if ($mode eq 'text') {
    return $directory="\nDIRECTORY $targetdir $categoryname ".
     "$description";      "$description";
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install') {
Line 642  sub format_files { Line 943  sub format_files {
     my $text=$parser->get_text('/files');      my $text=$parser->get_text('/files');
     $parser->get_tag('/files');      $parser->get_tag('/files');
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $directories="\n<br />BEGIN FILES\n$text\n<br />END FILES\n";   return $directories="\n<br />&nbsp;<br />".
       "<a name='files' />".
       "<font size='+2'>Files</font><br />&nbsp;<br />".
       "<p>All source and target locations are relative to the ".
       "sourceroot and targetroot values at the beginning of this ".
       "document.</p>".
       "\n<table border='1' cellpadding='5'>".
       "<tr><th>Status</th><th colspan='2'>Category</th>".
       "<th>Name/Location</th>".
       "<th>Description</th><th>Notes</th></tr>".
       "$text</table>\n".
       "\n";
       }
       elsif ($mode eq 'text') {
    return $directories="\n".
       "File and Directory Structure".
       "\n$text\n".
       "\n";
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install') {
  return "\n".'files:'."\n".$text.   return "\n".'files:'."\n".$text.
     "\n".'links:'."\n".join('',@links);      "\n".'links:'."\n".join('',@links);
     }      }
       elsif ($mode eq 'configinstall') {
    return "\n".'configfiles: '.
    join(' ',@configall).
    "\n\n".$text.
    "\n\nalwaysrun:\n\n";
       }
     elsif ($mode eq 'build') {      elsif ($mode eq 'build') {
  my $binfo;   my $binfo;
  my $tword;   my $tword;
  my $command2;   my $command2;
  my @deps;   my @deps;
  foreach my $bi (@buildinfo) {   foreach my $bi (@buildinfo) {
     my ($source,$command,$trigger,@deps)=split(/\;/,$bi);      my ($target,$source,$command,$trigger,@deps)=split(/\;/,$bi);
     $tword=''; $tword=' alwaysrun' if $trigger eq 'always run';       $tword=''; $tword=' alwaysrun' if $trigger eq 'always run'; 
     $command=~s/\/([^\/]*)$//;      $command=~s/\/([^\/]*)$//;
     $command2="cd $command; sh ./$1;\\";      $command2="cd $command; sh ./$1;\\";
     my $depstring;      my $depstring;
       my $depstring2="\t\t\@echo '';\\\n";
       my $olddep;
     foreach my $dep (@deps) {      foreach my $dep (@deps) {
    unless ($olddep) {
       $olddep=$deps[$#deps];
    }
  $depstring.="\telif !(test -r $command/$dep);\\\n";   $depstring.="\telif !(test -r $command/$dep);\\\n";
  $depstring.="\t\tthen echo ".   $depstring.="\t\tthen echo ".
  "\"**** LON-CAPA WARNING **** missing the file: ".   "\"**** WARNING **** missing the file: ".
          "$command/$dep\";\\\n";           "$command/$dep\"$logcmd;\\\n";
    $depstring.="\t\ttest -e $source || test -e $target || echo ".
       "'**** ERROR **** neither source=$source nor target=".
       "$target exist and they cannot be built'$logcmd;\\\n";
    $depstring.="\t\tmake -f Makefile.build ${source}___DEPS;\\\n";
    if ($olddep) {
       $depstring2.="\t\tECODE=0;\\\n";
       $depstring2.="\t\t! test -e $source && test -r $command/$olddep &&".
    " { perl filecompare.pl -b2 $command/$olddep $target ||  ECODE=\$\$?; } && { [ \$\$ECODE != \"2\" ] || echo \"**** WARNING **** dependency $command/$olddep is newer than target file $target; SOMETHING MAY BE WRONG\"$logcmd; };\\\n";
    }
    $olddep=$dep;
     }      }
     $binfo.="$source: $tword\n".      $binfo.="$source: $tword\n".
  "\t\@if !(echo \"\");\\\n\t\tthen echo ".   "\t\@if !(echo \"\");\\\n\t\tthen echo ".
  "\"**** LON-CAPA WARNING **** Strange shell. ".   "\"**** WARNING **** Strange shell. ".
          "Check your path settings.\";\\\n".           "Check your path settings.\"$logcmd;\\\n".
  $depstring.   $depstring.
  "\telse \\\n\t\t$command2\n\tfi\n\n";   "\telse \\\n\t\t$command2\n\tfi\n\n";
       $binfo.="${source}___DEPS:\n".$depstring2."\t\tECODE=0;\n\n";
  }   }
  return 'all: '.join(' ',@buildall)."\n\n".   return 'all: '.join(' ',@buildall)."\n\n".
          $text.           $text.
Line 706  sub format_file { Line 1046  sub format_file {
     $file=''; $source=''; $target=''; $categoryname=''; $description='';      $file=''; $source=''; $target=''; $categoryname=''; $description='';
     $note=''; $build=''; $status=''; $dependencies='';      $note=''; $build=''; $status=''; $dependencies='';
     my $text=&trim($parser->get_text('/file'));      my $text=&trim($parser->get_text('/file'));
       my $buildtest;
       $file_count++;
       $categorycount{$categoryname}++;
       # START TEMP WAY
   #    if (-T "$sourcerootarg/$source") {
   # $linecount{$categoryname}+=`wc -l $sourcerootarg/$source`;
   #    }
   #    my $bytesize=(-s "$sourcerootarg/$source");
   #    $bytecount{$categoryname}+=$bytesize;
       # END TEMP WAY
     if ($source) {      if ($source) {
  $parser->get_tag('/file');   $parser->get_tag('/file');
  if ($mode eq 'html') {   if ($mode eq 'html') {
     return ($file="\n<br />BEGIN FILE\n".      return ($file="\n<!-- FILESORT:$target -->".
  "$source $target $categoryname $description $note " .      "<tr>".
  "$build $status $dependencies" .      "<td><!-- POSTEVAL verify.pl file '$sourcerootarg' ".
  "\nEND FILE");      "'$targetrootarg' ".
       "'$source' '$target' ".
       "$categoryhash{$categoryname} -->&nbsp;</td><td>".
       "<img src='$fab{$categoryname}.gif' ".
       "alt='$categoryname icon' /></td>".
       "<td>$categoryname<br /><font size='-1'>".
       $categoryhash{$categoryname}."</font></td>".
       "<td>SOURCE: $source<br />TARGET: $target</td>".
       "<td>$description</td>".
       "<td>$note</td>".
       "</tr>");
   #    return ($file="\n<br />BEGIN FILE\n".
   # "$source $target $categoryname $description $note " .
   # "$build $status $dependencies" .
   # "\nEND FILE");
  }   }
  elsif ($mode eq 'install' && $categoryname ne 'conf') {   elsif ($mode eq 'install' && $categoryname ne 'conf') {
     return "\t".'@test -e '.$sourceroot.'/'.$source.      if ($build) {
  ' && install '.   my $bi=$sourceroot.'/'.$source.';'.$build.';'.
  $categoryhash{$categoryname}.' '.      $dependencies;
    my ($source2,$command,$trigger,@deps)=split(/\;/,$bi);
    $tword=''; $tword=' alwaysrun' if $trigger eq 'always run'; 
    $command=~s/\/([^\/]*)$//;
    $command2="cd $command; sh ./$1;\\";
    my $depstring;
    foreach my $dep (@deps) {
       $depstring.=<<END;
    ECODE=0; DEP=''; \\
    test -e $command/$dep || (echo '**** WARNING **** cannot evaluate status of dependency $command/$dep (for building ${sourceroot}/${source} with)'$logcmd); DEP="1"; \\
    [ -n DEP ] && { perl filecompare.pl -b2 $command/$dep ${targetroot}/${target} || ECODE=\$\$?; } || DEP="1"; \\
    case "\$\$ECODE" in \\
    2) echo "**** WARNING **** dependency $command/$dep is newer than target file ${targetroot}/${target}; you may want to run make build"$logcmd;; \\
    esac; \\
   END
    }
                   chomp $depstring;
    $buildtest=<<END;
    \@if !(test -e "${sourceroot}/${source}") && !(test -e "${targetroot}/${target}"); then \\
    echo "**** ERROR **** ${sourceroot}/${source} is missing and is also not present at target location ${targetroot}/${target}; you must run make build"$logcmd; exit; \\
   END
                   $buildtest.=<<END if $depstring;
    elif !(test -e "${sourceroot}/${source}"); then \\
   $depstring
   END
                   $buildtest.=<<END;
    fi
   END
       }
               my $bflag='-b1';
               $bflag='-b3' if $dependencies or $buildlink;
       return <<END;
   $buildtest \@if !(test -e "${sourceroot}/${source}") && !(test -e "${targetroot}/${target}"); then \\
    echo "**** ERROR **** CVS source file does not exist: ${sourceroot}/${source} and neither does target: ${targetroot}/${target}"$logcmd; \\
    elif !(test -e "${sourceroot}/${source}"); then \\
    echo "**** WARNING **** CVS source file does not exist: ${sourceroot}/${source}"$logcmd; \\
    perl verifymodown.pl ${targetroot}/${target} "$categoryhash{$categoryname}"$logcmd; \\
    else \\
    ECODE=0; \\
    perl filecompare.pl $bflag ${sourceroot}/${source} ${targetroot}/${target} || ECODE=\$\$?; \\
    case "\$\$ECODE" in \\
    1) echo "${targetroot}/${target} is unchanged";; \\
    2) echo "**** WARNING **** target file ${targetroot}/${target} is newer than CVS source; saving current (old) target file to ${targetroot}/${target}.lpmlsave and then overwriting"$logcmd && install -o www -g www -m 0600 ${targetroot}/${target} ${targetroot}/${target}.lpmlsave && install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target};; \\
    0) echo "install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target}" && install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target};; \\
    esac; \\
    perl verifymodown.pl ${targetroot}/${target} "$categoryhash{$categoryname}"$logcmd; \\
    fi
   END
    }
    elsif ($mode eq 'configinstall' && $categoryname eq 'conf') {
       push @configall,$targetroot.'/'.$target;
       return $targetroot.'/'.$target.': alwaysrun'."\n".
    "\t".'@echo -n ""; ECODE=0 && { perl filecompare.pl -b4 '.
    $sourceroot.'/'.$source.' '.$targetroot.'/'.$target.
    ' || ECODE=$$?; } && '.
    '{ [ $$ECODE != "2" ] || (install '.
                   $categoryhash{$categoryname}.' '.
  $sourceroot.'/'.$source.' '.   $sourceroot.'/'.$source.' '.
  $targetroot.'/'.$target.   $targetroot.'/'.$target.'.lpmlnew'.
  ' || echo "**** LON-CAPA WARNING '.   ' && echo "**** NOTE: CONFIGURATION FILE CHANGE ****"'.
  '**** CVS source file does not exist: '.$sourceroot.'/'.   $logcmd.' && echo "'.
  $source.'"'."\n";   'You likely need to compare contents of '.
    ''.$targetroot.'/'.$target.' with the new '.
                   ''.$targetroot.'/'.$target.'.lpmlnew"'.
    "$logcmd); } && ".
    '{ [ $$ECODE != "3" ] || (install '.
                   $categoryhash{$categoryname}.' '.
    $sourceroot.'/'.$source.' '.
    $targetroot.'/'.$target.''.
    ' && echo "**** WARNING: NEW CONFIGURATION FILE ADDED ****"'.
    $logcmd.' && echo "'.
    'You likely need to review the contents of '.
    ''.$targetroot.'/'.$target.' to make sure its '.
                   'settings are compatible with your overall system"'.
    "$logcmd); } && ".
    '{ [ $$ECODE != "1" ] || ('.
    'echo "**** ERROR ****"'.
    $logcmd.' && echo "'.
    'Configuration source file does not exist '.
    ''.$sourceroot.'/'.$source.'"'.
    "$logcmd); } && perl verifymodown.pl ${targetroot}/${target} \"$categoryhash{$categoryname}\"$logcmd;\n\n";
  }   }
  elsif ($mode eq 'build' && $build) {   elsif ($mode eq 'build' && $build) {
     push @buildall,$sourceroot.'/'.$source;      push @buildall,$sourceroot.'/'.$source;
     push @buildinfo,$sourceroot.'/'.$source.';'.$build.';'.      push @buildinfo,$targetroot.'/'.$target.';'.$sourceroot.'/'.
    $source.';'.$build.';'.
  $dependencies;   $dependencies;
 #    return '# need to build '.$source.";  #    return '# need to build '.$source.";
  }   }
Line 739  sub format_file { Line 1179  sub format_file {
 # --------------------------------------------------------- Format link section  # --------------------------------------------------------- Format link section
 sub format_link {  sub format_link {
     my @tokeninfo=@_;      my @tokeninfo=@_;
     $link=''; $linkto=''; $target=''; $categoryname=''; $description='';      $link=''; $linkto=''; $source=''; $target=''; $categoryname=''; 
     $note=''; $build=''; $status=''; $dependencies='';      $description=''; $note=''; $build=''; $status=''; $dependencies='';
     my $text=&trim($parser->get_text('/link'));      my $text=&trim($parser->get_text('/link'));
       my @links;
     if ($linkto) {      if ($linkto) {
  $parser->get_tag('/link');   $parser->get_tag('/link');
  if ($mode eq 'html') {   if ($mode eq 'html') {
     return $link="\n<br />BEGIN LINK\n".      my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target);
  "$linkto $target $categoryname $description $note " .      $link_count+=scalar(@targets);
  "$build $status $dependencies" .      foreach my $tgt (@targets) {
     "\nEND LINK";   $categorycount{$categoryname}++;
    push @links,("\n<!-- FILESORT:$tgt -->".
       "<tr>".
       "<td><!-- POSTEVAL verify.pl link ".
       "'/$targetrootarg$linkto' '/$targetrootarg$tgt' ".
       "$categoryhash{$categoryname} -->&nbsp;</td><td>".
       "<img src='$fab{$categoryname}.gif' ".
       "alt='$categoryname icon' /></td>".
       "<td><font size='-1'>$categoryname</font></td>".
       "<td>LINKTO: $linkto<br />TARGET: $tgt</td>".
       "<td>$description</td>".
       "<td>$note</td>".
       "</tr>");
   # push @links,"\t".'ln -fs /'.$linkto.' /'.$targetroot.$tgt.
   #    "\n";
       }
       return join('',@links);
   #    return ($link="\n<!-- FILESORT:$target -->".
   #    "<tr>".
   #    "<td>&nbsp;</td><td><img src='$fab{$categoryname}.gif' ".
   #    "alt='$categoryname icon' /></td>".
   #    "<td>$categoryname</td>".
   #    "<td>LINKTO: $linkto<br />TARGET: $target</td>".
   #    "<td>$description</td>".
   #    "<td>$note</td>".
   #    "</tr>");
   #    return $link="\n<tr><td colspan='6'>BEGIN LINK\n".
   # "$linkto $target $categoryname $description $note " .
   # "$build $status $dependencies" .
   #    "\nEND LINK</td></tr>";
  }   }
  elsif ($mode eq 'install') {   elsif ($mode eq 'install') {
     my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target);      my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target);
Line 772  sub format_fileglob { Line 1242  sub format_fileglob {
     $note=''; $build=''; $status=''; $dependencies='';      $note=''; $build=''; $status=''; $dependencies='';
     $filenames='';      $filenames='';
     my $text=&trim($parser->get_text('/fileglob'));      my $text=&trim($parser->get_text('/fileglob'));
       my $filenames2=$filenames;$filenames2=~s/\s//g;
       $fileglob_count++;
       my @semi=($filenames2=~/(\;)/g);
       $fileglobnames_count+=scalar(@semi)+1;
       $categorycount{$categoryname}+=scalar(@semi)+1;
       # START TEMP WAY
   #    for my $f (split(/\;/,$filenames2)) {
   # if (-T "$sourcerootarg/$sourcedir/$f") {
   #    $linecount{$categoryname}+=`wc -l $sourcerootarg/$sourcedir/$f`;
   #    open OUT,">>/tmp/junk123";
   #    print OUT "$linecount{$categoryname} $categoryname $sourcerootarg/$sourcedir/$f\n";
   #    close OUT;
   # }
   # my $bytesize=(-s "$sourcerootarg/$sourcedir/$f");
   # $bytecount{$categoryname}+=$bytesize;
   #    }
       # END TEMP WAY
     if ($sourcedir) {      if ($sourcedir) {
  $parser->get_tag('/fileglob');   $parser->get_tag('/fileglob');
  if ($mode eq 'html') {   if ($mode eq 'html') {
     return $fileglob="\n<br />BEGIN FILEGLOB\n".      return $fileglob="\n<tr>".
  "$glob sourcedir $targetdir $categoryname $description $note ".   "<td><!-- POSTEVAL verify.pl fileglob '$sourcerootarg' ".
  "$build $status $dependencies $filenames" .   "'$targetrootarg' ".
     "\nEND FILEGLOB";   "'$glob' '$sourcedir' '$filenames2' '$targetdir' ".
    "$categoryhash{$categoryname} -->&nbsp;</td>".
    "<td>"."<img src='$fab{$categoryname}.gif' ".
           "alt='$categoryname icon' /></td>".
    "<td>$categoryname<br />".
    "<font size='-1'>".$categoryhash{$categoryname}."</font></td>".
    "<td>SOURCEDIR: $sourcedir<br />".
    "TARGETDIR: $targetdir<br />".
                   "GLOB: $glob<br />".
                   "FILENAMES: $filenames".
    "</td>".
    "<td>$description</td>".
    "<td>$note</td>".
    "</tr>";
   #    return $fileglob="\n<tr><td colspan='6'>BEGIN FILEGLOB\n".
   # "$glob sourcedir $targetdir $categoryname $description $note ".
   # "$build $status $dependencies $filenames" .
   # "\nEND FILEGLOB</td></tr>";
  }   }
  elsif ($mode eq 'install') {   elsif ($mode eq 'install') {
     return "\t".'install '.      return "\t".'install '.
  $categoryhash{$categoryname}.' '.   $categoryhash{$categoryname}.' '.
  $sourceroot.'/'.$sourcedir.'[^CVS]'.$glob.' '.   $sourceroot.'/'.$sourcedir.'[^C][^V][^S]'.$glob.' '.
  $targetroot.'/'.$targetdir.'.'."\n";   $targetroot.'/'.$targetdir.'.'."\n";
  }   }
  else {   else {
Line 829  sub format_source { Line 1333  sub format_source {
 sub format_note {  sub format_note {
     my @tokeninfo=@_;      my @tokeninfo=@_;
     $note='';      $note='';
     my $text=&trim($parser->get_text('/note'));  #    my $text=&trim($parser->get_text('/note'));
       my $aref;
       my $text;
       while ($aref=$parser->get_token()) {
    if ($aref->[0] eq 'E' && $aref->[1] eq 'note') {
       last;
    }
    elsif ($aref->[0] eq 'S') {
       $text.=$aref->[4];
    }
    elsif ($aref->[0] eq 'E') {
       $text.=$aref->[2];
    }
    else {
       $text.=$aref->[1];
    }
       }
     if ($text) {      if ($text) {
  $parser->get_tag('/note');  # $parser->get_tag('/note');
  $note=$text;   $note=$text;
     }      }
     return '';      return '';
Line 848  sub format_build { Line 1368  sub format_build {
     }      }
     return '';      return '';
 }  }
   # -------------------------------------------------------- Format build section
   sub format_buildlink {
       my @tokeninfo=@_;
       $buildlink='';
       my $text=&trim($parser->get_text('/buildlink'));
       if ($text) {
    $parser->get_tag('/buildlink');
    $buildlink=$sourceroot.'/'.$text;
       }
       return '';
   }
 # ------------------------------------------------------- Format status section  # ------------------------------------------------------- Format status section
 sub format_status {  sub format_status {
     my @tokeninfo=@_;      my @tokeninfo=@_;
Line 913  sub htmlsafe { Line 1444  sub htmlsafe {
 sub trim {  sub trim {
     my ($s)=@_; $s=~s/^\s*//; $s=~s/\s*$//; return $s;      my ($s)=@_; $s=~s/^\s*//; $s=~s/\s*$//; return $s;
 }   } 
   
   # ----------------------------------- POD (plain old documentation, CPAN style)
   
   =head1 NAME
   
   lpml_parse.pl - This is meant to parse files meeting the lpml document type.
   See lpml.dtd.  LPML=Linux Packaging Markup Language.
   
   =head1 SYNOPSIS
   
   Usage is for lpml file to come in through standard input.
   
   =over 4
   
   =item *
   
   1st argument is the mode of parsing.
   
   =item * 
   
   2nd argument is the category permissions to use (runtime or development)
   
   =item *
   
   3rd argument is the distribution
   (default,redhat6.2,debian2.2,redhat7.1,etc).
   
   =item *
   
   4th argument is to manually specify a sourceroot.
   
   =item *
   
   5th argument is to manually specify a targetroot.
   
   =back
   
   Only the 1st argument is mandatory for the program to run.
   
   Example:
   
   cat ../../doc/loncapafiles.lpml |\\
   perl lpml_parse.pl html default /home/sherbert/loncapa /tmp/install
   
   =head1 DESCRIPTION
   
   I am using a multiple pass-through approach to parsing
   the lpml file.  This saves memory and makes sure the server
   will never be overloaded.
   
   =head1 README
   
   I am using a multiple pass-through approach to parsing
   the lpml file.  This saves memory and makes sure the server
   will never be overloaded.
   
   =head1 PREREQUISITES
   
   HTML::TokeParser
   
   =head1 COREQUISITES
   
   =head1 OSNAMES
   
   linux
   
   =head1 SCRIPT CATEGORIES
   
   Packaging/Administrative
   
   =cut

Removed from v.1.11  
changed lines
  Added in v.1.29


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.