test we don't go backwards on POD errors
authorTony Cook <tony@develop-help.com>
Tue, 7 Aug 2012 10:28:53 +0000 (20:28 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 7 Aug 2012 10:28:53 +0000 (20:28 +1000)
MANIFEST
Makefile
t/data/known_pod_issues.txt [new file with mode: 0644]
t/t98podcheck.t

index fb74e86..17c2841 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -845,6 +845,7 @@ t/cfg/cfg/99end.cfg
 t/cfg/isafile.cfg
 t/cfg/t/varinc.cfg
 t/data/govhouse.jpg
+t/data/known_pod_issues.txt
 t/data/t101.jpg
 t/t000load.t
 t/t00smoke.t                   makes a request to most of the scripts
index 2f13cd3..55b3c04 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -116,6 +116,9 @@ TEST_VERBOSE=0
 test: testup
        $(PERL) '-MTest::Harness=runtests,$$verbose' -Isite/cgi-bin/modules -It -e '$$verbose=$(TEST_VERBOSE); runtests @ARGV' $(TEST_FILES)
 
+regen_known_errors:
+       $(PERL) t/t98podcheck.t -r
+
 manicheck:
        $(PERL) -MExtUtils::Manifest=manicheck -e 'manicheck()'
 
diff --git a/t/data/known_pod_issues.txt b/t/data/known_pod_issues.txt
new file mode 100644 (file)
index 0000000..fafc94d
--- /dev/null
@@ -0,0 +1,288 @@
+INSTALL.pod    2 unescaped <> in paragraph     2
+INSTALL.pod    previous =item has no contents  1
+site/cgi-bin/admin/datadump.pl 2 unescaped <> in paragraph     1
+site/cgi-bin/admin/datadump.pl Verbatim paragraph in NAME section      1
+site/cgi-bin/admin/generate.pl 2 unescaped <> in paragraph     1
+site/cgi-bin/admin/makeIndex.pl        2 unescaped <> in paragraph     1
+site/cgi-bin/admin/reorder.pl  2 unescaped <> in paragraph     1
+site/cgi-bin/affiliate.pl      2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Article.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Articles.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/AdminMenu.pm  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Cache.pm      1 unescaped <> in paragraph     4
+site/cgi-bin/modules/BSE/Cache.pm      =over on line 59 without closing =back  1
+site/cgi-bin/modules/BSE/Cache.pm      Spurious =cut command   1
+site/cgi-bin/modules/BSE/Cfg.pm        1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Cfg.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Cfg.pm        =over on line 34 without closing =back (at head1)       1
+site/cgi-bin/modules/BSE/Cfg.pm        Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/CfgInfo.pm    2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Console.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/Custom.pm     Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/CustomBase.pm 1 unescaped <> in paragraph     9
+site/cgi-bin/modules/BSE/CustomBase.pm =item without previous =over    1
+site/cgi-bin/modules/BSE/CustomBase.pm Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/DB.pm 1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/DB.pm 2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/DB.pm Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Dynamic/Article.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/Edit/Article.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Edit/Article.pm       =item without previous =over    1
+site/cgi-bin/modules/BSE/Edit/Article.pm       No items in =over (at line 3060) / =back list   1
+site/cgi-bin/modules/BSE/Edit/Article.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Edit/Product.pm       =over on line 693 without closing =back 1
+site/cgi-bin/modules/BSE/Edit/Site.pm  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/FileBehaviour.pm      1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/FileHandler/Base.pm   1 unescaped <> in paragraph     9
+site/cgi-bin/modules/BSE/FileHandler/Base.pm   =over on line 31 without closing =back  1
+site/cgi-bin/modules/BSE/FileHandler/FLV.pm    2 unescaped <> in paragraph     2
+site/cgi-bin/modules/BSE/FileHandler/FLV.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/FileHandler/FLV.pm    empty section in previous paragraph     1
+site/cgi-bin/modules/BSE/ImageClean.pm 2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/ImageHandler/Flash.pm 2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/ImageHandler/Flash.pm =over on line 201 without closing =back 1
+site/cgi-bin/modules/BSE/Mail.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Mail.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Message.pm    1 unescaped <> in paragraph     2
+site/cgi-bin/modules/BSE/Message.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/MessageScanner.pm     1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/MessageScanner.pm     =item without previous =over    1
+site/cgi-bin/modules/BSE/NLFilter/SQL.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Password.pod  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Request/Base.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Request/Base.pm       =item without previous =over    1
+site/cgi-bin/modules/BSE/Session.pm    2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Shop/PaymentTypes.pm  =item without previous =over    1
+site/cgi-bin/modules/BSE/Shop/Util.pm  =item without previous =over    1
+site/cgi-bin/modules/BSE/Sort.pm       =item without previous =over    1
+site/cgi-bin/modules/BSE/Sort.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Storage/Base.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/StorageMgr/Base.pm    1 unescaped <> in paragraph     6
+site/cgi-bin/modules/BSE/TB/ArticleFile.pm     =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/AuditLog.pm        =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/Files.pm   =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/Images.pm  =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/Order.pm   =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/Orders.pm  =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/PriceTier.pm       =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/SiteCommon.pm      2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/TB/SiteCommon.pm      =item without previous =over    1
+site/cgi-bin/modules/BSE/TB/SiteCommon.pm      =over on line 22 without closing =back (at head1)       1
+site/cgi-bin/modules/BSE/TB/SiteCommon.pm      multiple occurrence of link target 'menu_kids'  1
+site/cgi-bin/modules/BSE/TB/TagCategory.pm     2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/TB/TagOwner.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/TB/TagOwners.pm       1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/TB/TagOwners.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/TB/Tags.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/Thumb/Imager.pm       1 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/UI/AdminImageClean.pm 2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/UI/AdminImageClean.pm 4 unescaped <> in paragraph     2
+site/cgi-bin/modules/BSE/UI/AdminImageClean.pm No argument for =item   2
+site/cgi-bin/modules/BSE/UI/AdminModules.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       =item without previous =over    1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       Apparent command =head2 not preceded by blank line      2
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'date name'  1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'hiddenNote' 1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'message'    1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'money name' 1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'order name' 1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'product name'       1
+site/cgi-bin/modules/BSE/UI/AdminShop.pm       multiple occurrence of link target 'script'     1
+site/cgi-bin/modules/BSE/UI/Affiliate.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/UI/Background.pm      =item without previous =over    1
+site/cgi-bin/modules/BSE/UI/Formmail.pm        =item without previous =over    1
+site/cgi-bin/modules/BSE/UI/Shop.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/UserReg.pm    =item without previous =over    1
+site/cgi-bin/modules/BSE/UserReg.pm    Unknown command 'target'        2
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   1 unescaped <> in paragraph     10
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   10 unescaped <> in paragraph    1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   2 unescaped <> in paragraph     3
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   8 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   No items in =over (at line 1237) / =back list   1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   No items in =over (at line 1252) / =back list   1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   No items in =over (at line 643) / =back list    1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   No items in =over (at line 854) / =back list    1
+site/cgi-bin/modules/BSE/Util/DynamicTags.pm   No items in =over (at line 941) / =back list    1
+site/cgi-bin/modules/BSE/Util/HTML.pm  2 unescaped <> in paragraph     2
+site/cgi-bin/modules/BSE/Util/SQL.pm   =over on line 37 without closing =back  1
+site/cgi-bin/modules/BSE/Util/SQL.pm   Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Util/Secure.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/BSE/Util/Secure.pm        =over on line 25 without closing =back (at head1)       1
+site/cgi-bin/modules/BSE/Util/Secure.pm        Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/BSE/Util/Tags.pm  =item without previous =over    1
+site/cgi-bin/modules/BSE/Util/Tags.pm  No items in =over (at line 1255) / =back list   1
+site/cgi-bin/modules/BSE/Variables.pm  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Courier/FixedAU.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Cfg.pm    1 unescaped <> in paragraph     2
+site/cgi-bin/modules/DevHelp/Cfg.pm    2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Cfg.pm    =over on line 259 without closing =back (at head1)      1
+site/cgi-bin/modules/DevHelp/Cfg.pm    Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/Date.pm   =item without previous =over    1
+site/cgi-bin/modules/DevHelp/DynSort.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/DynSort.pm        Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/FileUpload.pm     1 unescaped <> in paragraph     3
+site/cgi-bin/modules/DevHelp/FileUpload.pm     2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/FileUpload.pm     Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/HTML.pm   2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Payments.pod      2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Payments/Eway.pm  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Payments/Eway.pm  Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/Payments/SecurePay.pm     Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/Payments/SecurePayXML.pm  Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/DevHelp/Payments/Test.pm  2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Payments/Test.pm  =back without previous =over    1
+site/cgi-bin/modules/DevHelp/Tags/Iterate.pm   =item without previous =over    1
+site/cgi-bin/modules/DevHelp/Validate.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/DevHelp/Validate.pm       empty section in previous paragraph     1
+site/cgi-bin/modules/DevHelp/Validate.pm       multiple occurrence of link target 'confirm'    1
+site/cgi-bin/modules/DevHelp/Validate.pm       multiple occurrence of link target 'date'       1
+site/cgi-bin/modules/DevHelp/Validate.pm       multiple occurrence of link target 'required'   1
+site/cgi-bin/modules/DevHelp/Validate.pm       multiple occurrence of link target 'rules'      1
+site/cgi-bin/modules/DevHelp/Validate.pm       unresolved internal link 'CONFIGURED VALIDATON' 1
+site/cgi-bin/modules/Generate.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Generate.pm       =item without previous =over    1
+site/cgi-bin/modules/Generate.pm       empty section in previous paragraph     1
+site/cgi-bin/modules/Generate/Article.pm       1 unescaped <> in paragraph     4
+site/cgi-bin/modules/Generate/Article.pm       2 unescaped <> in paragraph     12
+site/cgi-bin/modules/Generate/Article.pm       4 unescaped <> in paragraph     1
+site/cgi-bin/modules/Generate/Article.pm       6 unescaped <> in paragraph     3
+site/cgi-bin/modules/Generate/Article.pm       =item without previous =over    1
+site/cgi-bin/modules/Generate/Article.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Generate/Article.pm       empty section in previous paragraph     2
+site/cgi-bin/modules/Generate/Article.pm       multiple occurrence of link target 'admin'      1
+site/cgi-bin/modules/Generate/Article.pm       multiple occurrence of link target 'body'       1
+site/cgi-bin/modules/Generate/Article.pm       multiple occurrence of link target 'file field' 1
+site/cgi-bin/modules/Generate/Article.pm       multiple occurrence of link target 'ifParent'   1
+site/cgi-bin/modules/Generate/Article.pm       multiple occurrence of link target 'image'      1
+site/cgi-bin/modules/Generate/Article.pm       preceding non-item paragraph(s) 1
+site/cgi-bin/modules/Generate/Article.pm       unresolved internal link 'item child'   1
+site/cgi-bin/modules/Generate/Article.pm       unresolved internal link 'item crumbs'  1
+site/cgi-bin/modules/Generate/Catalog.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Generate/Product.pm       Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Product.pm        1 unescaped <> in paragraph     1
+site/cgi-bin/modules/Product.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Product.pm        =item without previous =over    1
+site/cgi-bin/modules/SiteUser.pm       1 unescaped <> in paragraph     1
+site/cgi-bin/modules/SiteUser.pm       =item without previous =over    1
+site/cgi-bin/modules/Squirrel/GPG.pm   1 unescaped <> in paragraph     3
+site/cgi-bin/modules/Squirrel/GPG.pm   Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Squirrel/PGP5.pm  Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Squirrel/PGP6.pm  1 unescaped <> in paragraph     3
+site/cgi-bin/modules/Squirrel/PGP6.pm  Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Squirrel/Row.pm   1 unescaped <> in paragraph     9
+site/cgi-bin/modules/Squirrel/Row.pm   Unknown command 'NAME'  1
+site/cgi-bin/modules/Squirrel/Row.pm   Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Squirrel/Table.pm 1 unescaped <> in paragraph     12
+site/cgi-bin/modules/Squirrel/Table.pm =item without previous =over    1
+site/cgi-bin/modules/Squirrel/Table.pm empty section in previous paragraph     1
+site/cgi-bin/modules/Squirrel/Table.pm unresolved internal link '_where_clause'        1
+site/cgi-bin/modules/Squirrel/Template.pm      1 unescaped <> in paragraph     76
+site/cgi-bin/modules/Squirrel/Template.pm      2 unescaped <> in paragraph     15
+site/cgi-bin/modules/Squirrel/Template.pm      3 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template.pm      Verbatim paragraph in NAME section      1
+site/cgi-bin/modules/Squirrel/Template/Expr.pm 1 unescaped <> in paragraph     12
+site/cgi-bin/modules/Squirrel/Template/Expr.pm 2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Expr.pm 4 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Expr.pm multiple occurrence of link target 'Methods'    1
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapArray.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapClass.pm       2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapHash.pm        2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapScalar.pm      2 unescaped <> in paragraph     2
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapScalar.pm      =back without previous =over    1
+site/cgi-bin/modules/Squirrel/Template/Expr/WrapScalar.pm      =over on line 121 without closing =back (at head1)      1
+site/cgi-bin/modules/Squirrel/Template/Processor.pm    2 unescaped <> in paragraph     1
+site/cgi-bin/modules/Squirrel/Template/Tokenizer.pm    2 unescaped <> in paragraph     1
+site/cgi-bin/search.pl 2 unescaped <> in paragraph     1
+site/cgi-bin/search.pl Verbatim paragraph in NAME section      1
+site/cgi-bin/shop.pl   2 unescaped <> in paragraph     10
+site/cgi-bin/shop.pl   4 unescaped <> in paragraph     1
+site/cgi-bin/shop.pl   multiple occurrence of link target '%<format>'  1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'gst'        1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'id' 1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'item field' 1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'm<number>'  1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'options'    1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'order field'        1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'product field'      1
+site/cgi-bin/shop.pl   multiple occurrence of link target 'total'      1
+site/docs/TODO.pod     4 unescaped <> in paragraph     1
+site/docs/access.pod   2 unescaped <> in paragraph     1
+site/docs/access.pod   multiple occurrence of link target 'Regeneration'       1
+site/docs/bse.pod      1 unescaped <> in paragraph     26
+site/docs/bse.pod      2 unescaped <> in paragraph     74
+site/docs/bse.pod      3 unescaped <> in paragraph     3
+site/docs/bse.pod      4 unescaped <> in paragraph     12
+site/docs/bse.pod      6 unescaped <> in paragraph     2
+site/docs/bse.pod      8 unescaped <> in paragraph     2
+site/docs/bse.pod      =item type mismatch ('definition' vs. 'bullet') 1
+site/docs/bse.pod      No items in =over (at line 5204) / =back list   1
+site/docs/bse.pod      No items in =over (at line 6076) / =back list   1
+site/docs/bse.pod      No items in =over (at line 6088) / =back list   1
+site/docs/bse.pod      preceding non-item paragraph(s) 1
+site/docs/bse.pod      unresolved internal link 'formmail.pod' 1
+site/docs/bse_import.pod       empty section in previous paragraph     1
+site/docs/bse_import.pod       multiple occurrence of link target 'Configuration'      1
+site/docs/config.pod   1 unescaped <> in paragraph     10
+site/docs/config.pod   2 unescaped <> in paragraph     6
+site/docs/config.pod   4 unescaped <> in paragraph     2
+site/docs/config.pod   6 unescaped <> in paragraph     3
+site/docs/config.pod   No items in =over (at line 1827) / =back list   1
+site/docs/config.pod   No items in =over (at line 1887) / =back list   1
+site/docs/config.pod   empty section in previous paragraph     4
+site/docs/config.pod   multiple occurrence of link target 'extra_templates'    1
+site/docs/config.pod   multiple occurrence of link target 'from'       1
+site/docs/config.pod   multiple occurrence of link target 'images'     1
+site/docs/config.pod   multiple occurrence of link target 'no_cache_dynamic'   1
+site/docs/config.pod   multiple occurrence of link target 'require_logon'      1
+site/docs/config.pod   multiple occurrence of link target 'template'   1
+site/docs/config.pod   multiple occurrence of link target 'template_dirs'      1
+site/docs/config.pod   multiple occurrence of link target 'url'        1
+site/docs/config.pod   unresolved internal link '<[siteuser update specid]'    1
+site/docs/custom.pod   2 unescaped <> in paragraph     1
+site/docs/custom.pod   empty section in previous paragraph     3
+site/docs/dynamic.pod  2 unescaped <> in paragraph     1
+site/docs/formmail.pod 2 unescaped <> in paragraph     3
+site/docs/formmail.pod No argument for =item   1
+site/docs/formmail.pod nested commands I<...I<...>...> 2
+site/docs/future_plans.pod     2 unescaped <> in paragraph     1
+site/docs/secure.pod   2 unescaped <> in paragraph     1
+site/docs/secure.pod   empty section in previous paragraph     1
+site/docs/siteusers.pod        2 unescaped <> in paragraph     1
+site/docs/standard.pod 1 unescaped <> in paragraph     1
+site/docs/standard.pod 2 unescaped <> in paragraph     1
+site/docs/storages.pod 2 unescaped <> in paragraph     1
+site/docs/templates.pod        1 unescaped <> in paragraph     10
+site/docs/templates.pod        2 unescaped <> in paragraph     25
+site/docs/templates.pod        4 unescaped <> in paragraph     8
+site/docs/templates.pod        =item type mismatch ('definition' vs. 'bullet') 1
+site/docs/templates.pod        multiple occurrence of link target '%<format>'  1
+site/docs/templates.pod        multiple occurrence of link target '1'  1
+site/docs/templates.pod        multiple occurrence of link target '2'  1
+site/docs/templates.pod        multiple occurrence of link target 'admin'      1
+site/docs/templates.pod        multiple occurrence of link target 'article field'      1
+site/docs/templates.pod        multiple occurrence of link target 'body'       1
+site/docs/templates.pod        multiple occurrence of link target 'count'      1
+site/docs/templates.pod        multiple occurrence of link target 'embed child'        1
+site/docs/templates.pod        multiple occurrence of link target 'extended field'     1
+site/docs/templates.pod        multiple occurrence of link target 'gst'        1
+site/docs/templates.pod        multiple occurrence of link target 'id' 1
+site/docs/templates.pod        multiple occurrence of link target 'ifEmbedded' 1
+site/docs/templates.pod        multiple occurrence of link target 'ifParent'   1
+site/docs/templates.pod        multiple occurrence of link target 'image'      1
+site/docs/templates.pod        multiple occurrence of link target 'item field' 1
+site/docs/templates.pod        multiple occurrence of link target 'm<number>'  1
+site/docs/templates.pod        multiple occurrence of link target 'order field'        1
+site/docs/templates.pod        multiple occurrence of link target 'product field'      1
+site/docs/templates.pod        multiple occurrence of link target 'release'    1
+site/docs/templates.pod        multiple occurrence of link target 'summary'    1
+site/docs/templates.pod        multiple occurrence of link target 'total'      1
+site/docs/templates.pod        multiple occurrence of link target 'wholesalePrice'     1
+site/docs/templates.pod        unresolved internal link 'Tag notes'    1
+site/docs/templates.pod        unresolved internal link 'item child'   1
+site/docs/templates.pod        unresolved internal link 'item crumbs'  1
+site/docs/thumbnails.pod       2 unescaped <> in paragraph     1
+site/docs/thumbnails.pod       4 unescaped <> in paragraph     1
+site/util/bse_imageclean.pl    2 unescaped <> in paragraph     1
+site/util/bse_makeindex.pl     2 unescaped <> in paragraph     1
+site/util/gen.pl       2 unescaped <> in paragraph     1
+site/util/upgrade_mysql.pl     2 unescaped <> in paragraph     1
index ed204c5..76958d5 100644 (file)
 #!perl -w
 use strict;
 use Test::More;
+use Getopt::Long;
 use ExtUtils::Manifest qw(maniread);
-eval "use Test::Pod 1.00;";
-plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+eval "use Pod::Checker 1.51;";
+plan skip_all => "Pod::Checker 1.51 required for testing POD" if $@;
 my $manifest = maniread();
 my @pod = sort grep /\.(pm|pl|pod|PL)$/, keys %$manifest;
-plan tests => scalar(@pod);
+
+my $rebuild;
+GetOptions("r" => \$rebuild);
+
+my $known_issues_name = "t/data/known_pod_issues.txt";
+my %expected;
+unless ($rebuild) {
+  plan tests => scalar(@pod);
+  open my $exp_file, "<", $known_issues_name
+    or die "Cannot open $known_issues_name: $!\n";
+  while (<$exp_file>) {
+    chomp;
+    my ($filename, @error_found) = split /\t/, $_, 3;
+    push @{$expected{$filename}}, \@error_found;
+  }
+}
+
+my %found;
 for my $file (@pod) {
-  local $TODO = "working on fixing these";
-  pod_file_ok($file, "pod ok in $file");
+  my $checker = My::Pod::Checker->new;
+  $checker->parse_from_file($file, \*STDERR);
+  my @errors = $checker->imager_errors;
+  if ($rebuild) {
+    $found{$file} = \@errors if scalar @errors;
+  }
+  else {
+    my @diffs;
+    my %exp = map { $_->[0] => $_->[1] } @{$expected{$file} || []};
+    my %seen = map { $_->[0] => $_->[1] } @errors;
+    my %all = map { $_ => 1 } keys %exp, keys %seen;
+    for my $msg (sort keys %all) {
+      my $old_count = $exp{$msg} || 0;
+      my $new_count = $seen{$msg} || 0;
+      if ($old_count && $new_count > $old_count) {
+       push @diffs, "Added: $msg (from $old_count to $new_count)";
+      }
+      elsif (!$old_count) {
+       push @diffs, "New: $msg ($new_count times)";
+      }
+      elsif ($new_count < $old_count) {
+       push @diffs, "Fixed?: $msg (from $old_count to $new_count)";
+      }
+    }
+    ok(!@diffs, "check errors for $file");
+    for my $diff (@diffs) {
+      $diff =~ s/\n/\n# /g;
+      print "# $diff\n";
+    }
+  }
+}
+
+if ($rebuild) {
+  open my $known_file, ">", $known_issues_name
+    or die "Cannot create $known_issues_name; $!\n";
+  binmode $known_file;
+  for my $file (sort keys %found) {
+    for my $issue (@{$found{$file}}) {
+      print $known_file join("\t", $file, @$issue), "\n";
+    }
+  }
+  close $known_file;
+}
+
+{
+  # partly stolen from perl's t/porting/podcheck.t
+  package My::Pod::Checker;
+  use base 'Pod::Checker';
+
+  my $line_reference;
+  my $optional_location;
+
+  BEGIN {
+    my $location = qr/ \b (?:in|at|on|near) \s+ /xi;
+    $optional_location = qr/ (?: $location )? /xi;
+    $line_reference = qr/ [('"]? $optional_location \b line \s+
+                             (?: \d+ | EOF | \Q???\E | - )
+                             [)'"]? /xi;
+
+  }
+
+  sub new {
+    my ($class) = @_;
+
+    my $self = $class->SUPER::new(-quiet => 1,
+                                 -warnings => 200);
+    $self->{imager_errors} = [];
+
+    return $self;
+  }
+
+  sub poderror {
+    my $self = shift;
+
+    my $opts = shift;
+    my $message;
+    if (!ref $opts || ref $opts ne "HASH") {
+      $message = join "", $opts, @_;
+      my $line_number;
+      if ($message =~ s/\s*($line_reference)//) {
+       ($line_number = $1) =~ s/\s*$optional_location//;
+      }
+      else {
+       $line_number = '???';
+      }
+      $opts = { -msg => $message, -line => $line_number };
+    }
+    else {
+      $message = $opts->{-msg};
+    }
+    $message =~ s/^\d+\s+//;
+
+    push @{$self->{imager_errors}}, $opts;
+  }
+
+  sub imager_errors {
+    # fold, spindle, mutilate
+    my %by_error;
+    for my $error (@{$_[0]{imager_errors}}) {
+      ++$by_error{$error->{-msg}};
+    }
+    return
+      (
+       map [ $_, $by_error{$_} ],
+       sort keys %by_error
+      );
+  }
 }