Author: dagolden
Date: Thu Aug 27 08:28:16 2009
New Revision: 13227

Added:
   Module-Build/trunk/t/mymeta.t   (contents, props changed)
Modified:
   Module-Build/trunk/   (props changed)
   Module-Build/trunk/Changes
   Module-Build/trunk/MANIFEST.SKIP
   Module-Build/trunk/lib/Module/Build/Base.pm
   Module-Build/trunk/t/metadata.t
   Module-Build/trunk/t/metadata2.t
   Module-Build/trunk/t/runthrough.t

Log:
Added MYMETA.yml support

Modified: Module-Build/trunk/Changes
==============================================================================
--- Module-Build/trunk/Changes  (original)
+++ Module-Build/trunk/Changes  Thu Aug 27 08:28:16 2009
@@ -2,6 +2,10 @@
 
 0.35_01 - 
 
+ Enhancements
+ - Generates MYMETA.yml during Build.PL (new standard protocol for 
+   communicating configuration results between toolchain components)
+ 
 0.35 - Thu Aug 27 09:12:02 EDT 2009
 
  Bug fixes:

Modified: Module-Build/trunk/MANIFEST.SKIP
==============================================================================
--- Module-Build/trunk/MANIFEST.SKIP    (original)
+++ Module-Build/trunk/MANIFEST.SKIP    Thu Aug 27 08:28:16 2009
@@ -33,6 +33,7 @@
 ^website
 /Script$
 ^META-
+^MYMETA\.yml$
 Plugin
 doc_check.pl$
 ^[^/]+\.patch$

Modified: Module-Build/trunk/lib/Module/Build/Base.pm
==============================================================================
--- Module-Build/trunk/lib/Module/Build/Base.pm (original)
+++ Module-Build/trunk/lib/Module/Build/Base.pm Thu Aug 27 08:28:16 2009
@@ -836,7 +836,9 @@
 __PACKAGE__->add_property(build_bat => 0);
 __PACKAGE__->add_property(config_dir => '_build');
 __PACKAGE__->add_property(include_dirs => []);
+__PACKAGE__->add_property(license => 'unknown');
 __PACKAGE__->add_property(metafile => 'META.yml');
+__PACKAGE__->add_property(mymetafile => 'MYMETA.yml');
 __PACKAGE__->add_property(recurse_into => []);
 __PACKAGE__->add_property(use_rcfile => 1);
 __PACKAGE__->add_property(create_packlist => 1);
@@ -906,7 +908,6 @@
   has_config_data
   install_base
   libdoc_dirs
-  license
   magic_number
   mb_version
   module_name
@@ -1537,17 +1538,26 @@
     = map $self->$_(), qw(build_script dist_name dist_version);
   
   if ( $self->delete_filetree($build_script) ) {
-    $self->log_info("Removed previous script '$build_script'\n\n");
+    $self->log_info("Removed previous script '$build_script'\n");
   }
 
   $self->log_info("Creating new '$build_script' script for ",
-                 "'$dist_name' version '$dist_version'\n");
+                 "'$dist_name' version '$dist_version'\n\n");
   my $fh = IO::File->new(">$build_script") or die "Can't create 
'$build_script': $!";
   $self->print_build_script($fh);
   close $fh;
   
   $self->make_executable($build_script);
-
+  
+  my $mymetafile = $self->mymetafile;
+  if ( $self->delete_filetree($mymetafile) ) {
+    $self->log_info("Removed previous '$mymetafile'\n");
+  }
+  $self->log_info("Creating new '$mymetafile' with configuration results\n");
+  if ( $self->write_metafile( $mymetafile, $self->generate_metadata ) ) {
+    $self->add_to_cleanup( $mymetafile );
+  }
+  
   return 1;
 }
 
@@ -3127,6 +3137,8 @@
 sub ACTION_distcheck {
   my ($self) = @_;
 
+  $self->_check_mymeta_skip('MANIFEST.SKIP');
+
   require ExtUtils::Manifest;
   local $^W; # ExtUtils::Manifest is not warnings clean.
   my ($missing, $extra) = ExtUtils::Manifest::fullcheck();
@@ -3141,6 +3153,21 @@
   }
 }
 
+sub _check_mymeta_skip {
+  my $self = shift;
+  my $maniskip = shift || 'MANIFEST.SKIP';
+
+  require ExtUtils::Manifest;
+  local $^W; # ExtUtils::Manifest is not warnings clean.
+
+  my $skip_check = ExtUtils::Manifest::maniskip($maniskip);
+  my $mymetafile = $self->mymetafile;
+  if ( ! $skip_check->( $mymetafile ) ) {
+    $self->log_warn("File '$maniskip' does not include '$mymetafile'. Adding 
it now.\n");
+    $self->_append_maniskip("^$mymetafile\$", $maniskip);
+  }
+}
+
 sub _add_to_manifest {
   my ($self, $manifest, $lines) = @_;
   $lines = [$lines] unless ref $lines;
@@ -3330,9 +3357,12 @@
   my ($self) = @_;
 
   $self->depends_on('distmeta');
+  
+  # Must not include MYMETA
+  $self->_check_mymeta_skip('MANIFEST.SKIP');
 
   my $dist_files = $self->_read_manifest('MANIFEST')
-    or die "Can't create distdir without a MANIFEST file - run 'manifest' 
action first";
+    or die "Can't create distdir without a MANIFEST file - run 'manifest' 
action first.\n";
   delete $dist_files->{SIGNATURE};  # Don't copy, create a fresh one
   die "No files found in MANIFEST - try running 'manifest' action?\n"
     unless ($dist_files and keys %$dist_files);
@@ -3436,6 +3466,19 @@
 }
 
 
+
+sub _append_maniskip {
+  my $self = shift;
+  my $skip = shift;
+  my $file = shift || 'MANIFEST.SKIP';
+  return unless defined $skip && length $skip;
+  my $fh = IO::File->new(">> $file")
+    or die "Can't open $file: $!";
+
+  print $fh "$skip\n";
+  $fh->close();
+}
+
 sub _write_default_maniskip {
   my $self = shift;
   my $file = shift || 'MANIFEST.SKIP';
@@ -3446,6 +3489,8 @@
                                                : $self->_slurp( 
$self->_default_maniskip );
 
   $content .= <<'EOF';
+# Avoid configuration metadata file
+^MYMETA.yml$
 
 # Avoid Module::Build generated and utility files.
 \bBuild$
@@ -3470,10 +3515,15 @@
   my ($self) = @_;
 
   my $maniskip = 'MANIFEST.SKIP';
-  unless ( -e 'MANIFEST' || -e $maniskip ) {
+
+  if ( ! -e $maniskip ) {
     $self->log_warn("File '$maniskip' does not exist: Creating a default 
'$maniskip'\n");
     $self->_write_default_maniskip($maniskip);
   }
+  else {
+    # MYMETA must not be added to MANIFEST, so always confirm the skip
+    $self->_check_mymeta_skip( $maniskip );
+  }
 
   require ExtUtils::Manifest;  # ExtUtils::Manifest is not warnings clean.
   local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
@@ -3718,7 +3768,7 @@
   foreach (qw(dist_name dist_version dist_author dist_abstract license)) {
     (my $name = $_) =~ s/^dist_//;
     $add_node->($name, $self->$_());
-    die "ERROR: Missing required field '$_' for META.yml\n"
+    die "ERROR: Missing required field '$_' for metafile\n"
       unless defined($node->{$name}) && length($node->{$name});
   }
   $node->{version} = $self->normalize_version($node->{version}); 
@@ -3771,7 +3821,7 @@
   my $pkgs = eval { $self->find_dist_packages };
   if ($@) {
     $self->log_warn("$...@\nwarning: Possible missing or corrupt 'MANIFEST' 
file.\n" .
-                   "Nothing to enter for 'provides' field in META.yml\n");
+                   "Nothing to enter for 'provides' field in metafile.\n");
   } else {
     $node->{provides} = $pkgs if %$pkgs;
   }
@@ -3815,7 +3865,7 @@
   # private stock.
 
   my $manifest = $self->_read_manifest('MANIFEST')
-    or die "Can't find dist packages without a MANIFEST file - run 'manifest' 
action first";
+    or die "Can't find dist packages without a MANIFEST file\nRun 'Build 
manifest' to generate one\n";
 
   # Localize
   my %dist_files = map { $self->localize_file_path($_) => $_ }

Modified: Module-Build/trunk/t/metadata.t
==============================================================================
--- Module-Build/trunk/t/metadata.t     (original)
+++ Module-Build/trunk/t/metadata.t     Thu Aug 27 08:28:16 2009
@@ -366,7 +366,7 @@
 $VERSION = '2.34';
 ---
 $dist->regen( clean => 1 );
-$mb = new_build();
+stderr_of( sub { $mb = new_build(); } );
 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
 is_deeply($provides,
          {'Simple' => { file => $simple_file,
@@ -470,7 +470,7 @@
 $VERSION = '2.34';
 ---
 $dist->regen( clean => 1 );
-$mb = new_build();
+stderr_of( sub { $mb = new_build(); } );
 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
 # XXX Should 'Foo' exist ??? Can't predict values for file & version
 ok( exists( $provides->{Foo} ) );

Modified: Module-Build/trunk/t/metadata2.t
==============================================================================
--- Module-Build/trunk/t/metadata2.t    (original)
+++ Module-Build/trunk/t/metadata2.t    Thu Aug 27 08:28:16 2009
@@ -26,7 +26,8 @@
 
   ok ! -e 'MANIFEST';
 
-  my $mb = Module::Build->new_from_context;
+  my $mb;
+  stderr_of( sub { $mb = Module::Build->new_from_context } );
 
   my $out;
   $out = eval { stderr_of(sub{$mb->dispatch('distmeta')}) };

Added: Module-Build/trunk/t/mymeta.t
==============================================================================
--- (empty file)
+++ Module-Build/trunk/t/mymeta.t       Thu Aug 27 08:28:16 2009
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+use strict;
+use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
+use MBTest tests => 5;
+
+require_ok('Module::Build');
+ensure_blib('Module::Build');
+
+my $tmp = MBTest->tmpdir;
+
+use DistGen;
+my $dist = DistGen->new( dir => $tmp );
+$dist->regen;
+END{ $dist->remove }
+
+$dist->chdir_in;
+
+#########################
+
+# Test MYMETA generation
+{
+  ok( ! -e "MYMETA.yml", "MYMETA.yml doesn't exist before Build.PL runs" );
+  my $output;
+  $output = stdout_of sub { $dist->run_build_pl };
+  like($output, qr/Creating new 'MYMETA.yml' with configuration results/,
+    "Saw MYMETA.yml creation message"
+  );
+  ok( -e "MYMETA.yml", "MYMETA.yml exists" );
+}
+
+#########################
+

Modified: Module-Build/trunk/t/runthrough.t
==============================================================================
--- Module-Build/trunk/t/runthrough.t   (original)
+++ Module-Build/trunk/t/runthrough.t   Thu Aug 27 08:28:16 2009
@@ -24,6 +24,9 @@
   requires    => { 'File::Spec' => 0 },
 });
 
+$dist->add_file( 'MANIFEST.SKIP', <<'---' );
+^MYMETA.yml$
+---
 $dist->add_file( 'script', <<'---' );
 #!perl -w
 print "Hello, World!\n";

Reply via email to