[svn:parrot] r36573 - in branches/update_pod: docs/dev docs/pdds runtime/parrot/library src src/pmc t/doc

jkeenan at svn.parrot.org jkeenan at svn.parrot.org
Wed Feb 11 03:48:27 UTC 2009


Author: jkeenan
Date: Wed Feb 11 03:48:25 2009
New Revision: 36573
URL: https://trac.parrot.org/parrot/changeset/36573

Log:
Initial stage of work on https://trac.parrot.org/parrot/ticket/292 led to
refactoring of t/doc/pod.t.  During this, POD errors were discovered in
several files.  Example:  directive '=head5' is not available (at least as far
as 'podchecker' is concerned).  Corrected POD errors.

Modified:
   branches/update_pod/docs/dev/byteorder.pod
   branches/update_pod/docs/pdds/pdd13_bytecode.pod
   branches/update_pod/docs/pdds/pdd21_namespaces.pod
   branches/update_pod/runtime/parrot/library/TclLibrary.pir
   branches/update_pod/src/pmc/resizablestringarray.pmc
   branches/update_pod/src/runops_cores.c
   branches/update_pod/t/doc/pod.t

Modified: branches/update_pod/docs/dev/byteorder.pod
==============================================================================
--- branches/update_pod/docs/dev/byteorder.pod	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/docs/dev/byteorder.pod	Wed Feb 11 03:48:25 2009	(r36573)
@@ -83,6 +83,8 @@
 format.  Only a C<memcpy> is performed if the native format is already big
 endian.
 
+=back
+
 =head1 Low level FLOATVAL fetch and convert functions
 
 We support two different floattypes, stored in the pbc header as 0 or 1.

Modified: branches/update_pod/docs/pdds/pdd13_bytecode.pod
==============================================================================
--- branches/update_pod/docs/pdds/pdd13_bytecode.pod	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/docs/pdds/pdd13_bytecode.pod	Wed Feb 11 03:48:25 2009	(r36573)
@@ -193,7 +193,9 @@
 that is reading the PBC file do not match these, it needs to transform the
 words making up the rest of the packfile.
 
-=head5 Bytecode File Version Numbers
+=over 4
+
+=item * Bytecode File Version Numbers
 
 The bytecode file version number exists to decouple the format of the bytecode
 file from the version of the Parrot implementation that is reading/writing it.
@@ -230,6 +232,7 @@
 
   MAJOR.MINOR DATE NAME DESCRIPTION
 
+=back
 
 =head4 Directory Format Header
 
@@ -407,12 +410,14 @@
 All constants that are not a multiple of the word size in length must be
 padded with trailing zero bytes up to a word size boundary.
 
-=head5 Number Constants
+=over 4
+
+=item * Number Constants
 
 The number is stored in the format defined in the Packfile header. Any padding
 that is needed will follow.
 
-=head5 String Constants
+=item * String Constants
 
 String constants are stored in the following format, with offsets relative to
 the start of the constant including its type.
@@ -435,13 +440,13 @@
   | 5      | n      | String data with trailing zero padding as required.    |
   +--------+--------+--------------------------------------------------------+
 
-=head5 PMC Constants
+=item * PMC Constants
 
 PMCs that can be saved in packfiles as constants implement the freeze and thaw
 v-table methods. Their frozen data is placed in a string, stored in the same
 format as a string constant.
 
-=head5 Key Constants
+=item * Key Constants
 
 Key constants are made up a number of components, where one component is a
 "dimension" in the key. The number of components in the key is stored at the
@@ -477,6 +482,7 @@
 
 {{ TODO: Figure out slice bits and document them here. }}
 
+=back
 
 =head4 Fixup Segment
 
@@ -738,19 +744,21 @@
 This PMC represents the packfile overall. It will be constructed by the VM
 when reading a packfile. It implements the following methods.
 
-=head5 C<get_string> (v-table)
+=over 4
+
+=item * C<get_string> (v-table)
 
 Serializes this packfile data structure into a bytestream ready to be written
 to disk (that is, maps from PMCs to on-disk representation).
 
-=head5 C<set_string_native> (v-table)
+=item * C<set_string_native> (v-table)
 
 Takes a string containing an entire packfile in the on-disk format, attempts
 to unpack it into a tree of Packfile PMCs and sets this Packfile PMC to
 represent the top of that tree (that is, maps from on-disk representation to a
 tree of PMCs).
 
-=head5 C<get_integer_keyed_str> (v-table)
+=item * C<get_integer_keyed_str> (v-table)
 
 Used to get data about fields in the header that have an integer value. Valid
 keys are:
@@ -779,7 +787,7 @@
 
 =back
 
-=head5 C<get_string_keyed_str> (v-table)
+=item * C<get_string_keyed_str> (v-table)
 
 Used to get data about fields in the header that have a string value. Valid
 keys are:
@@ -790,7 +798,7 @@
 
 =back
 
-=head5 C<set_integer_keyed_str> (v-table)
+=item * C<set_integer_keyed_str> (v-table)
 
 Used to set fields in the packfile header. Some fields are not allowed to be
 written since they are determined by the VM when serializing the packfile for
@@ -817,11 +825,12 @@
 v-table method). Setting an invalid uuid_type value will cause an exception
 to be thrown immediately.
 
-=head5 C<get_directory()>
+=item * C<get_directory()>
 
 Returns the PackfileDirectory PMC that represents the directory segment at the
 start of the packfile.
 
+=back
 
 =head4 PackfileSegment.pmc
 
@@ -829,17 +838,20 @@
 abstract methods, which are to be implemented by all subclasses. They will not
 be listed under the method list for other segment PMCs to save space.
 
-=head5 C<STRING* pack()>
+=over 4
+
+=item * C<STRING* pack()>
 
 Packs the segment into the on-disk format and returns a string holding it.
 
-=head5 C<unpack(STRING*)>
+=item * C<unpack(STRING*)>
 
 Takes the packed representation for a segment of the given type and then
 unpacks it, setting this PMC to represent that segment as a result of the
 unpacking. If an error occurs during the unpacking process, an exception will
 be thrown.
 
+=back
 
 =head4 PackfileDirectory.pmc (isa PackfileSegment)
 
@@ -848,38 +860,41 @@
 at that position in the segments table. When indexed using a string key, it
 looks for a segment of that name. It implements the following methods:
 
-=head5 C<elements> (v-table)
+=over 4
+
+=item * C<elements> (v-table)
 
 Gets the number of segments listed in the directory.
 
-=head5 C<get_pmc_keyed_int> (v-table)
+=item * C<get_pmc_keyed_int> (v-table)
 
 Gets a PackfileSegment PMC or an appropriate subclass of it representing the
 segment at the specified index in the directory segment.
 
-=head5 C<get_string_keyed_int> (v-table)
+=item * C<get_string_keyed_int> (v-table)
 
 Gets a string containing the name of the segment at the specified index in the
 directory segment.
 
-=head5 C<get_pmc_keyed_str> (v-table)
+=item * C<get_pmc_keyed_str> (v-table)
 
 Searches the directory for a segment with the given name and, if one exists,
 returns a PackfileSegment PMC (or one of its subclasses) representing it.
 
-=head5 C<set_pmc_keyed_str> (v-table)
+=item * C<set_pmc_keyed_str> (v-table)
 
 Adds a PackfileSegment PMC (or a subclass of it) to the directory with the
 name specified by the key. This is the only way to add another segment to the
 directory. If a segment of the given name already exists in the directory, it
 will be replaced with the supplied PMC.
 
-=head5 C<delete_keyed_str> (v-table)
+=item * C<delete_keyed_str> (v-table)
 
 Removes the PackfileSegment PMC from the directory which has the name
 specified by the key.  This is the only way to remove a segment from the
 directory.
 
+=back
 
 =head4 RawSegment.pmc (isa PackfileSegment)
 
@@ -887,23 +902,26 @@
 lowest possible level of access to a segment, and covers both the default and
 bytecode segment types. It implements the following methods:
 
-=head5 C<get_integer_keyed_int> (v-table)
+=over 4
+
+=item * C<get_integer_keyed_int> (v-table)
 
 Reads the integer at the specified offset into the segment, excluding the data
 in the common segment header but including the data making up additional
 fields in the header for a specific type of segment.
 
-=head5 C<set_integer_keyed_int> (v-table)
+=item * C<set_integer_keyed_int> (v-table)
 
 Stores an integer at the specified offset into the segment. Will throw an
 exception if the segment is memory mapped.
 
-=head5 C<elements> (v-table)
+=item * C<elements> (v-table)
 
 Gets the length of the segment in words, excluding the length of the common
 segment but including the data making up additional fields in the header for a
 specific type of segment.
 
+=back
 
 =head4 PackfileConstantTable.pmc (isa PackfileSegment)
 
@@ -916,50 +934,52 @@
 
 The PMC implements the following methods:
 
-=head5 C<elements> (v-table)
+=over 4
+
+=item * C<elements> (v-table)
 
 Gets the number of constants contained in the table.
 
-=head5 C<get_number_keyed_int> (v-table)
+=item * C<get_number_keyed_int> (v-table)
 
 Gets the value of the number constant at the specified index in the constants
 table. If the constant at that position in the table is not a number, an
 exception will be thrown.
 
-=head5 C<get_string_keyed_int> (v-table)
+=item * C<get_string_keyed_int> (v-table)
 
 Gets the value of the string constant at the specified index in the constants
 table. If the constant at that position in the table is not a string, an
 exception will be thrown.
 
-=head5 C<get_pmc_keyed_int> (v-table)
+=item * C<get_pmc_keyed_int> (v-table)
 
 Gets the value of the PMC or key constant at the specified index in the
 constants table. If the constant at that position in the table is not a PMC
 or key, an exception will be thrown.
 
-=head5 C<set_number_keyed_int> (v-table)
+=item * C<set_number_keyed_int> (v-table)
 
 Sets the value of the number constant at the specified index in the constants
 table. If the constant at that position in the table is not already a number
 constant, an exception will be thrown. If it does not exist, the table will be
 extended.
 
-=head5 C<set_string_keyed_int> (v-table)
+=item * C<set_string_keyed_int> (v-table)
 
 Sets the value of the string constant at the specified index in the constants
 table. If the constant at that position in the table is not already a string
 constant, an exception will be thrown. If it does not exist, the table will be
 extended.
 
-=head5 C<set_pmc_keyed_int> (v-table)
+=item * C<set_pmc_keyed_int> (v-table)
 
 Sets the value of the PMC or key constant at the specified index in the
 constants table. If the constant at that position in the table is not already
 a PMC or key constant, an exception will be thrown. If it does not exist, the
 table will be extended.
 
-=head5 C<int get_type(int)>
+=item * C<int get_type(int)>
 
 Returns an integer value denoting the type of the constant at the specified
 index. Possible values are:
@@ -978,6 +998,7 @@
   | 0x6B   | Key Constant                                                    |
   +--------+-----------------------------------------------------------------+
 
+=back
 
 =head4 PackfileFixupTable.pmc (isa PackfileSegment)
 
@@ -985,53 +1006,59 @@
 the table is represented by a PackfileFixupEntry PMC. It implements the
 following methods:
 
-=head5 C<elements> (v-table)
+=over 4
+
+=item * C<elements> (v-table)
 
 Gets the number of entries in the fixup table.
 
-=head5 C<get_pmc_keyed_int> (v-table)
+=item * C<get_pmc_keyed_int> (v-table)
 
 Gets a PackfileFixupEntry PMC for the fixup entry at the position given in
 the key. If the index is out of range, an exception will be thrown.
 
-=head5 C<set_pmc_keyed_int> (v-table)
+=item * C<set_pmc_keyed_int> (v-table)
 
 Used to add a PackfileFixupEntry PMC to the fixups table or to replace an
 existing one. If the PMC that is supplied is not of type PackfileFixupEntry,
 an exception will thrown.
 
+=back
 
 =head4 PackfileFixupEntry.pmc
 
 This PMC represents an entry in the fixup table. It implements the following
 methods.
 
-=head5 C<get_string> (v-table)
+=over 4
+
+=item * C<get_string> (v-table)
 
 Gets the label field of the fixup entry.
 
-=head5 C<set_string_native> (v-table)
+=item * C<set_string_native> (v-table)
 
 Sets the label field of the fixup entry.
 
-=head5 C<get_integer> (v-table)
+=item * C<get_integer> (v-table)
 
 Gets the offset field of the fixup entry.
 
-=head5 C<set_integer_native> (v-table)
+=item * C<set_integer_native> (v-table)
 
 Sets the offset field of the fixup entry.
 
-=head5 C<int get_type()>
+=item * C<int get_type()>
 
 Gets the type of the fixup entry. See the entries table for possible fixup
 types.
 
-=head5 C<set_type(int)>
+=item * C<set_type(int)>
 
 Sets the type of the fixup entry. See the entries table for possible fixup
 types. Specifying an invalid type will result in an exception.
 
+=back
 
 =head4 PackfileAnnotations.pmc (isa PackfileSegment)
 
@@ -1040,22 +1067,24 @@
 (offset, key, value) entry is represented by a PackfileAnnotation PMC. The
 following methods are implemented:
 
-=head5 C<PMC* get_key_list()>
+=over 4
+
+=item * C<PMC* get_key_list()>
 
 Returns a PackfileAnnotationKeys PMC containing the names and types of the
 annotation keys. Fetch and add to this to create a new annotation key.
 
-=head5 C<elements> (v-table)
+=item * C<elements> (v-table)
 
 Gets the number of annotations in the table.
 
-=head5 C<get_pmc_keyed_int> (v-table)
+=item * C<get_pmc_keyed_int> (v-table)
 
 Gets the annotation at the specified index. If there is no annotation at that
 index, an exception will be thrown. The PMC that is returned will always be a
 PackfileAnnotation PMC.
 
-=head5 C<set_pmc_keyed_int> (v-table)
+=item * C<set_pmc_keyed_int> (v-table)
 
 Sets the annotation at the specified index. If there is no annotation at that
 index, it is added to the list of annotations. An exception will be thrown
@@ -1075,87 +1104,90 @@
 
 =back
 
+=back
 
 =head4 PackfileAnnotationKeys.pmc
 
 This PMC represents the table of keys and the type of value that is stored
 against that key. It implements the following methods:
 
-=head5 C<get_string_keyed_int> (v-table)
+=over 4
+
+=item * C<get_string_keyed_int> (v-table)
 
 Gets the name of the annotation key specified by the index. An exception will
 be thrown if the index is out of range.
 
-=head5 C<set_string_keyed_int> (v-table)
+=item * C<set_string_keyed_int> (v-table)
 
 Sets the name of the annotation key specified by the index. If there is no key
 with that index currently, a key at that position in the table will be added.
 
-=head5 C<get_integer_keyed_int> (v-table)
+=item * C<get_integer_keyed_int> (v-table)
 
 Gets an integer representing the type of the value that is stored with the key
 at the specified index. An exception will be thrown if the index is out of
 range.
 
-=head5 C<set_integer_keyed_int> (v-table)
+=item * C<set_integer_keyed_int> (v-table)
 
 Sets the type of the value that is stored with the key at the specified index.
 If there is no key with that index currently, a key at that position in the
 table will be added.
 
+=back
 
 =head4 PackfileAnnotation.pmc
 
 This PMC represents an individual bytecode annotation entry in the annotations
 segment. It implements the following methods:
 
-=head5 C<int get_offset()>
+=over 4
+
+=item * C<int get_offset()>
 
 Gets the offset into the bytecode of the instruction that is being annotated.
 
-=head5 C<set_offset(int)>
+=item * C<set_offset(int)>
 
 Sets the offset into the bytecode of the instruction that is being annotated.
 
-=head5 C<int get_key_id()>
+=item * C<int get_key_id()>
 
 Gets the ID of the key of the annotation.
 
-=head5 C<int set_key_id()>
+=item * C<int set_key_id()>
 
 Sets the ID of the key of the annotation.
 
-=head5 C<get_integer> (v-table)
+=item * C<get_integer> (v-table)
 
 Gets the value of the annotation. This may be, depending upon the type of the
 annotation, an integer annotation or an index into the constants table.
 
-=head5 C<set_integer> (v-table)
+=item * C<set_integer> (v-table)
 
 Sets the value of the annotation. This may be, depending upon the type of the
 annotation, an integer annotation or an index into the constants table.
 
+=back
 
 =head2 Language Notes
 
 None.
 
-
 =head2 Attachments
 
 None.
 
-
 =head2 Footnotes
 
 None.
 
-
 =head2 References
 
 None.
 
-
 =cut
 
 __END__

Modified: branches/update_pod/docs/pdds/pdd21_namespaces.pod
==============================================================================
--- branches/update_pod/docs/pdds/pdd21_namespaces.pod	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/docs/pdds/pdd21_namespaces.pod	Wed Feb 11 03:48:25 2009	(r36573)
@@ -123,7 +123,7 @@
 Parrot namespaces assist with interoperability by providing two interface
 subsets: the I<untyped interface> and the I<typed interface>.
 
-=head5 Untyped Interface
+=head4 Untyped Interface
 
 Each HLL may, when working with its own namespace objects, use the I<untyped
 interface>, which allows direct naming in the native style of the namespace's
@@ -152,7 +152,7 @@
 
 =back
 
-=head5 Typed Interface
+=head4 Typed Interface
 
 When a given namespace's HLL is either different from the current HLL or
 unknown, an HLL should generally use only the language-agnostic namespace

Modified: branches/update_pod/runtime/parrot/library/TclLibrary.pir
==============================================================================
--- branches/update_pod/runtime/parrot/library/TclLibrary.pir	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/runtime/parrot/library/TclLibrary.pir	Wed Feb 11 03:48:25 2009	(r36573)
@@ -113,6 +113,8 @@
     f_tclinit(interp)
 .end
 
+=over 4
+
 =item _init
 
 Performs the initialization of Tcl bridge, namely instantiates TclLibrary class
@@ -236,9 +238,6 @@
 
 .end
 
-=comment
-=cut
-
 #
 #static SV *
 #SvFromTclObj(pTHX_ Tcl_Obj *objPtr)
@@ -402,7 +401,7 @@
     die message
 .end
 
-
+=back
 
 
 =head1 SEE ALSO

Modified: branches/update_pod/src/pmc/resizablestringarray.pmc
==============================================================================
--- branches/update_pod/src/pmc/resizablestringarray.pmc	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/src/pmc/resizablestringarray.pmc	Wed Feb 11 03:48:25 2009	(r36573)
@@ -29,8 +29,6 @@
 
 =over 4
 
-=over 4
-
 =item C<void init()>
 
 Initializes the array.

Modified: branches/update_pod/src/runops_cores.c
==============================================================================
--- branches/update_pod/src/runops_cores.c	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/src/runops_cores.c	Wed Feb 11 03:48:25 2009	(r36573)
@@ -176,7 +176,7 @@
 mechanism is used will be called after every single opcode, and some large
 programs may have millions of opcodes! Every single machine instruction
 that can be cut out of the dispatch mechanism could increase the execution
-speed of Parrot in a significant and noticable way. N<The dispatch mechanism
+speed of Parrot in a significant and noticable way. B<The dispatch mechanism
 used by the various runcores is hardly the largest performance bottleneck in
 Parrot anyway, but we like to use faster cores to shave every little bit of
 speed out of the system>.
@@ -187,6 +187,8 @@
 
 =head2 Tracing Core
 
+To come.
+
 =head2 Profiling Core
 
 The profiling core analyzes the performance of Parrot, and helps to

Modified: branches/update_pod/t/doc/pod.t
==============================================================================
--- branches/update_pod/t/doc/pod.t	Wed Feb 11 03:43:09 2009	(r36572)
+++ branches/update_pod/t/doc/pod.t	Wed Feb 11 03:48:25 2009	(r36573)
@@ -2,37 +2,17 @@
 # Copyright (C) 2001-2009, The Perl Foundation.
 # $Id$
 
-=head1 NAME
-
-t/doc/pod.t - Pod document syntax tests
-
-=head1 SYNOPSIS
-
-    # test all files
-    % prove t/doc/pod.t
-
-    # test specific files
-    % perl t/doc/pod.t perl_module.pm perl_file.pl
-
-=head1 DESCRIPTION
-
-Tests the Pod syntax for all files listed in F<MANIFEST> and
-F<MANIFEST.generated> that appear to contain Pod markup. If any files
-contain invalid POD markup, they are reported in the test output.
-Use C<podchecker> to ferret out individual issues.
-
-=cut
-
 use strict;
 use warnings;
 
 use lib qw( . lib ../lib ../../lib );
 
+use Carp;
 use Test::More;
 use Parrot::Config;
 use ExtUtils::Manifest qw(maniread);
 
-use vars qw(@failed_syntax @empty_description);
+our (@failed_syntax, @empty_description);
 
 BEGIN {
     eval 'use Pod::Find';
@@ -52,62 +32,51 @@
 # RT #44437 this should really be using src_dir instead of build_dir but it
 # does not exist (yet)
 my $build_dir    = $PConfig{build_dir};
-my $manifest     = maniread("$build_dir/MANIFEST");
-my $manifest_gen = maniread("$build_dir/MANIFEST.generated");
-
-# if we have files passed in at the command line, use them
-my @files;
-if (@ARGV) {
-    @files = <@ARGV>;
-}
-else {
-    diag "finding files with POD, this may take a minute.";
-    @files = ( keys(%$manifest), keys(%$manifest_gen) );
-}
-
-foreach my $file (@files) {
-    $file = "$build_dir/$file";
-
-    # skip missing MANIFEST.generated files ( -e )
-    # skip binary files (including .pbc files) ( -B )
-    # skip files that pass the -e test because they resolve the .exe variant
-    next unless -T $file;
+#print STDERR $build_dir, "\n";
 
-    # Skip the book, because it uses extended O'Reilly-specific POD
-    next if $file =~ m{docs/book/};
+croak "Cannot run test if build_dir does not yet exist"
+    unless -d $build_dir;
+croak "Test cannot be run unless MANIFEST exists in build dir"
+    unless -f "$build_dir/MANIFEST";
+croak "Test cannot be run unless MANIFEST exists in build dir"
+    unless -f "$build_dir/MANIFEST.generated";
 
-    # skip files without POD
-    next unless Pod::Find::contains_pod( $file, 0 );
-
-    # skip POD generating scripts
-    next if $file =~ m/ops_summary\.pl/;
+my $manifest     = maniread("$build_dir/MANIFEST");
+my $manifest_gen = maniread("$build_dir/MANIFEST.generated");
 
-    # skip file which includes malformed POD for other testing purposes
-    next if $file =~ m{t/tools/dev/searchops/samples\.pm};
+my $need_testing_ref = identify_files_for_POD_testing( {
+    argv            => [ @ARGV  ],
+    manifest        => $manifest,
+    manifest_gen    => $manifest_gen,
+    build_dir       => $build_dir,
+} );
+#print STDERR scalar(@$need_testing_ref), "\n";
 
+foreach my $file ( @{ $need_testing_ref } ) {
     # skip files with valid POD
     if (file_pod_ok($file)) {
-
         #check DESCRIPTION section on valid POD files
         push @empty_description, $file if empty_description($file);
-
     }
     else {
-
         # report whatever is not skipped
         push @failed_syntax, $file;
     }
 }
 
-my $bad_syntax_files = join( "\n", @failed_syntax );
+my $bad_syntax_files        = join( "\n", @failed_syntax );
 my $empty_description_files = join( "\n", @empty_description);
-my $nempty_description = scalar( @empty_description );
+my $nempty_description      = scalar( @empty_description );
 
 is( $bad_syntax_files, q{}, 'Pod syntax correct' );    # only ok if everything passed
 
 TODO: {
     local $TODO = "not quite done yet";
-    is( $empty_description_files, q{}, 'All Pod files have non-empty DESCRIPTION sections' );
+    is(
+        $empty_description_files,
+        q{},
+        'All Pod files have non-empty DESCRIPTION sections'
+    );
 }
 
 diag("You should use podchecker to check the failed files.\n")
@@ -116,6 +85,70 @@
 diag("Found $nempty_description files without DESCRIPTION sections.\n")
     if $nempty_description;
 
+#################### SUBROUTINES ####################
+
+sub identify_files_for_POD_testing {
+    my $args = shift;
+    my ( @files, %files_needing_analysis );
+
+    if ( scalar(@{ $args->{argv} }) ) {
+        @files = @{ $args->{argv} };
+    }
+    else {
+        diag "finding files with POD, this may take a minute.";
+        @files = (
+            keys(%{ $args->{manifest} }),
+            keys(%{ $args->{manifest_gen} })
+        );
+    }
+    $files_needing_analysis{$_}++ for @files;
+#    foreach my $k (keys %files_needing_analysis) {
+#        print STDERR "$k\t$files_needing_analysis{$k}\n"
+#        if $files_needing_analysis{$k} > 1;
+#    }
+    
+    FILE: foreach my $file ( keys %files_needing_analysis ) {
+        my $full_file = qq|$args->{build_dir}/$file|;
+    
+        # skip missing MANIFEST.generated files ( -e )
+        # skip binary files (including .pbc files) ( -B )
+        # skip files that pass the -e test because they resolve the .exe variant
+        unless (-T $full_file) {
+            delete $files_needing_analysis{ $file };
+            next FILE;
+        }
+    
+        # Skip the book, because it uses extended O'Reilly-specific POD
+        if ($full_file =~ m{docs/book/}) {
+            delete $files_needing_analysis{ $file };
+            next FILE;
+        }
+        # skip files without POD
+        unless (Pod::Find::contains_pod( $full_file, 0 )) {
+            delete $files_needing_analysis{ $file };
+            next FILE;
+        }
+    
+        # skip POD generating scripts
+        if ($full_file =~ m/ops_summary\.pl/) {
+            delete $files_needing_analysis{ $file };
+            next FILE;
+        }
+    
+        # skip file which includes malformed POD for other testing purposes
+        if ($full_file =~ m{
+                t/tools/dev/searchops/samples\.pm
+                |
+                languages/pod/test\.pod
+            }x
+        ) {
+            delete $files_needing_analysis{ $file };
+            next FILE;
+        }
+    }
+    return [ keys %files_needing_analysis ];
+}
+
 # Pulled from Test::Pod
 sub file_pod_ok {
     my $file    = shift;
@@ -142,6 +175,28 @@
     return 0;
 }
 
+
+=head1 NAME
+
+t/doc/pod.t - Pod document syntax tests
+
+=head1 SYNOPSIS
+
+    # test all files
+    % prove t/doc/pod.t
+
+    # test specific files
+    % perl t/doc/pod.t perl_module.pm perl_file.pl
+
+=head1 DESCRIPTION
+
+Tests the Pod syntax for all files listed in F<MANIFEST> and
+F<MANIFEST.generated> that appear to contain Pod markup. If any files
+contain invalid POD markup, they are reported in the test output.
+Use C<podchecker> to ferret out individual issues.
+
+=cut
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4


More information about the parrot-commits mailing list