Diff for /loncom/build/lpml_parse.pl between versions 1.25 and 1.42

version 1.25, 2001/12/01 16:51:07 version 1.42, 2002/03/22 02:09:41
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  # 9/17,9/18 - Scott Harrison
 # 11/4,11/5,11/6,11/7,11/16,11/17 - 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,12/13,12/19,12/29 - Scott Harrison
 # $Id$  # YEAR=2002
   # 1/8,1/9,1/29,1/31,2/5,3/21 - Scott Harrison
 ###  ###
   
 ###############################################################################  ###############################################################################
Line 77  if (@ARGV) { Line 106  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 85  if (@ARGV) { Line 116  if (@ARGV) {
 }  }
 $sourceroot=~s/\/$//;  $sourceroot=~s/\/$//;
 $targetroot=~s/\/$//;  $targetroot=~s/\/$//;
   $sourcerootarg=$sourceroot;
   $targetrootarg=$targetroot;
   
 my $logcmd='| tee -a WARNINGS';  my $logcmd='| tee -a WARNINGS';
   
Line 96  if ($mode eq 'install' or $mode eq 'conf Line 129  if ($mode eq 'install' or $mode eq 'conf
 #             1st argument (mode) is: $mode  #             1st argument (mode) is: $mode
 #             2nd argument (category type) is: $categorytype  #             2nd argument (category type) is: $categorytype
 #             3rd argument (distribution) is: $dist  #             3rd argument (distribution) is: $dist
 #             4th argument (targetroot) is: described below  #             4th argument (sourceroot) is: described below
 #             5th argument (sourceroot) is: described below  #             5th argument (targetroot) is: described below
 END  END
 }  }
   
Line 174  while ($token = $parser->get_token()) { Line 207  while ($token = $parser->get_token()) {
     $cleanstring.=$token->[4];      $cleanstring.=$token->[4];
  }   }
  if ($token->[4]=~/\/>$/) {   if ($token->[4]=~/\/>$/) {
     $hloc--;  #    $hloc--;
  }   }
     }      }
     if ($token->[0] eq 'E') {      if ($token->[0] eq 'E') {
Line 193  $cleanstring=~s/\>\s*\n\s*\</\>\</g; Line 226  $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;
Line 238  my $dependencies; Line 272  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;
   
 my @buildall;  my @buildall;
 my @buildinfo;  my @buildinfo;
Line 251  $parser = HTML::TokeParser->new(\$cleans Line 293  $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}={
       specialnotices => \&format_specialnotices,
       specialnotice => \&format_specialnotice,
     targetroot => \&format_targetroot,      targetroot => \&format_targetroot,
     sourceroot => \&format_sourceroot,      sourceroot => \&format_sourceroot,
     categories => \&format_categories,      categories => \&format_categories,
Line 273  $parser->{textify}={ Line 318  $parser->{textify}={
     rpmAutoReqProv => \&format_rpmAutoReqProv,      rpmAutoReqProv => \&format_rpmAutoReqProv,
     rpmdescription => \&format_rpmdescription,      rpmdescription => \&format_rpmdescription,
     rpmpre => \&format_rpmpre,      rpmpre => \&format_rpmpre,
       rpmRequires => \&format_rpmRequires,
     directories => \&format_directories,      directories => \&format_directories,
     directory => \&format_directory,      directory => \&format_directory,
     categoryname => \&format_categoryname,      categoryname => \&format_categoryname,
Line 319  exit; Line 365  exit;
 # ------------------------ Final output at end of markup parsing and formatting  # ------------------------ Final output at end of markup parsing and formatting
 sub end {  sub end {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return "</body></html>\n";   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>".
       "<th>Number of Incorrect Counts</th>".
       "</tr>".
       join("\n",(map {"<tr><td><img src='$fab{$_}.gif' ".
    "alt='$_ icon' /></td>".
             "<td>$_</td><td>$categorycount{$_}</td>".
    "<td><!-- POSTEVALINLINE $_ --></td></tr>"}
    @categorynamelist)).
       "</table>".
       "</body></html>\n";
   
     }      }
     if ($mode eq 'install') {      if ($mode eq 'install') {
  return '';   return '';
Line 356  END Line 438  END
 Descriptions</a></li>  Descriptions</a></li>
 <li><a href='#package'>Software Package Description</a></li>  <li><a href='#package'>Software Package Description</a></li>
 <li><a href='#directories'>Directory Structure</a></li>  <li><a href='#directories'>Directory Structure</a></li>
 <li><a href='#files'>File and Directory Structure</a></li>  <li><a href='#files'>Files</a></li>
   <li><a href='#summary'>Summary of Source Repository</a></li>
 </ul>  </ul>
 END  END
         $lpml .=<<END;          $lpml .=<<END;
Line 364  END Line 447  END
 <font size='+2'>About this file</font>  <font size='+2'>About this file</font>
 <p>  <p>
 This file is generated dynamically by <tt>lpml_parse.pl</tt> as  This file is generated dynamically by <tt>lpml_parse.pl</tt> as
 part of a development compilation process.  Author: Scott  part of a development compilation process.</p>
 Harrison (harris41\@msu.edu).  <p>LPML written by Scott Harrison (harris41\@msu.edu).
 </p>  </p>
 END  END
     }      }
Line 377  END Line 460  END
 * Software Package Description  * Software Package Description
 * Directory Structure  * Directory Structure
 * File Type Ownership and Permissions  * File Type Ownership and Permissions
 * File and Directory Structure  * Files
 END  END
         $lpml .=<<END;          $lpml .=<<END;
   
Line 487  sub format_category { Line 570  sub format_category {
     $abbreviation=''; $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') {
  if ($category_att_type eq $categorytype) {   if ($category_att_type eq $categorytype) {
       push @categorynamelist,$category_att_name;
       $categoryhash{$category_att_name}="$chmod $chown";
     return $category="<tr>".      return $category="<tr>".
  "<td><img src='$abbreviation.gif' ".   "<td><img src='$abbreviation.gif' ".
            "alt='${category_att_name}' /></td>\n".             "alt='${category_att_name}' /></td>\n".
Line 559  $text Line 645  $text
 </table>  </table>
 END  END
     }      }
       elsif ($mode eq 'make_rpm') {
    return $text;
       }
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpm=<<END;   return $rpm=<<END;
 Software Package Description  Software Package Description
Line 580  sub format_rpmSummary { Line 669  sub format_rpmSummary {
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmSummary="\nSummary     : $text";   return $rpmSummary="\nSummary     : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <summary>$text</summary>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 594  sub format_rpmName { Line 688  sub format_rpmName {
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmName="\nName        : $text";   return $rpmName="\nName        : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <name>$text</name>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 636  sub format_rpmVendor { Line 735  sub format_rpmVendor {
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmVendor="\nVendor      : $text";   return $rpmVendor="\nVendor      : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <vendor>$text</vendor>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 664  sub format_rpmCopyright { Line 768  sub format_rpmCopyright {
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmCopyright="\nLicense     : $text";   return $rpmCopyright="\nLicense     : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <copyright>$text</copyright>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 678  sub format_rpmGroup { Line 787  sub format_rpmGroup {
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmGroup="\nGroup       : $text";   return $rpmGroup="\nGroup       : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <group>Utilities/System</group>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 703  sub format_rpmAutoReqProv { Line 817  sub format_rpmAutoReqProv {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $rpmAutoReqProv="\nAutoReqProv : $text";   return $rpmAutoReqProv="\nAutoReqProv : $text";
     }      }
     if ($mode eq 'text') {      elsif ($mode eq 'text') {
  return $rpmAutoReqProv="\nAutoReqProv : $text";   return $rpmAutoReqProv="\nAutoReqProv : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <AutoReqProv>$text</AutoReqProv>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 724  sub format_rpmdescription { Line 843  sub format_rpmdescription {
  $text=~s/\\n/\n/g;   $text=~s/\\n/\n/g;
  return $rpmdescription="\nDescription : $text";   return $rpmdescription="\nDescription : $text";
     }      }
       elsif ($mode eq 'make_rpm') {
    $text=~s/\n//g;
    $text=~s/\\n/\n/g;
    return <<END;
   <description>$text</description>
   END
       }
     else {      else {
  return '';   return '';
     }      }
Line 736  sub format_rpmpre { Line 862  sub format_rpmpre {
 # return $rpmpre="\n<br />RPMPRE $text";  # return $rpmpre="\n<br />RPMPRE $text";
  return '';   return '';
     }      }
       elsif ($mode eq 'make_rpm') {
    return <<END;
   <pre>$text</pre>
   END
       }
       else {
    return '';
       }
   }
   # -------------------------------------------------- Format requires section
   sub format_rpmRequires {
       my @tokeninfo=@_;
       my $aref;
       my $text;
       if ($mode eq 'make_rpm') {
    while ($aref=$parser->get_token()) {
       if ($aref->[0] eq 'E' && $aref->[1] eq 'rpmRequires') {
    last;
       }
       elsif ($aref->[0] eq 'S') {
    $text.=$aref->[4];
       }
       elsif ($aref->[0] eq 'E') {
    $text.=$aref->[2];
       }
       else {
    $text.=$aref->[1];
       }
    }
       }
     else {      else {
    $parser->get_tag('/rpmRequires');
  return '';   return '';
     }      }
       return '<rpmRequires>'.$text.'</rpmRequires>';
 }  }
 # -------------------------------------------------- Format directories section  # -------------------------------------------------- Format directories section
 sub format_directories {  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') {
    $text=~s/\[\{\{\{\{\{DPATHLENGTH\}\}\}\}\}\]/$dpathlength/g;
  return $directories="\n<br />&nbsp;<br />".   return $directories="\n<br />&nbsp;<br />".
     "<a name='directories' />".      "<a name='directories' />".
     "<font size='+2'>Directory Structure</font>".      "<font size='+2'>Directory Structure</font>".
     "\n$text\n<br />".      "\n<br />&nbsp;<br />".
     "\n";      "<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') {      elsif ($mode eq 'text') {
  return $directories="\nDirectory Structure\n$text\n".   return $directories="\nDirectory Structure\n$text\n".
Line 757  sub format_directories { Line 922  sub format_directories {
     }      }
     elsif ($mode eq 'install') {      elsif ($mode eq 'install') {
  return "\n".'directories:'."\n".$text;   return "\n".'directories:'."\n".$text;
    }      }
       elsif ($mode eq 'rpm_file_list') {
    return $text;
       }
     else {      else {
  return '';   return '';
     }      }
Line 768  sub format_directory { Line 936  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 [$categoryname] ".
       "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') {
  return "\t".'install '.$categoryhash{$categoryname}.' -d '.   return "\t".'install '.$categoryhash{$categoryname}.' -d '.
     $targetroot.'/'.$targetdir."\n";      $targetroot.'/'.$targetdir."\n";
     }      }
       elsif ($mode eq 'rpm_file_list') {
    return $targetroot.'/'.$targetdir."\n";
       }
     else {      else {
  return '';   return '';
     }      }
Line 820  sub format_files { Line 1011  sub format_files {
     if ($mode eq 'html') {      if ($mode eq 'html') {
  return $directories="\n<br />&nbsp;<br />".   return $directories="\n<br />&nbsp;<br />".
     "<a name='files' />".      "<a name='files' />".
     "<font size='+2'>File and Directory Structure</font>".      "<font size='+2'>Files</font><br />&nbsp;<br />".
     "\n$text\n<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";      "\n";
     }      }
     elsif ($mode eq 'text') {      elsif ($mode eq 'text') {
Line 848  sub format_files { Line 1046  sub format_files {
  foreach my $bi (@buildinfo) {   foreach my $bi (@buildinfo) {
     my ($target,$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/\/([^\/]*)$//;      if ($command!~/\s/) {
     $command2="cd $command; sh ./$1;\\";   $command=~s/\/([^\/]*)$//;
    $command2="cd $command; sh ./$1;\\";
       }
       else {
    $command=~s/(.*?\/)([^\/]+\s+.*)$/$1/;
    $command2="cd $command; sh ./$2;\\";
       }
     my $depstring;      my $depstring;
     my $depstring2="\t\t\@echo '';\\\n";      my $depstring2="\t\t\@echo '';\\\n";
     my $olddep;      my $olddep;
Line 885  sub format_files { Line 1089  sub format_files {
  $binfo."\n".   $binfo."\n".
  "alwaysrun:\n\n";   "alwaysrun:\n\n";
     }      }
       elsif ($mode eq 'rpm_file_list') {
    return $text;
       }
     else {      else {
  return '';   return '';
     }      }
Line 915  sub format_file { Line 1122  sub format_file {
     $note=''; $build=''; $status=''; $dependencies='';      $note=''; $build=''; $status=''; $dependencies='';
     my $text=&trim($parser->get_text('/file'));      my $text=&trim($parser->get_text('/file'));
     my $buildtest;      my $buildtest;
       $file_count++;
       $categorycount{$categoryname}++;
     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 [$categoryname] 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') {
     if ($build) {      if ($build) {
Line 935  sub format_file { Line 1158  sub format_file {
  foreach my $dep (@deps) {   foreach my $dep (@deps) {
     $depstring.=<<END;      $depstring.=<<END;
  ECODE=0; DEP=''; \\   ECODE=0; DEP=''; \\
  test -e $command/$dep || (echo '**** WARNING **** cannot evaluate status of dependency $command/$dep (for building ${sourceroot}/${source} with)'$logcmd); DEP="1"; \\   test -e $dep || (echo '**** WARNING **** cannot evaluate status of dependency $dep (for building ${sourceroot}/${source} with)'$logcmd); DEP="1"; \\
  [ -n DEP ] && { perl filecompare.pl -b2 $command/$dep ${targetroot}/${target} || ECODE=\$\$?; } || DEP="1"; \\   [ -n DEP ] && { perl filecompare.pl -b2 $dep ${targetroot}/${target} || ECODE=\$\$?; } || DEP="1"; \\
  case "\$\$ECODE" in \\   case "\$\$ECODE" in \\
  2) echo "**** WARNING **** dependency $command/$dep is newer than target file ${targetroot}/${target}; you may want to run make build"$logcmd;; \\   2) echo "**** WARNING **** dependency $dep is newer than target file ${targetroot}/${target}; you may want to run make build"$logcmd;; \\
  esac; \\   esac; \\
 END  END
  }   }
Line 969  $buildtest \@if !(test -e "${sourceroot} Line 1192  $buildtest \@if !(test -e "${sourceroot}
  case "\$\$ECODE" in \\   case "\$\$ECODE" in \\
  1) echo "${targetroot}/${target} is unchanged";; \\   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};; \\   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{$categorname} ${sourceroot}/${source} ${targetroot}/${target}" && install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target};; \\   0) echo "install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target}" && install $categoryhash{$categoryname} ${sourceroot}/${source} ${targetroot}/${target};; \\
  esac; \\   esac; \\
  perl verifymodown.pl ${targetroot}/${target} "$categoryhash{$categoryname}"$logcmd; \\   perl verifymodown.pl ${targetroot}/${target} "$categoryhash{$categoryname}"$logcmd; \\
  fi   fi
 END  END
 #    return "\t".'@test -e '.$sourceroot.'/'.$source.  
 # ' && perl filecompare.pl -b '.$sourceroot.'/'.$source.' '.  
 # $targetroot.'/'.$target.  
 # ' && install '.  
 # $categoryhash{$categoryname}.' '.  
 # $sourceroot.'/'.$source.' '.  
 # $targetroot.'/'.$target.  
 # ' || echo "**** WARNING '.  
 # '**** CVS source file does not exist: '.$sourceroot.'/'.  
 # $source.'"'."\n";  
  }   }
  elsif ($mode eq 'configinstall' && $categoryname eq 'conf') {   elsif ($mode eq 'configinstall' && $categoryname eq 'conf') {
     push @configall,$targetroot.'/'.$target;      push @configall,$targetroot.'/'.$target;
Line 1016  END Line 1229  END
  $logcmd.' && echo "'.   $logcmd.' && echo "'.
  'Configuration source file does not exist '.   'Configuration source file does not exist '.
  ''.$sourceroot.'/'.$source.'"'.   ''.$sourceroot.'/'.$source.'"'.
  "$logcmd); } && perl verifymodown.pl ${targetroot}/${target} \"$categoryhash{$categoryname}\"$logcmd;\n\n";        "$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;
Line 1025  END Line 1239  END
  $dependencies;   $dependencies;
 #    return '# need to build '.$source.";  #    return '# need to build '.$source.";
  }   }
           elsif ($mode eq 'rpm_file_list') {
       if ($categoryname eq 'doc') {
    return $targetroot.'/'.$target.' # doc'."\n";
       }
       elsif ($categoryname eq 'conf') {
    return $targetroot.'/'.$target.' # config'."\n";
       }
       else {
    return $targetroot.'/'.$target."\n";
       }
    }
  else {   else {
     return '';      return '';
  }   }
Line 1034  END Line 1259  END
 # --------------------------------------------------------- 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'));
     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 [$categoryname] 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);
     foreach my $tgt (@targets) {      foreach my $tgt (@targets) {
  push @links,"\t".'ln -fs /'.$linkto.' /'.$targetroot.$tgt.   push @links,"\t".'ln -fs /'.$linkto.' '.$targetroot.'/'.$tgt.
     "\n";      "\n";
     }      }
   #    return join('',@links);
     return '';      return '';
  }   }
    elsif ($mode eq 'rpm_file_list') {
       my @linklocs;
       my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target);
       foreach my $tgt (@targets) {
    push @linklocs,''.$targetroot.'/'.$tgt."\n";
       }
       return join('',@linklocs);
    }
  else {   else {
     return '';      return '';
  }   }
Line 1067  sub format_fileglob { Line 1330  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;
     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 [$categoryname] 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') {
       my $eglob=$glob;
       if ($glob eq '*') {
    $eglob='[^C][^V][^S]'.$glob;
       }
     return "\t".'install '.      return "\t".'install '.
  $categoryhash{$categoryname}.' '.   $categoryhash{$categoryname}.' '.
  $sourceroot.'/'.$sourcedir.'[^C][^V][^S]'.$glob.' '.   $sourceroot.'/'.$sourcedir.$eglob.' '.
  $targetroot.'/'.$targetdir.'.'."\n";   $targetroot.'/'.$targetdir.'.'."\n";
  }   }
    elsif ($mode eq 'rpm_file_list') {
       my $eglob=$glob;
       if ($glob eq '*') {
    $eglob='[^C][^V][^S]'.$glob;
       }
       my $targetdir2=$targetdir;$targetdir2=~s/\/$//;
       my @gfiles=map {s/^.*\///;"$targetroot/$targetdir2/$_\n"}
                  glob("$sourceroot/$sourcedir/$eglob");
       return join('',@gfiles);
    }
  else {   else {
     return '';      return '';
  }   }
Line 1124  sub format_source { Line 1423  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 1140  sub format_build { Line 1455  sub format_build {
     if ($text) {      if ($text) {
  $parser->get_tag('/build');   $parser->get_tag('/build');
  $build=$sourceroot.'/'.$text.';'.$tokeninfo[2]{'trigger'};   $build=$sourceroot.'/'.$text.';'.$tokeninfo[2]{'trigger'};
    $build=~s/([^\\])\\\s+/$1/g; # allow for lines split onto new lines
     }      }
     return '';      return '';
 }  }
Line 1198  sub format_filenames { Line 1514  sub format_filenames {
     }      }
     return '';      return '';
 }  }
   # ----------------------------------------------- Format specialnotices section
   sub format_specialnotices {
       $parser->get_tag('/specialnotices');
       return '';
   }
   # ------------------------------------------------ Format specialnotice section
   sub format_specialnotice {
       $parser->get_tag('/specialnotice');
       return '';
   }
 # ------------------------------------------------------- Format linkto section  # ------------------------------------------------------- Format linkto section
 sub format_linkto {  sub format_linkto {
     my @tokeninfo=@_;      my @tokeninfo=@_;

Removed from v.1.25  
changed lines
  Added in v.1.42


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