version 1.3, 2001/06/24 23:00:32
|
version 1.15, 2001/11/06 03:06:03
|
Line 1
|
Line 1
|
#!/usr/bin/perl |
#!/usr/bin/perl |
|
|
# Scott Harrison |
# Scott Harrison |
|
# 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/17,9/18 - Scott Harrison |
|
# 11/4 - Scott Harrison |
|
|
|
############################################################################### |
|
## ## |
|
## ORGANIZATION OF THIS PERL SCRIPT ## |
|
## 1. Notes ## |
|
## 2. Get command line arguments ## |
|
## 3. First pass through (grab distribution-specific information) ## |
|
## 4. Second pass through (parse out what is not necessary) ## |
|
## 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) ## |
|
## ## |
|
############################################################################### |
|
|
|
# ----------------------------------------------------------------------- Notes |
|
# |
# I am using a multiple pass-through approach to parsing |
# I am using a multiple pass-through approach to parsing |
# the lpml file. This saves memory and makes sure the server |
# the lpml file. This saves memory and makes sure the server |
# will never be overloaded. |
# will never be overloaded. |
|
# |
|
# This is meant to parse files meeting the lpml document type. |
|
# See lpml.dtd. LPML=Linux Packaging Markup Language. |
|
|
use HTML::TokeParser; |
use HTML::TokeParser; |
|
|
Line 14 my $usage=<<END;
|
Line 36 my $usage=<<END;
|
**** ERROR ERROR ERROR ERROR **** |
**** ERROR ERROR ERROR ERROR **** |
Usage is for lpml file to come in through standard input. |
Usage is for lpml file to come in through standard input. |
1st argument is the mode of parsing. |
1st argument is the mode of parsing. |
2nd argument is the distribution (default,redhat6.2,debian2.2,redhat7.1,etc). |
2nd argument is the category permissions to use (runtime or development) |
3rd argument is to manually specify a sourceroot. |
3rd argument is the distribution (default,redhat6.2,debian2.2,redhat7.1,etc). |
4th argument is to manually specify a targetroot. |
4th argument is to manually specify a sourceroot. |
|
5th argument is to manually specify a targetroot. |
|
|
Only the 1st argument is mandatory for the program to run. |
Only the 1st argument is mandatory for the program to run. |
|
|
Line 29 END
|
Line 52 END
|
# ------------------------------------------------- Grab command line arguments |
# ------------------------------------------------- Grab command line arguments |
|
|
my $mode; |
my $mode; |
if (@ARGV) { |
if (@ARGV==5) { |
$mode = shift @ARGV; |
$mode = shift @ARGV; |
} |
} |
else { |
else { |
|
@ARGV=();shift @ARGV; |
while(<>){} # throw away the input to avoid broken pipes |
while(<>){} # throw away the input to avoid broken pipes |
print $usage; |
print $usage; |
exit -1; # exit with error status |
exit -1; # exit with error status |
} |
} |
|
|
|
my $categorytype; |
|
if (@ARGV) { |
|
$categorytype = shift @ARGV; |
|
} |
|
|
my $dist; |
my $dist; |
if (@ARGV) { |
if (@ARGV) { |
$dist = shift @ARGV; |
$dist = shift @ARGV; |
Line 46 if (@ARGV) {
|
Line 75 if (@ARGV) {
|
my $targetroot; |
my $targetroot; |
my $sourceroot; |
my $sourceroot; |
if (@ARGV) { |
if (@ARGV) { |
$targetroot = shift @ARGV; |
$sourceroot = shift @ARGV; |
} |
} |
if (@ARGV) { |
if (@ARGV) { |
$sourceroot = shift @ARGV; |
$targetroot = shift @ARGV; |
|
} |
|
$sourceroot=~s/\/$//; |
|
$targetroot=~s/\/$//; |
|
|
|
my $invocation; |
|
# --------------------------------------------------- Record program invocation |
|
if ($mode eq 'install') { |
|
$invocation=(<<END); |
|
# Invocation: STDINPUT | lpml_parse.pl |
|
# 1st argument (mode) is: $mode |
|
# 2nd argument (category type) is: $categorytype |
|
# 3rd argument (distribution) is: $dist |
|
# 4th argument (targetroot) is: described below |
|
# 5th argument (sourceroot) is: described below |
|
END |
} |
} |
|
|
# ---------------------------------------------------- Start first pass through |
# ---------------------------------------------------- Start first pass through |
Line 104 while ($token = $parser->get_token()) {
|
Line 148 while ($token = $parser->get_token()) {
|
$hierarchy[$hloc]++; |
$hierarchy[$hloc]++; |
$key=$token->[1].join(',',@hierarchy[0..($hloc-1)]); |
$key=$token->[1].join(',',@hierarchy[0..($hloc-1)]); |
my $thisdist=' '.$token->[2]{'dist'}.' '; |
my $thisdist=' '.$token->[2]{'dist'}.' '; |
|
# This conditional clause is set up to ignore two sets |
|
# of invalid conditions before accepting entry into |
|
# the cleanstring. |
if ($hash{$key}==2 and |
if ($hash{$key}==2 and |
!($thisdist eq ' ' or $thisdist =~/\s$dist\s/)) { |
!($thisdist eq ' ' or $thisdist =~/\s$dist\s/)) { |
if ($token->[4]!~/\/>$/) { |
if ($token->[4]!~/\/>$/) { |
Line 134 while ($token = $parser->get_token()) {
|
Line 181 while ($token = $parser->get_token()) {
|
} |
} |
} |
} |
$cleanstring=&trim($cleanstring); |
$cleanstring=&trim($cleanstring); |
|
$cleanstring=~s/\>\s*\n\s*\</\>\</g; |
|
|
# ---------------------------------------------------- Start final pass through |
# ---------------------------------------------------- Start final pass through |
|
|
Line 176 my $target;
|
Line 224 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; |
my $dependencies; |
my $dependencies; |
my $dependency; |
my $dependency; |
|
my @links; |
|
my %categoryhash; |
|
|
|
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 217 $parser->{textify}={
|
Line 273 $parser->{textify}={
|
files => \&format_files, |
files => \&format_files, |
file => \&format_file, |
file => \&format_file, |
fileglob => \&format_fileglob, |
fileglob => \&format_fileglob, |
|
links => \&format_links, |
link => \&format_link, |
link => \&format_link, |
linkto => \&format_linkto, |
linkto => \&format_linkto, |
source => \&format_source, |
source => \&format_source, |
Line 225 $parser->{textify}={
|
Line 282 $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 242 while ($token = $parser->get_tag('lpml')
|
Line 300 while ($token = $parser->get_tag('lpml')
|
$token = $parser->get_tag('/lpml'); |
$token = $parser->get_tag('/lpml'); |
print $lpml; |
print $lpml; |
print "\n"; |
print "\n"; |
$text=~s/\s*\n\s*\n\s*/\n/g; |
# $text=~s/\s*\n\s*\n\s*/\n/g; |
print $text; |
print $text; |
print "\n"; |
print "\n"; |
print &end(); |
print &end(); |
} |
} |
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 "THE END\n"; |
return "<br />THE END\n"; |
|
} |
|
if ($mode eq 'install') { |
|
return ''; |
} |
} |
} |
} |
|
|
Line 267 sub format_lpml {
|
Line 331 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 = "LPML BEGINNING: $date"; |
$lpml = "<br />LPML BEGINNING: $date"; |
|
} |
|
elsif ($mode eq 'install') { |
|
print '# LPML install targets. 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') { |
|
$lpml = "# LPML build targets. Linux Packaging Markup Language,"; |
|
$lpml .= ' by Scott Harrison 2001'."\n"; |
|
$lpml .= '# This file was automatically generated on '.`date`; |
|
$lpml .= "\n"; |
|
$lpml .= "SHELL=\"/bin/sh\"\n\n"; |
|
} |
|
else { |
|
return ''; |
} |
} |
} |
} |
# --------------------------------------------------- Format targetroot section |
# --------------------------------------------------- Format targetroot section |
Line 276 sub format_targetroot {
|
Line 357 sub format_targetroot {
|
$text=$targetroot if $targetroot; |
$text=$targetroot if $targetroot; |
$parser->get_tag('/targetroot'); |
$parser->get_tag('/targetroot'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $targetroot="\nTARGETROOT: $text"; |
return $targetroot="\n<br />TARGETROOT: $text"; |
|
} |
|
elsif ($mode eq 'install') { |
|
return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n"; |
|
} |
|
elsif ($mode eq 'build') { |
|
return '# TARGET INSTALL LOCATION is "'.$targetroot."\"\n"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 288 sub format_sourceroot {
|
Line 375 sub format_sourceroot {
|
$text=$sourceroot if $sourceroot; |
$text=$sourceroot if $sourceroot; |
$parser->get_tag('/sourceroot'); |
$parser->get_tag('/sourceroot'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $sourceroot="\nSOURCEROOT: $text"; |
return $sourceroot="\n<br />SOURCEROOT: $text"; |
|
} |
|
elsif ($mode eq 'install') { |
|
return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";; |
|
} |
|
elsif ($mode eq 'build') { |
|
return '# SOURCE CODE LOCATION IS "'.$sourceroot."\"\n";; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 299 sub format_categories {
|
Line 392 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="\nBEGIN CATEGORIES\n$text\nEND CATEGORIES\n"; |
return $categories="\n<br />BEGIN CATEGORIES\n$text\n". |
|
"<br />END CATEGORIES\n"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 314 sub format_category {
|
Line 408 sub format_category {
|
$parser->get_text('/category'); |
$parser->get_text('/category'); |
$parser->get_tag('/category'); |
$parser->get_tag('/category'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $category="\nCATEGORY $category_att_name $category_att_type ". |
return $category="\n<br />CATEGORY $category_att_name ". |
"$chmod $chown"; |
"$category_att_type $chmod $chown"; |
} |
} |
else { |
else { |
|
if ($category_att_type eq $categorytype) { |
|
my ($user,$group)=split(/\:/,$chown); |
|
$categoryhash{$category_att_name}='-o '.$user.' -g '.$group. |
|
' -m '.$chmod; |
|
} |
return ''; |
return ''; |
} |
} |
} |
} |
Line 348 sub format_rpm {
|
Line 447 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="\nBEGIN RPM\n$text\nEND RPM"; |
return $rpm="\n<br />BEGIN RPM\n$text\n<br />END RPM"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 359 sub format_rpmSummary {
|
Line 458 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="\nRPMSUMMARY $text"; |
return $rpmSummary="\n<br />RPMSUMMARY $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 370 sub format_rpmName {
|
Line 469 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="\nRPMNAME $text"; |
return $rpmName="\n<br />RPMNAME $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 381 sub format_rpmVersion {
|
Line 480 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="\nRPMVERSION $text"; |
return $rpmVersion="\n<br />RPMVERSION $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 392 sub format_rpmRelease {
|
Line 491 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="\nRPMRELEASE $text"; |
return $rpmRelease="\n<br />RPMRELEASE $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 403 sub format_rpmVendor {
|
Line 502 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="\nRPMVENDOR $text"; |
return $rpmVendor="\n<br />RPMVENDOR $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 414 sub format_rpmBuildRoot {
|
Line 513 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="\nRPMBUILDROOT $text"; |
return $rpmBuildRoot="\n<br />RPMBUILDROOT $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 425 sub format_rpmCopyright {
|
Line 524 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="\nRPMCOPYRIGHT $text"; |
return $rpmCopyright="\n<br />RPMCOPYRIGHT $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 436 sub format_rpmGroup {
|
Line 535 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="\nRPMGROUP $text"; |
return $rpmGroup="\n<br />RPMGROUP $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 447 sub format_rpmSource {
|
Line 546 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="\nRPMSOURCE $text"; |
return $rpmSource="\n<br />RPMSOURCE $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 458 sub format_rpmAutoReqProv {
|
Line 557 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="\nRPMAUTOREQPROV $text"; |
return $rpmAutoReqProv="\n<br />RPMAUTOREQPROV $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 469 sub format_rpmdescription {
|
Line 568 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="\nRPMDESCRIPTION $text"; |
return $rpmdescription="\n<br />RPMDESCRIPTION $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 480 sub format_rpmpre {
|
Line 579 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="\nRPMPRE $text"; |
return $rpmpre="\n<br />RPMPRE $text"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 488 sub format_rpmpre {
|
Line 587 sub format_rpmpre {
|
} |
} |
# -------------------------------------------------- Format directories section |
# -------------------------------------------------- Format directories section |
sub format_directories { |
sub format_directories { |
my $text=&trim($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="\nBEGIN DIRECTORIES\n$text\nEND DIRECTORIES\n"; |
return $directories="\n<br />BEGIN DIRECTORIES\n$text\n<br />". |
|
"END DIRECTORIES\n"; |
} |
} |
|
elsif ($mode eq 'install') { |
|
return "\n".'directories:'."\n".$text; |
|
} |
else { |
else { |
return ''; |
return ''; |
} |
} |
Line 504 sub format_directory {
|
Line 607 sub format_directory {
|
$parser->get_text('/directory'); |
$parser->get_text('/directory'); |
$parser->get_tag('/directory'); |
$parser->get_tag('/directory'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $directory="\nDIRECTORY $targetdir $categoryname $description"; |
return $directory="\n<br />DIRECTORY $targetdir $categoryname ". |
|
"$description"; |
|
} |
|
elsif ($mode eq 'install') { |
|
return "\t".'install '.$categoryhash{$categoryname}.' -d '. |
|
$targetroot.'/'.$targetdir."\n"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 536 sub format_categoryname {
|
Line 644 sub format_categoryname {
|
sub format_description { |
sub format_description { |
my @tokeninfo=@_; |
my @tokeninfo=@_; |
$description=''; |
$description=''; |
my $text=&trim($parser->get_text('/description')); |
my $text=&htmlsafe(&trim($parser->get_text('/description'))); |
if ($text) { |
if ($text) { |
$parser->get_tag('/description'); |
$parser->get_tag('/description'); |
$description=$text; |
$description=$text; |
Line 545 sub format_description {
|
Line 653 sub format_description {
|
} |
} |
# -------------------------------------------------------- Format files section |
# -------------------------------------------------------- Format files section |
sub format_files { |
sub format_files { |
my $text=&trim($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="\nBEGIN FILES\n$text\nEND FILES\n"; |
return $directories="\n<br />BEGIN FILES\n$text\n<br />END FILES\n"; |
|
} |
|
elsif ($mode eq 'install') { |
|
return "\n".'files:'."\n".$text. |
|
"\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') { |
|
my $binfo; |
|
my $tword; |
|
my $command2; |
|
my @deps; |
|
foreach my $bi (@buildinfo) { |
|
my ($target,$source,$command,$trigger,@deps)=split(/\;/,$bi); |
|
$tword=''; $tword=' alwaysrun' if $trigger eq 'always run'; |
|
$command=~s/\/([^\/]*)$//; |
|
$command2="cd $command; sh ./$1;\\"; |
|
my $depstring; |
|
my $depstring2="\t\t\@echo '';\\\n"; |
|
my $olddep; |
|
foreach my $dep (@deps) { |
|
unless ($olddep) { |
|
$olddep=$deps[$#deps]; |
|
} |
|
$depstring.="\telif !(test -r $command/$dep);\\\n"; |
|
$depstring.="\t\tthen echo ". |
|
"\"**** WARNING **** missing the file: ". |
|
"$command/$dep\";\\\n"; |
|
$depstring.="\t\ttest -e $source || test -e $target || echo ". |
|
"'**** ERROR **** neither source=$source nor target=". |
|
"$target exist and they cannot be built';\\\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 -B $command/$olddep $target || ECODE=\$\$?; } && { [ \$\$ECODE != \"2\" ] || echo \"**** WARNING **** dependency $command/$olddep is newer than target file $target; SOMETHING MAY BE WRONG\"; };\\\n"; |
|
} |
|
$olddep=$dep; |
|
} |
|
$binfo.="$source: $tword\n". |
|
"\t\@if !(echo \"\");\\\n\t\tthen echo ". |
|
"\"**** WARNING **** Strange shell. ". |
|
"Check your path settings.\";\\\n". |
|
$depstring. |
|
"\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". |
|
$text. |
|
$binfo."\n". |
|
"alwaysrun:\n\n"; |
} |
} |
else { |
else { |
return ''; |
return ''; |
Line 559 sub format_fileglobs {
|
Line 722 sub format_fileglobs {
|
|
|
} |
} |
# -------------------------------------------------------- Format links section |
# -------------------------------------------------------- Format links section |
|
# deprecated.. currently <link></link>'s are included in <files></files> |
sub format_links { |
sub format_links { |
|
my $text=$parser->get_text('/links'); |
|
$parser->get_tag('/links'); |
|
if ($mode eq 'html') { |
|
return $links="\n<br />BEGIN LINKS\n$text\n<br />END LINKS\n"; |
|
} |
|
elsif ($mode eq 'install') { |
|
return "\n".'links:'."\n\t".$text; |
|
} |
|
else { |
|
return ''; |
|
} |
} |
} |
# --------------------------------------------------------- Format file section |
# --------------------------------------------------------- Format file section |
sub format_file { |
sub format_file { |
Line 568 sub format_file {
|
Line 742 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; |
if ($source) { |
if ($source) { |
$parser->get_tag('/file'); |
$parser->get_tag('/file'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return ($file="\nBEGIN FILE\n". |
return ($file="\n<br />BEGIN FILE\n". |
"$source $target $categoryname $description $note " . |
"$source $target $categoryname $description $note " . |
"$build $status $dependencies" . |
"$build $status $dependencies" . |
"\nEND FILE"); |
"\nEND FILE"); |
} |
} |
|
elsif ($mode eq 'install' && $categoryname ne 'conf') { |
|
if ($build) { |
|
my $bi=$sourceroot.'/'.$source.';'.$build.';'. |
|
$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)'); DEP="1"; \\ |
|
[ -n DEP ] && { perl filecompare.pl -B $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";; \\ |
|
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"; exit; \\ |
|
END |
|
$buildtest.=<<END if $depstring; |
|
elif !(test -e "${sourceroot}/${source}"); then \\ |
|
$depstring |
|
END |
|
$buildtest.=<<END; |
|
fi |
|
END |
|
} |
|
my $bflag='-b'; |
|
$bflag='-g' if $dependencies or $buildlink; |
|
return <<END; |
|
$buildtest \@if !(test -e "${sourceroot}/${source}"); then \\ |
|
echo "**** WARNING **** CVS source file does not exist: ${sourceroot}/${source}"; \\ |
|
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; creating ${targetroot}/${target}.lpmlnewfile instead" && install -o www -g www -m 0500 ${sourceroot}/${source} ${targetroot}/${target}.lpmlnewfile;; \\ |
|
0) echo "install -o www -g www -m 0500 ${sourceroot}/${source} ${targetroot}/${target}" && install -o www -g www -m 0500 ${sourceroot}/${source} ${targetroot}/${target};; \\ |
|
esac; \\ |
|
fi |
|
END |
|
# return "\t".'@test -e '.$sourceroot.'/'.$source. |
|
# ' && perl filecompare.pl -b '.$sourceroot.'/'.$source.' '. |
|
# $targetroot.'/'.$target. |
|
# ' && install '. |
|
# $categoryhash{$categoryname}.' '. |
|
# $sourceroot.'/'.$source.' '. |
|
# $targetroot.'/'.$target. |
|
# ' || echo "**** LON-CAPA WARNING '. |
|
# '**** CVS source file does not exist: '.$sourceroot.'/'. |
|
# $source.'"'."\n"; |
|
} |
|
elsif ($mode eq 'configinstall' && $categoryname eq 'conf') { |
|
push @configall,$targetroot.'/'.$target; |
|
return $targetroot.'/'.$target.': alwaysrun'."\n". |
|
"\t".'@echo -n ""; ECODE=0 && { perl filecompare.pl -G '.$sourceroot.'/'.$source.' '.$targetroot.'/'.$target.' || ECODE=$$?; } && { [ $$ECODE != "2" ] || (install '.$categoryhash{$categoryname}.' '. |
|
$sourceroot.'/'.$source.' '. |
|
$targetroot.'/'.$target.'.lpmlnewconf'. |
|
' && echo "*** CONFIGURATION FILE CHANGE ***" && echo "'. |
|
'You likely need to compare contents of '. |
|
''.$targetroot.'/'.$target.' with the new '. |
|
''.$targetroot.'/'.$target.'.lpmlnewconf"'. |
|
"); };\n\n"; |
|
} |
|
elsif ($mode eq 'build' && $build) { |
|
push @buildall,$sourceroot.'/'.$source; |
|
push @buildinfo,$targetroot.'/'.$target.';'.$sourceroot.'/'. |
|
$source.';'.$build.';'. |
|
$dependencies; |
|
# return '# need to build '.$source."; |
|
} |
else { |
else { |
return ''; |
return ''; |
} |
} |
Line 591 sub format_link {
|
Line 843 sub format_link {
|
if ($linkto) { |
if ($linkto) { |
$parser->get_tag('/link'); |
$parser->get_tag('/link'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $link="\nBEGIN LINK\n". |
return $link="\n<br />BEGIN LINK\n". |
"$linkto $target $categoryname $description $note " . |
"$linkto $target $categoryname $description $note " . |
"$build $status $dependencies" . |
"$build $status $dependencies" . |
"\nEND LINK"; |
"\nEND LINK"; |
} |
} |
|
elsif ($mode eq 'install') { |
|
my @targets=map {s/^\s*//;s/\s$//;$_} split(/\;/,$target); |
|
foreach my $tgt (@targets) { |
|
push @links,"\t".'ln -fs /'.$linkto.' /'.$targetroot.$tgt. |
|
"\n"; |
|
} |
|
return ''; |
|
} |
else { |
else { |
return ''; |
return ''; |
} |
} |
Line 613 sub format_fileglob {
|
Line 873 sub format_fileglob {
|
if ($sourcedir) { |
if ($sourcedir) { |
$parser->get_tag('/fileglob'); |
$parser->get_tag('/fileglob'); |
if ($mode eq 'html') { |
if ($mode eq 'html') { |
return $fileglob="\nBEGIN FILEGLOB\n". |
return $fileglob="\n<br />BEGIN FILEGLOB\n". |
"$glob sourcedir $targetdir $categoryname $description $note ". |
"$glob sourcedir $targetdir $categoryname $description $note ". |
"$build $status $dependencies $filenames" . |
"$build $status $dependencies $filenames" . |
"\nEND FILEGLOB"; |
"\nEND FILEGLOB"; |
} |
} |
|
elsif ($mode eq 'install') { |
|
return "\t".'install '. |
|
$categoryhash{$categoryname}.' '. |
|
$sourceroot.'/'.$sourcedir.'[^C][^V][^S]'.$glob.' '. |
|
$targetroot.'/'.$targetdir.'.'."\n"; |
|
} |
else { |
else { |
return ''; |
return ''; |
} |
} |
Line 676 sub format_build {
|
Line 942 sub format_build {
|
my $text=&trim($parser->get_text('/build')); |
my $text=&trim($parser->get_text('/build')); |
if ($text) { |
if ($text) { |
$parser->get_tag('/build'); |
$parser->get_tag('/build'); |
$build=$text; |
$build=$sourceroot.'/'.$text.';'.$tokeninfo[2]{'trigger'}; |
|
} |
|
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 ''; |
return ''; |
} |
} |
Line 698 sub format_dependencies {
|
Line 975 sub format_dependencies {
|
my $text=&trim($parser->get_text('/dependencies')); |
my $text=&trim($parser->get_text('/dependencies')); |
if ($text) { |
if ($text) { |
$parser->get_tag('/dependencies'); |
$parser->get_tag('/dependencies'); |
$dependencies=$text; |
$dependencies=join(';', |
|
(map {s/^\s*//;s/\s$//;$_} split(/\;/,$text))); |
} |
} |
return ''; |
return ''; |
} |
} |
Line 716 sub format_glob {
|
Line 994 sub format_glob {
|
# ---------------------------------------------------- Format filenames section |
# ---------------------------------------------------- Format filenames section |
sub format_filenames { |
sub format_filenames { |
my @tokeninfo=@_; |
my @tokeninfo=@_; |
$glob=''; |
|
my $text=&trim($parser->get_text('/filenames')); |
my $text=&trim($parser->get_text('/filenames')); |
if ($text) { |
if ($text) { |
$parser->get_tag('/filenames'); |
$parser->get_tag('/filenames'); |
Line 727 sub format_filenames {
|
Line 1004 sub format_filenames {
|
# ------------------------------------------------------- Format linkto section |
# ------------------------------------------------------- Format linkto section |
sub format_linkto { |
sub format_linkto { |
my @tokeninfo=@_; |
my @tokeninfo=@_; |
$glob=''; |
|
my $text=&trim($parser->get_text('/linkto')); |
my $text=&trim($parser->get_text('/linkto')); |
if ($text) { |
if ($text) { |
$parser->get_tag('/linkto'); |
$parser->get_tag('/linkto'); |
Line 735 sub format_linkto {
|
Line 1011 sub format_linkto {
|
} |
} |
return ''; |
return ''; |
} |
} |
|
# ------------------------------------- Render less-than and greater-than signs |
|
sub htmlsafe { |
|
my $text=@_[0]; |
|
$text =~ s/</</g; |
|
$text =~ s/>/>/g; |
|
return $text; |
|
} |
# --------------------------------------- remove starting and ending whitespace |
# --------------------------------------- remove starting and ending whitespace |
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) |