--- loncom/build/lpml_parse.pl 2002/04/13 19:29:32 1.45
+++ loncom/build/lpml_parse.pl 2005/12/09 20:41:35 1.53
@@ -12,7 +12,7 @@
# The LearningOnline Network with CAPA
# lpml_parse.pl - Linux Packaging Markup Language parser
#
-# $Id: lpml_parse.pl,v 1.45 2002/04/13 19:29:32 harris41 Exp $
+# $Id: lpml_parse.pl,v 1.53 2005/12/09 20:41:35 albertel Exp $
#
# Written by Scott Harrison, codeharrison@yahoo.com
#
@@ -47,6 +47,7 @@
# 12/2,12/3,12/4,12/5,12/6,12/13,12/19,12/29 - Scott Harrison
# YEAR=2002
# 1/8,1/9,1/29,1/31,2/5,3/21,4/8,4/12 - Scott Harrison
+# 4/21,4/26,5/19,5/23,10/13 - Scott Harrison
#
###
@@ -298,6 +299,7 @@ my $directories;
my $directory;
my $targetdirs;
my $targetdir;
+my $protectionlevel;
my $categoryname;
my $description;
my $files;
@@ -311,6 +313,7 @@ my $targets;
my $target;
my $source;
my $note;
+my $installscript;
my $build;
my $buildlink;
my $commands;
@@ -351,6 +354,7 @@ $parser->{textify}={
category => \&format_category,
abbreviation => \&format_abbreviation,
targetdir => \&format_targetdir,
+ protectionlevel => \&format_protectionlevel,
chown => \&format_chown,
chmod => \&format_chmod,
rpm => \&format_rpm,
@@ -381,8 +385,10 @@ $parser->{textify}={
target => \&format_target,
note => \&format_note,
build => \&format_build,
+ installscript => \&format_installscript,
status => \&format_status,
dependencies => \&format_dependencies,
+ privatedependencies => \&format_privatedependencies,
buildlink => \&format_buildlink,
glob => \&format_glob,
sourcedir => \&format_sourcedir,
@@ -639,6 +645,8 @@ sub format_category {
my ($user,$group)=split(/\:/,$chown);
$categoryhash{$category_att_name}='-o '.$user.' -g '.$group.
' -m '.$chmod;
+ $categoryhash{"chmod.".$category_att_name}=$chmod;
+ $categoryhash{"chown.".$category_att_name}=$chown;
}
return '';
}
@@ -974,6 +982,9 @@ sub format_directories {
elsif ($mode eq 'rpm_file_list') {
return $text;
}
+ elsif ($mode eq 'uninstall_shell_commands') {
+ return $text;
+ }
else {
return '';
}
@@ -981,7 +992,7 @@ sub format_directories {
# ---------------------------------------------------- Format directory section
sub format_directory {
my (@tokeninfo)=@_;
- $targetdir='';$categoryname='';$description='';
+ $targetdir='';$categoryname='';$description='';$protectionlevel='';
$parser->get_text('/directory');
$parser->get_tag('/directory');
$directory_count++;
@@ -1015,6 +1026,36 @@ sub format_directory {
elsif ($mode eq 'rpm_file_list') {
return $targetroot.'/'.$targetdir."\n";
}
+ elsif ($mode eq 'uninstall_shell_commands') {
+ if ($protectionlevel eq 'never_delete') {
+ return 'echo "LEAVING BEHIND '.$targetroot.'/'.$targetdir.
+ ' which may have important data worth saving"'."\n";
+ }
+ elsif ($protectionlevel eq 'weak_delete') {
+ if ($targetdir!~/\w/) {
+ die("targetdir=\"$targetdir\"! NEVER EVER DELETE THE WHOLE ".
+ "FILESYSTEM"."\n");
+ }
+ return 'rm -Rvf -i '.$targetroot.'/'.$targetdir."\n";
+ }
+ elsif ($protectionlevel =~ /never/) {
+ die("CONFUSING PROTECTION LEVEL \"$protectionlevel\" FOUND ".
+ "FOR directory $targetdir"."\n");
+ }
+ elsif ($protectionlevel !~
+ /^never_delete|weak_delete|modest_delete|strong_delete|absolute_delete$/) {
+ die("CONFUSING OR MISSING PROTECTION LEVEL \"$protectionlevel\" ".
+ "FOUND FOR directory $targetdir\n");
+ }
+ else {
+ if ($targetdir!~/\w/) {
+ die("targetdir=\"$targetdir\"! NEVER EVER DELETE THE WHOLE ".
+ "FILESYSTEM"."\n");
+ }
+ return 'rm -Rvf '.$targetroot.'/'.$targetdir.
+ "| grep 'removed directory'"."\n";
+ }
+ }
else {
return '';
}
@@ -1030,6 +1071,17 @@ sub format_targetdir {
}
return '';
}
+# ---------------------------------------------- Format protectionlevel section
+sub format_protectionlevel {
+ my @tokeninfo=@_;
+ $protectionlevel='';
+ my $text=&trim($parser->get_text('/protectionlevel'));
+ if ($text) {
+ $parser->get_tag('/protectionlevel');
+ $protectionlevel=$text;
+ }
+ return '';
+}
# ------------------------------------------------- Format categoryname section
sub format_categoryname {
my @tokeninfo=@_;
@@ -1056,7 +1108,10 @@ sub format_description {
sub format_files {
my $text=$parser->get_text('/files');
$parser->get_tag('/files');
- if ($mode eq 'html') {
+ if ($mode eq 'MANIFEST') {
+ return $text;
+ }
+ elsif ($mode eq 'html') {
return $directories="\n
".
"".
"Files
".
@@ -1167,14 +1222,31 @@ sub format_links {
sub format_file {
my @tokeninfo=@_;
$file=''; $source=''; $target=''; $categoryname=''; $description='';
- $note=''; $build=''; $status=''; $dependencies='';
+ $note=''; $build=''; $status=''; $dependencies=''; $installscript='';
my $text=&trim($parser->get_text('/file'));
my $buildtest;
$file_count++;
$categorycount{$categoryname}++;
if ($source) {
$parser->get_tag('/file');
- if ($mode eq 'html') {
+ if ($mode eq 'MANIFEST') {
+ my $command=$build;
+ if ($command!~/\s/) {
+ $command=~s/\/([^\/]*)$//;
+ }
+ else {
+ $command=~s/(.*?\/)([^\/]+\s+.*)$/$1/;
+ }
+ $command=~s/^$sourceroot\///;
+ my (@deps)=split(/\;/,$dependencies);
+ my $retval=join("\n",($source,
+ (map {"$command$_"} @deps)));
+ if ($tokeninfo[2]{type} eq 'private') {
+ return "\n";
+ }
+ return $retval."\n";
+ }
+ elsif ($mode eq 'html') {
return ($file="\n".
"