Update of /cvsroot/fink/experimental/chrisdolan/lib/Fink In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14113/lib/Fink
Modified Files: BuildPerlMod.pm CPANPLUS.pm Log Message: v1.20 of mkpkg.pl * added difference mode (useful for updates) * improvements to prereq determination * many bugfixes and a little more documentation Index: CPANPLUS.pm =================================================================== RCS file: /cvsroot/fink/experimental/chrisdolan/lib/Fink/CPANPLUS.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- CPANPLUS.pm 20 Feb 2005 04:34:07 -0000 1.1 +++ CPANPLUS.pm 21 Feb 2005 04:30:42 -0000 1.2 @@ -26,7 +26,12 @@ my $self = shift; my $host = shift; - if ($host && $host =~ m,^(\w+)://([\w\.\-]+)(/.*),) + if ($host && $host eq "default") + { + # noop + return 1; + } + elsif ($host && $host =~ m,^(\w+)://([\w\.\-]+)(/.*),) { $self->{cb}->configure_object->set_conf("hosts", [{ scheme => $1, Index: BuildPerlMod.pm =================================================================== RCS file: /cvsroot/fink/experimental/chrisdolan/lib/Fink/BuildPerlMod.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- BuildPerlMod.pm 20 Feb 2005 04:34:07 -0000 1.1 +++ BuildPerlMod.pm 21 Feb 2005 04:30:42 -0000 1.2 @@ -2,10 +2,10 @@ use warnings; use strict; -use Fink::CPANPLUS; +#use Fink::CPANPLUS; # now loads on demand use File::Slurp; -our $VERSION = "1.10"; +our $VERSION = "1.20"; # Translation from Module::Build license tags to Fink words # From: http://search.cpan.org/dist/Module-Build/lib/Module/Build.pm#license @@ -46,6 +46,7 @@ } } + require Fink::CPANPLUS; $self->{cp} = Fink::CPANPLUS->new( verbose => $self->{verbose}, prereqs => $self->{prereqs}, @@ -67,35 +68,161 @@ return $self->{verbose}; } -sub pkgdir +sub pkg_dir { my $self = shift; return $self->{prefix}."/fink/dists/".$self->{tree}."/finkinfo/libs/perlmods"; } -sub buildpkg +sub build_pkg { my $self = shift; my $modname = shift; my $overwrite = shift; - print "Search for $modname\n" if ($self->verbose); - my $mod = $self->{cp}->get_module($modname); - if (!$mod) + my $mod = $self->get_module($modname); + return undef if (!$mod); + + my $pkg = lc($mod->package_name)."-pm"; + my $file = $self->pkg_dir."/$pkg.info"; + if (-f $file && !$overwrite) { - print "Not found\n" if ($self->verbose); + print "package already exists\n" if ($self->verbose); + print " $file\n" if ($self->verbose); return undef; } + my $data = $self->get_pkg_details($mod); + return undef if (!$data); + + write_file($file, $self->to_string($data)); + print "Wrote file $file\n" if ($self->{verbose}); + + return 1; +} + +sub diff_pkg +{ + my $self = shift; + my $modname = shift; + + my $mod = $self->get_module($modname); + return undef if (!$mod); + my $pkg = lc($mod->package_name)."-pm"; - my $file = $self->pkgdir."/$pkg.info"; - if (-f $file && !$overwrite) + my $file = $self->pkg_dir."/$pkg.info"; + if (!-f $file) { - print "package already exists\n"; + print "package does not exists\n" if ($self->verbose); print " $file\n" if ($self->verbose); return undef; } + my $old = $self->from_string(scalar read_file($file)); + return undef if (!$old); + + my $new = $self->get_pkg_details($mod); + return undef if (!$new); + + #use Data::Dumper; + #print Dumper($old); + #print Dumper($new); + + # simplify: + if ($old->{Info2}) + { + $old = $old->{Info2}; + } + if ($new->[0] eq "Info2") + { + $new = $new->[1]; + } + + my @diffs = $self->_diff_pkg($old, $new); + return join("\n", @diffs)."\n"; +} + +sub _diff_pkg +{ + my $self = shift; + my $old = shift; + my $new = shift; + + my @diffs; + for (my $i=0; $i<@$new; $i+=2) + { + my $key = $new->[$i]; + my $val = $new->[$i+1]; + if (!exists $old->{$key}) + { + unless ($val eq "") + { + push @diffs, "old - "; + if (ref $val) + { + push @diffs, "new - ".$self->to_string([$key => $val]); + } + else + { + push @diffs, "new - $key: $val"; + } + } + } + else + { + my $oldval = delete $old->{$key}; + if (ref $val) + { + my @d = $self->_diff_pkg($oldval, $val); + s/ - / - $key./ for (@d); + push @diffs, @d; + } + elsif ($val ne $oldval) + { + push @diffs, "old - $key: $oldval"; + push @diffs, "new - $key: $val"; + } + } + } + foreach my $key (sort keys %$old) + { + my $val = $old->{$key}; + if (ref $val) + { + push @diffs, "old - ".$self->to_string([$key => $val]); + } + else + { + push @diffs, "old - $key: $val"; + } + push @diffs, "new - "; + } + + return @diffs; +} + +sub get_module +{ + my $self = shift; + my $modname = shift; + + print "Search for $modname\n" if ($self->verbose); + my $mod = $self->{cp}->get_module($modname); + if (!$mod) + { + print "Not found\n" if ($self->verbose); + return undef; + } + return $mod; +} + +sub get_pkg_details +{ + my $self = shift; + my $mod = shift; + + my $pkg = lc($mod->package_name)."-pm"; + if ($self->verbose) { my $details = $mod->details; @@ -195,9 +322,7 @@ "<<"), ); - # Write the .info file - my $splitoffs = 0; - my $output = ""; + # Clean up, build hash my %data; for (my $i=0; $i<@data; $i+=2) { @@ -205,13 +330,14 @@ my $value = $data[$i+1]; if (!defined $value) { - print "Undef field '$label'\n"; - $value = ""; + print "Undef field '$label'\n" if ($self->{verbose}); + $value = $data[$i+1] = ""; } $data{$label} = $value; - $label =~ s/_/-/g; - $output .= "$label: $value\n"; } + + # Workm on splitoffs + my $splitoffs = 0; my $manconflict = join(", ", map("%{Ni}$_-man", @perlversions)); (my $binconflict = $manconflict) =~ s/-man/-bin/g; if ($bin) @@ -219,48 +345,121 @@ my $splitnum = ++$splitoffs == 1 ? "" : $splitoffs; if ($typepkg) { - $output .= <<"EOF"; -Splitoff$splitnum: << - Package: %N-bin - Depends: %N (= %v-%r) - Files: bin - Conflicts: $binconflict - Replaces: $binconflict - DocFiles: $data{DocFiles} -<< -EOF - } + push @data, "Splitoff$splitnum" => [ + Package => "%N-bin", + Depends => "%N (= %v-%r)", + Files => "bin", + Conflicts => $binconflict, + Replaces => $binconflict, + DocFiles => $data{DocFiles}, + ]; + } else { - $output .= <<"EOF"; -Splitoff$splitnum: << - Package: %N-bin - Depends: %N (= %v-%r) - Files: bin share/man/man1 - DocFiles: $data{DocFiles} -<< -EOF + push @data, "Splitoff$splitnum" => [ + Package => "%N-bin", + Depends => "%N (= %v-%r)", + Files => "bin share/man/man1", + DocFiles => $data{DocFiles}, + ]; } } if ($typepkg) { my $splitnum = ++$splitoffs == 1 ? "" : $splitoffs; - $output .= <<"EOF"; -Splitoff$splitnum: << - Package: %N-man - Depends: %N (= %v-%r) - Files: share/man - Conflicts: $manconflict - Replaces: $manconflict - DocFiles: $data{DocFiles} -<< -EOF - $output = "Info2: <<\n$output<<\n"; + push @data, "Splitoff$splitnum" => [ + Package => "%N-man", + Depends => "%N (= %v-%r)", + Files => "share/man", + Conflicts => $manconflict, + Replaces => $manconflict, + DocFiles => $data{DocFiles}, + ]; + @data = ("Info2" => [EMAIL PROTECTED]); } - write_file($file, $output); - print "Wrote file $file\n"; + return [EMAIL PROTECTED]; +} - return 1; +sub to_string +{ + my $pkg_or_self = shift; + my $data = shift; + + my @out; + for (my $i=0; $i<@$data; $i+=2) + { + my $key = $data->[$i]; + my $val = $data->[$i+1]; + $val = "" if (!defined $val); + $key =~ s/_/-/g; + if (ref $val) + { + $val = $pkg_or_self->to_string($val); + } + if ($val =~ /\n/) + { + $val = join("\n ", "<<", split(/\n/, $val))."\n<<"; + } + push @out, "$key: $val"; + } + return join("\n", @out); +} + +sub from_string +{ + my $pkg_or_self = shift; + my $in = shift || ""; + + $in =~ s/^[ \t]*#.*$//mg; + $in =~ s/\n+/\n/gs; + return $pkg_or_self->_from_string(\$in); +} + +sub _from_string +{ + my $pkg_or_self = shift; + my $in = shift; + + my %data; + while ($$in =~ /\G([\w\-]+):\s*/scg) + { + my $label = $1; + $label =~ s/-/_/g; + if ($$in =~ /\G<<\s*/scg) + { + if ($$in =~ /\G[\w\-]+:/s) + { + $data{$label} = $pkg_or_self->_from_string($in); + unless ($$in =~ /\G<<\s*/scg) + { + last; + } + } + else + { + if ($$in =~ /\G(.*?)<<\s*/scg) + { + my $val = $1; + $val =~ s/\s+$//; + $data{$label} = $val; + } + } + } + else + { + if ($$in =~ /\G([^\n]*)\s*/scg) + { + my $val = $1; + $val =~ s/\s+$//; + $data{$label} = $val; + } + else + { + last; + } + } + } + return \%data; } sub finkify_dep_pkg @@ -277,15 +476,15 @@ my $out_typepkg = 0; my @out_perlvers; - my $filename = $self->pkgdir."/$pkg.info"; + my $filename = $self->pkg_dir."/$pkg.info"; if (-f $filename) { my $content = read_file($filename); - if ($content =~ /^Package:.*\%type_pkg[perl]/m) + if ($content =~ /^Package:.*\%type_pkg\[perl\]/m) { $out_typepkg = 1; - if ($content =~ /Type:\s+perl\s+\(?[\d\.\s]*\)?/) + if ($content =~ /Type:\s+perl\s*\(?([\d\.\s]*)\)?/) { my @vers = split /\s+/, $1; my %perlvers = map {$_, 1} @perlvers; @@ -308,7 +507,7 @@ foreach my $v (@perlvers) { (my $verabbr = $v) =~ s/\.//g; # 5.8.1 -> 581 - my $filename = $self->pkgdir."/$pkg$verabbr.info"; + my $filename = $self->pkg_dir."/$pkg$verabbr.info"; if (-f $filename) { push @out_perlvers, $v; ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Fink-commits mailing list Fink-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/fink-commits