r2357 - in
packages/libmodule-signature-perl/branches/upstream/current:
. inc inc/Module inc/Module/Install inc/Test inc/Test/Builder
lib/Module script
Krzysztof Krzyzaniak
eloy at costa.debian.org
Wed Mar 15 16:19:01 UTC 2006
Author: eloy
Date: 2006-03-15 16:18:02 +0000 (Wed, 15 Mar 2006)
New Revision: 2357
Added:
packages/libmodule-signature-perl/branches/upstream/current/AUDREY2006.pub
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/AutoInstall.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder/
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder/Module.pm
Removed:
packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub
packages/libmodule-signature-perl/branches/upstream/current/TODO
packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/
Modified:
packages/libmodule-signature-perl/branches/upstream/current/Changes
packages/libmodule-signature-perl/branches/upstream/current/MANIFEST
packages/libmodule-signature-perl/branches/upstream/current/META.yml
packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL
packages/libmodule-signature-perl/branches/upstream/current/README
packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm
packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm
packages/libmodule-signature-perl/branches/upstream/current/script/cpansign
Log:
Load /tmp/tmp.VOe0JI/libmodule-signature-perl-0.53 into
packages/libmodule-signature-perl/branches/upstream/current.
Added: packages/libmodule-signature-perl/branches/upstream/current/AUDREY2006.pub
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/AUDREY2006.pub 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/AUDREY2006.pub 2006-03-15 16:18:02 UTC (rev 2357)
@@ -0,0 +1,512 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (FreeBSD)
+
+mQGiBDrSde4RBACrX/gOzX8CCum6b5nfvbjeEgjEKAE+piiB/k8U9Y89juUwMUNf
+rHvYWI/j3Clk8gnNUnrjO5/mUAkDBB39X5VRhX1nHUoH0aVF8CuU3HbPyV26NgU1
+5E8llFMqptmRbL0YgoDYke00RHpHWw0eBMDNLjvx7MTo9EVx8TD6SssnGwCgv0CK
+UN5wTse3hoWzk2Pcu9c1rD8D/iX1/WbOmEp+f9g89OUKdF2seRWF+FxRY/zkdPHv
+4EIPnnwmcj1JvVsLkLNkWJAbYw8/8I/VYAZuzRb2dJvR8FUKtUojwBI7vxk1H8VE
+F+WQYvKFSk5E3FwVAvCCYHiJrvtciHt1oexL4wYzPzjNlPudqj/QOhJu1tsOYwO6
+bf3KA/0cluS8SWHMSsVxhj3FXG+m7iiCqQ3pZABQ8utsq3eRtVYmwQOfIeT4Caaj
+9sS7mVj2TSQZiQOBeRw77BQ40rUVf9dblGpWGwPp9PIroksBIDZ/TeMMKkkdiryF
+OGGJILRgVIMSpiNs+SJ8y1ns8eyzPWjlckqgjnUMECL/B05FrbQrQXVkcmV5IFRh
+bmcgKGF1dHJpanVzKSA8YXV0cmlqdXNAZ21haWwuY29tPohgBBMRAgAgBQJDl+uN
+AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQtLPdNzw1AaCfqgCgsWdLSK7S
+9fDDup1QXBWOPMQAaxYAmQF5tpt50U7CcQyV22V6oEN7ecO0tDVBdXRyaWp1cyBU
+YW5nIChUYW5nIFpvbmctSGFuKSA8YXV0cmlqdXNAYXV0cmlqdXMub3JnPohwBDAR
+AgAwBQJDziZVKR0gSSd2ZSBsZWdhbGx5IGNoYW5nZWQgbXkgbmFtZSB0byBBdWRy
+ZXkuAAoJELSz3Tc8NQGgzA8AniJw7l5WpB1pH2ArNlLW1feNyM0OAJ9M3kygBLvr
+4n2CSgGYEoZrCUtaerQuQXVkcmV5IFRhbmcgKGF1dHJpanVzKSA8YXV0cmlqdXNA
+YXV0cmlqdXMub3JnPohgBBMRAgAgBQJDl+tnAhsDBgsJCAcDAgQVAggDBBYCAwEC
+HgECF4AACgkQtLPdNzw1AaCTLgCgq4tiokXOkM8Uz+x3vQTP31xL+toAoKZeWapu
+mERm+VUaeG6ZXwCgM99d0dZt1msBEAABAQAAAAAAAAAAAAAAAP/Y/+AAEEpGSUYA
+AQEBAEgASAAA/+EANEV4aWYAAE1NACoAAAAIAAIBEgADAAAAAQABAACHaQAEAAAA
+AQAAACYAAAAAAAAAAAAA/+0AHFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAA/+IN
++ElDQ19QUk9GSUxFAAEBAAAN6GFwcGwCAAAAbW50clJHQiBYWVogB9UACwAKAAAA
+OQAoYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1h
+cHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgA
+AAAUY2hhZAAAAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgA
+AAAOdmNndAAAAdgAAAMSbmRpbgAABOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AA
+AAH+bW1vZAAADZAAAAAoY3BydAAADbgAAAAtWFlaIAAAAAAAAF/MAAA2wgAACVlY
+WVogAAAAAAAAcKYAALKbAAAm8lhZWiAAAAAAAAAmZAAAFr0AAKLaWFlaIAAAAAAA
+APNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMA
+AAPcAADAbGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAA
+AAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAQABAwUGCAkLDA4PERIUFhcZGhwdHiAh
+IyQmJygqKywuLzAyMzQ2Nzg5Ozw9Pj9BQkNERUdISUpLTU5PUFFSVFVWV1hZW1xd
+Xl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiIiJiouM
+jY6PkJGSk5SVlpeYmJmam5ydnp+goaKjo6SlpqeoqaqrrK2ur6+wsbKztLW2t7i5
+ubq7vL2+v8DBwcLDxMXGx8jIycrLzM3Ozs/Q0dLT09TV1tfY2Nna29zc3d7f4ODh
+4uPk5OXm5+fo6err6+zt7u7v8PHx8vPz9PX29vf4+Pn6+vv8/P39/v8AAwQGBwgJ
+CwwNDxARExQVFhgZGxwdHyAhIyQlJigpKiwtLi8xMjM0NTc4OTo7PT4/QEFDREVG
+R0lKS0xNTk9QUVJTVFVWV1haW1xdXl9gYWJjZGVmaGlqa2xtbm9wcXJzdHV2d3h5
+ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+foKGio6Slpqeo
+qaqrrK2ur6+wsbKztLW2t7i5urq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NTV
+1tfY2drb3N3e3+Dg4eLj5OTl5ufn6Onp6uvs7O3u7+/w8fLy8/T09fb29/j4+fn6
++vv8/P39/v7/AAIDBAUGBwgJCgsMDQ4ODxAREhMTFBUWFxgZGhobHB0eHyAhIiIj
+JCUmJygpKissLS4vMDEyMzQ1Njc3ODk6Ozw9Pj9AQUJDREVFRkdISUpLTE1OTk9Q
+UVJTVFRVVldYWVlaW1xdXV5fYGFhYmNkZWVmZ2hpamtsbW5vcHBxcnN0dXZ3eHl6
+e3x8fX5/gIGBgoOEhYaHiIiJiouMjY6Pj5CRkpOUlZWWl5iZmpucnZ6fn6ChoqOk
+paanqKmqq6ytrq+wsbKztLW2t7i5uru8vr+/wMHCw8TFxsfIycrLzM3Oz9DR0tPU
+1dbX2Nna29zd3uDh4uTl5+nr7fDz9vn9/wAAbmRpbgAAAAAAAAY2AACVGAAAVl8A
+AFFhAACIhgAAKTQAABaoAABQDQAAVDkAAl64AAJPXAABeFEAAwEAAAIAAAADAAYA
+CwAQABYAJQAuADcATQBZAGUAgQCQAJ8AwQDSAOUBCwEgATUBSwFhAZABqAHBAfUC
+DwIrAmQCnwK9AtwDHAM9A18DowPGA+oENAR/BKYEzQUdBXAFmgXEBhsGdAahBs8H
+LQeMB70H7ghSCLgJIAlUCYoJ9gpkCtULRwuBC7wMMgyrDSYNog3hDiEOoQ8kD6kQ
+LxBzELgRQxHPEl0S7hOAE8oUFRSrFUMV3RZ5FxcXZhe2GFgY/BmhGkga8RucHEkc
++B2oHlsfDx/FIH0hNyHyIrAjbyQwJPMltyZ+J0YoECjcKakqeStKLBws8S3HLqAv
+eTBVMTMyEjLzM9U0uTWgNoc3cThcOUk6ODsoPQ4+Az77P/RA7kHqQuhD6ETpRexG
+8Uf3SP9KCUsUTCFOQE9SUGZRe1KSU6tUxVXhVv9YHlk/W4Vcq13SXvtgJWFSYn9j
+r2TgZhJnR2h8au1sKG1kbqJv4XEicmVzqXTvdjZ4yXoVe2N8sn4Df1WAqYH/hK+G
+CYdliMKKIYuBjOOPrJESknuT5JVQlryZm5sMnH+d9J9qolqj1aVRps+oTqtRrNSu
+Wq/gsvK0frYLt5m6urxNveG/d8KnxEHF3ckZyrrMW83/0UrS8dSb1/HZn9tO3rHg
+ZOPQ5YjnQeq57Hbv9/G59UL3CPqa/jH//wAAAAAAAQADAAsAEAAWACUANwBNAFkA
+ZQCBAJ8AsADBAOUBCwEgATUBYQGQAcEB2gH1AisCRwJkAp8C3AL8AxwDXwOjA8YD
+6gQ0BH8EzQT1BR0FcAXEBe8GGwZ0Bs8HLQdcB4wH7ghSCLgJIAlUCYoJ9gpkCtUL
+RwuBC7wMMgyrDSYNog3hDiEOoQ8kD6kQLxBzELgRQxHPEl0S7hOAFBUUqxVDFd0W
+eRcXF7YYWBj8GaEZ9BpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwIw8jbyQwJPMl
+tyZ+J0YoECjcKakqeStKLBws8S3HLqAveTBVMTMyEjLzM9U0uTWgNoc3cThcOUk6
+ODsoPBo9Dj4DPvs/9EDuQepC6EPoROlF7EbxR/dI/0oJSxRMIU0wTkBPUlBmUXtS
+klOrVMVV4Vb/WT9aYVuFXKtd0l77YCVhUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+Fx
+InJlc6l073Y2d394yXoVfLJ+A39VgKmB/4NWhK+GCYdliMKKIYuBjOOOR4+skRKS
+e5PklVCWvJgrmZubDJx/nfSfaqJao9WlUabPqE6pzqtRrNSuWq/gsWmy8rYLt5m5
+Kbq6veG/d8EOxEHF3ckZyrrMW8+j0UrS8dZF1/HZn9z/3rHiGePQ50Ho/Ox27/fz
+fPVC+ND8Zf//AAAAAQADAAsAFgAlADcATQBlAIEAnwDBAOUBCwE1AZABwQH1AisC
+ZALcAxwDXwOjA+oENAR/BR0FcAXEBhsGdAbPBy0HjAhSCLgJIAmKCfYKZArVC0cL
+vAwyDKsNJg2iDiEOoQ8kD6kQLxC4EUMRzxLuE4AUFRSrFUMV3RZ5FxcXthhYGPwZ
+oRpIGvEcSRz4HageWx8PH8UgfSE3IfIjbyQwJPMltyZ+J0Yo3CmpKnkrSiwcLccu
+oC95MFUyEjLzM9U0uTaHN3E4XDlJOyg8Gj0OPgM++z/0QO5B6kLoQ+hE6UbxR/dI
+/0oJSxRMIU0wTkBPUlBmUXtSklTFVeFW/1geWT9bhVyrXdJe+2AlYVJif2TgZhJn
+R2h8abRq7WwobqJv4XEicmVzqXTvd394yXoVe2N8sn4Df1WAqYH/g1aGCYdliMKK
+IYuBjOOOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs
+1K5arx2v4LFptH62C7eZuSm6urxNveG/d8EOwqfEQcXdx3vJGcq6zFvN/8+j0UrS
+8dSb1kXX8dmf207c/96x4GTiGePQ5YjmZOdB6PzqueuX7HbuNu8W7/fw1/G58prz
+fPRf9UL12fZw9wj3oPg4+ND5afoB+pr7M/vM/GX82P1L/b7+Mf8Y//8AAGRlc2MA
+AAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt
+bHVjAAAAAAAAAA8AAAAMaXRJVAAAABQAAADEZnJGUgAAAEIAAADYbmJOTwAAABIA
+AAEaZXNFUwAAABIAAAEsZmlGSQAAABAAAAE+cHRQVAAAABgAAAFOemhUVwAAAA4A
+AAFmamFKUAAAAA4AAAF0bmxOTAAAABYAAAGCZGVERQAAABAAAAGYa29LUgAAAAwA
+AAGoZW5VUwAAABIAAAG0c3ZTRQAAABAAAAHGZGFESwAAABwAAAHWemhDTgAAAAwA
+AAHyAEwAQwBEACAAYwBvAGwAbwByAGkAyQBjAHIAYQBuACAA4AAgAGMAcgBpAHMA
+dABhAHUAeAAgAGwAaQBxAHUAaQBkAGUAcwAgAGMAbwB1AGwAZQB1AHIARgBhAHIA
+ZwBlAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAVgDkAHIAaQAtAEwAQwBEAEwA
+QwBEACAAYwBvAGwAbwByAGkAZABvX2mCcm2yZnaYb3k6VmgwqzDpMPwAIABMAEMA
+RABLAGwAZQB1AHIAZQBuAC0ATABDAEQARgBhAHIAYgAtAEwAQwBEzuy37AAgAEwA
+QwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYA5AByAGcALQBMAEMARABMAEMARAAtAGYA
+YQByAHYAZQBzAGsA5gByAG1faYJyACAATABDAEQAAG1tb2QAAAAAAAAGEAAAnEUA
+AAAAvnORAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBD
+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
+FDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaD
+CQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eH
+l6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6
+EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVS
+YnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj
+84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn9zhIWGh4
+iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/
+AIjo9lA+nWLtYq9beElzYh6/Au/P/Dd3zr/N9Yuf+M8395hlBpttxo2noTXp+jhX
+/wARN/14E0bSDLpVjN+jDIGtom9T9H+oGrGp5c/8M3fOv8/1m45f8tE397himi0i
+VjpPWu50z+P+Ej/xLMKjx/Ns24eXd1RH6NsVTkdLjO3fTVr+PlRMKLmKyto2eTTo
+lCgklrGJaD/ZeXI8dq9taWkbE6dFHxWpY2EaUp3q3l23yEs8upXf1azt0qaiMJFE
+rMfsk87eG2/dD+Z0yQgZGydhzPJnAgA7WTyHNMrjzFotsOAsbaYncOkFiaexD6XA
+2FQ8wSTyfubWwSn2VexsjX6fq6jJhoP5Vi44yatK0h7xRfCv0t9rJefy28vRp6Y0
++OnQt8TH58ia4TnwxNC5eY5MxpsktzUb6F5TaeaPqc5XU9Jsp0H7KWVhEfnyazm2
+/wBjk10XVfK+uNDBBptnFdOT/ov1S0kkIHUj0NDuAfvxmtfl5JbW7yafIHa1q0cM
+wrzjpXgHyDXcViyxz26NayGoubdwaKwP2oTQVUftD7aftplgEMsTwSIPva5wlikB
+IA93c9m/w7p7MaaLDSvbTEP/AIrmKjyxp4AP6DiYf9sxB9//ADrmQvydfw38v6Kv
+Fje8QcreSKC2cTRgVqgj0rUJGZB9tnk+LJrLpMsUfOO2kJJpQ2IPX5eXDmLPxIEi
+R5eZQIg0AebbeWNPKnhocNexOmp/4zmJ/wCGrIUB0SH3/wBxidf/AAmsXOiyha+h
+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
+n3xQId4qife7FswyPzauuj3+JMxi
+=h+4O
+-----END PGP PUBLIC KEY BLOCK-----
Deleted: packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,368 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.2.2 (FreeBSD)
-
-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
-PB3bAO9JE1rzH4sAnRke1F6Icefl+NM3x26+HEbC5AjBiEYEEhECAAYFAj6nm84A
-CgkQdU4vU8LFvP2h2ACfUSB6EbQxOC+Yl+uw5rVCbTN4zaoAmgK24g/GUBi1VaAN
-s58Sizk5aopuiEYEExECAAYFAj8/URYACgkQ1dlLUeP4bkyHYwCfX0EWja3AOCgt
-PWWUFfdTYhl65YwAoIPm1WCEkziEsY3E4p06OpJfyyHNiEYEExECAAYFAj8/l4oA
-CgkQlZ/JOHsLIwjXrwCgoPeXflfdlbLknJ2jiy+UmEa2XSQAoOkEaWZ73oW2Y24a
-XtQ7e+CW3+eJ0dGb0ZkBEAABAQAAAAAAAAAAAAAAAP/Y/+AAEEpGSUYAAQIBAEgA
-SAAA/+4ADkFkb2JlAGSAAAAAAf/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0N
-Dg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkL
-CQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwM
-DAwMDAwMDAwM/8AAEQgAVQBuAwEiAAIRAQMRAf/dAAQAB//EAaIAAAAHAQEBAQEA
-AAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoL
-EAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHh
-MxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNV
-KBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiI
-mKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYE
-CAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWi
-Y7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWV
-pbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5
-iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AiOj2UD6dYu1ir1t4
-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
-peRwqZxLK5ncvt4KMg==
-=/69j
------END PGP PUBLIC KEY BLOCK-----
Modified: packages/libmodule-signature-perl/branches/upstream/current/Changes
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/Changes 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/Changes 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,3 +1,38 @@
+[Changes for 0.53 - 2006-01-31]
+
+* The explicit call to "readline(D)" didn't compile on earlier perls which
+ demanded either "readline(*D)" or "<D>" -- I elected the latter form.
+ Reported by: Matthew Persic
+
+* Update my author key to reflect revoked past uids.
+
+[Changes for 0.52 - 2006-01-19]
+
+* POD and source code cleanup; no functional changes.
+
+* Updated my author key to reflect my new name and identity.
+
+* Upgrade to the latest Module::Install to fix Cygwin
+ installation problems.
+ Reported by: Lyle Ziegelmiller
+
+[Changes for 0.51 - 2006-01-02]
+
+* Even more flexible CRLF handling for SIGNATURE files,
+ Contributed by: Andreas Koenig.
+
+[Changes for 0.50 - 2005-08-21]
+
+* Add support for to SHA-256, requested by Mark Shelor in light
+ of the recent SHA1 attacks. SHA1 is still the default, but
+ you can now override this by settings MODULE_SIGNATURE_CIPHER
+ environment variable to SHA256.
+
+[Changes for 0.45 - 2005-08-09]
+
+* Andreas Koenig ported out that "Import GPG keys?" was asked
+ far too many times during autoinstall.
+
[Changes for 0.44 - 2004-12-16]
* Add "pmfiles.dat" to legacy manifest_skip routine to accomodate
Modified: packages/libmodule-signature-perl/branches/upstream/current/MANIFEST
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/MANIFEST 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/MANIFEST 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,7 @@
+AUDREY2006.pub
AUTHORS
-AUTRIJUS.pub
Changes
-inc/ExtUtils/AutoInstall.pm
+inc/Module/AutoInstall.pm
inc/Module/Install.pm
inc/Module/Install/AutoInstall.pm
inc/Module/Install/Base.pm
@@ -14,6 +14,7 @@
inc/Module/Install/Win32.pm
inc/Module/Install/WriteAll.pm
inc/Test/Builder.pm
+inc/Test/Builder/Module.pm
inc/Test/More.pm
lib/Module/Signature.pm
Makefile.PL
@@ -25,4 +26,3 @@
SIGNATURE
t/0-signature.t
t/1-basic.t
-TODO
Modified: packages/libmodule-signature-perl/branches/upstream/current/META.yml
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/META.yml 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/META.yml 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,16 +1,18 @@
-name: Module-Signature
-version: 0.44
+
abstract: Module signature file manipulation
-author: Autrijus Tang (autrijus at autrijus.org)
+author: Audrey Tang <autrijus at autrijus.org>
+build_requires:
+ Test::More: 0
+distribution_type: module
+generated_by: Module::Install version 0.55
license: perl
-distribution_type: module
-build_requires:
- Test::More: 0
-requires:
+name: Module-Signature
+no_index:
+ directory:
+ - inc
+ - t
+recommends:
+ PAR::Dist: 0
+requires:
perl: 5.005
-recommends:
- PAR::Dist: 0
-no_index:
- directory:
- - inc
-generated_by: Module::Install version 0.36
+version: 0.53
Modified: packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL 2006-03-15 16:18:02 UTC (rev 2357)
@@ -3,65 +3,61 @@
use 5.005;
use inc::Module::Install;
-name ('Module-Signature');
-abstract ('Module signature file manipulation');
-author ('Autrijus Tang (autrijus at autrijus.org)');
-version_from ('lib/Module/Signature.pm');
-license ('perl');
-install_script ('script/cpansign');
+$|++;
-requires( perl => 5.005 );
-requires( can_cc() ? 'Digest::SHA' : 'Digest::SHA::PurePerl' )
- unless eval { require Digest::SHA1; 1 }
- or eval { require Digest::SHA; 1 }
- or eval { require Digest::SHA::PurePerl; 1 };
-features(
- 'Crypt::OpenPGP Support' => [
- -default => 0,
- 'MIME::Base64' => 0,
- 'Compress::Zlib' => 0,
- 'Crypt::CBC' => 0,
- 'Crypt::DES' => 0,
- 'Crypt::Blowfish' => 0,
- 'Crypt::RIPEMD160' => 0,
- 'Tie::EncryptedHash' => 0,
- 'Class::Loader' => 0,
- 'Convert::ASCII::Armour' => 0,
- 'Data::Buffer' => 0.04,
- 'Digest::MD2' => 0,
- 'Math::Pari' => 0,
- 'Crypt::Random' => 0,
- 'Crypt::Primes' => 0,
- 'Crypt::DES_EDE3' => 0,
- 'Crypt::DSA' => 0,
- 'Crypt::RSA' => 0,
- 'Convert::ASN1' => 0,
- 'Convert::PEM' => 0,
- 'Crypt::OpenPGP' => 1.0,
- ],
+name 'Module-Signature';
+all_from 'lib/Module/Signature.pm';
+install_script 'script/cpansign';
+
+requires (can_cc() ? 'Digest::SHA' : 'Digest::SHA::PurePerl')
+ unless can_use 'Digest::SHA'
+ or can_use 'Digest::SHA1'
+ or can_use 'Digest::SHA::PurePerl';
+
+requires qw(
+ MIME::Base64
+ Compress::Zlib
+ Crypt::CBC
+ Crypt::DES
+ Crypt::Blowfish
+ Crypt::RIPEMD160
+ Tie::EncryptedHash
+ Class::Loader
+ Convert::ASCII::Armour
+ Data::Buffer 0.04
+ Digest::MD2
+ Math::Pari
+ Crypt::Random
+ Crypt::Primes
+ Crypt::DES_EDE3
+ Crypt::DSA
+ Crypt::RSA
+ Convert::ASN1
+ Convert::PEM
+ Crypt::OpenPGP 1.00
) if want_openpgp();
-features(
- 'Display checksum differences' => [
- recommends( 'Algorithm::Diff' => 0 ),
- recommends( 'Text::Diff' => 0 ),
- ],
-) unless (can_run('diff'));
+feature 'Display checksum differences', recommends qw(
+ Algorithm::Diff
+ Text::Diff
+) unless can_run 'diff';
-features(
- 'Sign and verify PAR (Perl Archive) files' => [
- -default => 0,
- recommends( 'PAR::Dist' => 0 ),
- ],
+feature 'Sign and verify PAR (Perl Archive) files', recommends qw(
+ PAR::Dist
);
-include('ExtUtils/AutoInstall.pm');
-build_requires('Test::More');
-auto_include_deps();
-auto_install( -default => 0 );
+feature 'Support for SHA-256', recommends
+ (can_cc() ? 'Digest::SHA' : 'Digest::SHA::PurePerl')
+ unless can_use 'Digest::SHA'
+ or can_use 'Digest::SHA256'
+ or can_use 'Digest::SHA::PurePerl';
-&WriteAll( sign => 1 );
+build_requires 'Test::More';
+auto_include_deps;
+auto_install -default => 0;
+sign; WriteAll;
+
my $make = eval { require Config; $Config{make} } || 'make';
print "\nNow, please enter '$make test' to test, and '$make install' to install.\n";
@@ -69,8 +65,8 @@
print "*** Looking for Crypt::OpenPGP (Pure-Perl OpenPGP implementation)...\n";
my $version = eval { require Crypt::OpenPGP; Crypt::OpenPGP->VERSION };
if ($version) {
- print "Crypt::OpenPGP found (version $version), good.\n";
- return 1;
+ print "Crypt::OpenPGP found (version $version), good.\n";
+ return 1;
}
}
@@ -79,19 +75,22 @@
my $gpg = can_run('gpg');
my $has_gpg = (
- $gpg and
- `gpg --version` =~ /GnuPG/ and
- defined `gpg --list-public-keys`
+ $gpg and
+ `gpg --version` =~ /GnuPG/ and
+ defined `gpg --list-public-keys`
);
if ($has_gpg) {
- print "GnuPG found ($gpg).\n";
- if (prompt("Import PAUSE and author keys to GnuPG?", 'y') =~ /^y/i) {
- print "Importing... ";
- system('gpg', '--quiet', '--import', <*.pub>);
- print "done.\n";
- }
- return 1;
+ print "GnuPG found ($gpg).\n";
+
+ return 1 if grep { /^--installdeps/} @ARGV;
+
+ if (prompt("Import PAUSE and author keys to GnuPG?", 'y') =~ /^y/i) {
+ print 'Importing... ';
+ system 'gpg', '--quiet', '--import', glob('*.pub');
+ print "done.\n";
+ }
+ return 1;
}
print "GnugPG not found anywhere in your PATH, eek.\n";
@@ -110,8 +109,8 @@
my $punt = 2;
if (can_cc()) {
- $punt++;
- print << '.';
+ $punt++;
+ print << '.';
2) Automatically install Crypt::OpenPGP and the 20 modules it requires
from CPAN, which will give the same functionality as GnuPG.
.
@@ -123,9 +122,9 @@
my $choice;
while (1) {
- $choice = prompt("Your choice:", 3) || 3;
- last if $choice =~ /^[123]$/;
- print "Sorry, I cannot understand '$choice'.\n"
+ $choice = prompt("Your choice:", 3) || 3;
+ last if $choice =~ /^[123]$/;
+ print "Sorry, I cannot understand '$choice'.\n"
}
goto &want_openpgp if $choice == 1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/README
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/README 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/README 2006-03-15 16:18:02 UTC (rev 2357)
@@ -5,15 +5,15 @@
Module::Signature uses the standard perl module install process:
-cpansign -v # optional; see SIGNATURE for details
-perl Makefile.PL
-make # or 'nmake' on Win32
-make test
-make install
+ cpansign -v # optional; see SIGNATURE for details
+ perl Makefile.PL
+ make # or 'nmake' on Win32
+ make test
+ make install
* Copyright
-Copyright 2002, 2003, 2004 by Autrijus Tang <autrijus at autrijus.org>.
+Copyright 2002, 2003, 2004, 2005, 2006 by Audrey Tang.
All rights reserved. You can redistribute and/or modify
this bundle under the same terms as Perl itself.
Modified: packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,5 +1,5 @@
This file contains message digests of all files listed in MANIFEST,
-signed via the Module::Signature module, version 0.42.
+signed via the Module::Signature module, version 0.53.
To verify the content in this distribution, first make sure you have
Module::Signature installed, then type:
@@ -14,37 +14,37 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
+SHA1 6e76ed411078b4a6264358d8b42ee91337d2def5 AUDREY2006.pub
SHA1 6b29cb3b011d6dd95e512361c6b4ce2f5a8cdb17 AUTHORS
-SHA1 e3d33ad00ef3d1a151a20f2ca0259370198ed837 AUTRIJUS.pub
-SHA1 6a0fbc62cd2d6be73f90a8ba2fecd2f32724c9dd Changes
-SHA1 106e3d36e8ef72c765753635cd006df64d07a1fd MANIFEST
-SHA1 ad594608e587bf9c3c6a5c7fce7ad9901d7c7b8c META.yml
-SHA1 f75067726286d7d8d7f936f5d9747020ef8eccfe Makefile.PL
+SHA1 63e63c35410b8a34997bce49a35f5744d4aa567c Changes
+SHA1 1c0f4e6cdda728ea415bf23abfb4fc2b037ce6ee MANIFEST
+SHA1 479630b02c804cfc57a9f4b33a36661c763f9491 META.yml
+SHA1 c2b095718c410cf8276605758c963c1badcfe1f6 Makefile.PL
SHA1 37e858c51409a297ef5d3fb35dc57cd3b57f9a4d PAUSE2003.pub
-SHA1 c1227eeb333e6204dabd6d3fc5c087ce032fb0de README
-SHA1 22574acffb701e362b50fea0face2f61c7224c20 TODO
-SHA1 c04c3acb9d1c7e211114dacf7b686ddc0d062831 inc/ExtUtils/AutoInstall.pm
-SHA1 06d883487127fa0026311904e7c4867e850c505c inc/Module/Install.pm
-SHA1 25c1920fccb1077b2e11ed0f18df50089d2beb5d inc/Module/Install/AutoInstall.pm
-SHA1 2771d5c5033e94c4789c66a0aad4e21c62985ce9 inc/Module/Install/Base.pm
-SHA1 b5e2d5fc07b92d042c97631d2b00f61f974fc164 inc/Module/Install/Can.pm
-SHA1 c3747aa4bd8faa530c974b78f729c67f15c6f928 inc/Module/Install/Fetch.pm
-SHA1 c6d2a330e2a8cb3a1db7bfc4236fea9a8aafe297 inc/Module/Install/Include.pm
-SHA1 d8bc0d6e0a82d2b7533bdd3de467593094cc8b2c inc/Module/Install/Makefile.pm
-SHA1 6fca1d05c6b9a8f10865de5be4fefb9bfa7a52e9 inc/Module/Install/Metadata.pm
-SHA1 2e6f5004ac895a26c41f043bf8fa5efb4f5b21c4 inc/Module/Install/Scripts.pm
-SHA1 6b051a6d3ed824df40343a7ff09b66282e1783c3 inc/Module/Install/Win32.pm
-SHA1 77f82ce7c623e05304ac9aae05bcd1a5558fadbb inc/Module/Install/WriteAll.pm
-SHA1 e2048afd26bd18a6177af810952e35ecb5585e17 inc/Test/Builder.pm
-SHA1 5f8ae8af3dde9b106b3c964c8984fb5fca98f1dc inc/Test/More.pm
-SHA1 b3ef4e65127906409e2c6c8f34cdca03aacf3530 lib/Module/Signature.pm
-SHA1 15590ad33de70d273fcc6a2b163da7870b65fce3 script/cpansign
+SHA1 3de4ca2bf4a3bdbfc3a8ed8077c9cce87a35b3fe README
+SHA1 1928fb2aeea34583be40feecc60c2d0f4dbb911a inc/Module/AutoInstall.pm
+SHA1 c8086e2f417e1e979ad159f65cb5fbc3a0252e1a inc/Module/Install.pm
+SHA1 eecffd8a3a2675292f0d0af96f2f1c4cfc066a2a inc/Module/Install/AutoInstall.pm
+SHA1 4ed81cf0a97ac5df87a4032435dee277d582f90c inc/Module/Install/Base.pm
+SHA1 8b6b20c1fadc6dcc4defd276af029ff06a31b5f3 inc/Module/Install/Can.pm
+SHA1 c78a2e772d17c54522e6f327587524b769c56577 inc/Module/Install/Fetch.pm
+SHA1 81bba4e527917d1ac06fc6fea676bc4a40ea25ad inc/Module/Install/Include.pm
+SHA1 c201df1e509f4f708754da171285cb523df3a73b inc/Module/Install/Makefile.pm
+SHA1 c62e34ab923a8fe263e32f2a8d7140562e257448 inc/Module/Install/Metadata.pm
+SHA1 17a1d6f233b4a97f36484780c61fd7886f73c3a8 inc/Module/Install/Scripts.pm
+SHA1 34299cd6be8088430ada9cd2ba5d1c4463add0b5 inc/Module/Install/Win32.pm
+SHA1 8e8ad58cbc7d5df7becd400ee2105d2b0301aa62 inc/Module/Install/WriteAll.pm
+SHA1 d1902fb469cb7152151d43935a65a6794b5a84a1 inc/Test/Builder.pm
+SHA1 4e768c8b073c735864f2edf348cd6a1680037205 inc/Test/Builder/Module.pm
+SHA1 e7af6efa2813de38c4d938cfe53104e6831c3f26 inc/Test/More.pm
+SHA1 be6c1b4fb05d8bcf382cbbf7d619cd4fe86e8c45 lib/Module/Signature.pm
+SHA1 0882c50213a28b7a30fc91fd58c19015f33348d0 script/cpansign
SHA1 ad7d30f2b8e7f62006bd64a64759049af0cd97bb t/0-signature.t
SHA1 307a744384e704d94031df73233f24174b843bc8 t/1-basic.t
-----BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.2.6 (FreeBSD)
+Version: GnuPG v1.4.2 (FreeBSD)
-iD8DBQFBwTWMtLPdNzw1AaARAuN0AKCBz2vZwBGTOUADRYIiYHhLv7ZrNwCgjNJL
-O2odqvSr2ODE/plPnTjG4YM=
-=J63o
+iD8DBQFD3u7rtLPdNzw1AaARAnnuAJ94vTkukjAs2i9SLymxOJsGffsSkQCgoU2e
+Jcq+iVH87ztw8g2P/buwLeo=
+=zgXW
-----END PGP SIGNATURE-----
Deleted: packages/libmodule-signature-perl/branches/upstream/current/TODO
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/TODO 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/TODO 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,3 +0,0 @@
-
-- PKI.
-
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/AutoInstall.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/AutoInstall.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/AutoInstall.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -0,0 +1,716 @@
+#line 1 "inc/Module/AutoInstall.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/AutoInstall.pm"
+package Module::AutoInstall;
+$Module::AutoInstall::VERSION = '1.01';
+
+use strict;
+use Cwd ();
+use ExtUtils::MakeMaker ();
+
+#line 216
+
+# special map on pre-defined feature sets
+my %FeatureMap = (
+ '' => 'Core Features', # XXX: deprecated
+ '-core' => 'Core Features',
+);
+
+# various lexical flags
+my ( @Missing, @Existing, %DisabledTests, $UnderCPAN, $HasCPANPLUS );
+my ( $Config, $CheckOnly, $SkipInstall, $AcceptDefault, $TestOnly );
+my ( $PostambleActions, $PostambleUsed );
+
+_accept_default( !-t STDIN ); # see if it's a non-interactive session
+_init();
+
+sub _accept_default {
+ $AcceptDefault = shift;
+}
+
+sub missing_modules {
+ return @Missing;
+}
+
+sub do_install {
+ __PACKAGE__->install(
+ [
+ $Config
+ ? ( UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} )
+ : ()
+ ],
+ @Missing,
+ );
+}
+
+# initialize various flags, and/or perform install
+sub _init {
+ foreach my $arg (
+ @ARGV,
+ split(
+ /[\s\t]+/,
+ $ENV{PERL_AUTOINSTALL} || $ENV{PERL_EXTUTILS_AUTOINSTALL} || ''
+ )
+ )
+ {
+ if ( $arg =~ /^--config=(.*)$/ ) {
+ $Config = [ split( ',', $1 ) ];
+ }
+ elsif ( $arg =~ /^--installdeps=(.*)$/ ) {
+ __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) );
+ exit 0;
+ }
+ elsif ( $arg =~ /^--default(?:deps)?$/ ) {
+ $AcceptDefault = 1;
+ }
+ elsif ( $arg =~ /^--check(?:deps)?$/ ) {
+ $CheckOnly = 1;
+ }
+ elsif ( $arg =~ /^--skip(?:deps)?$/ ) {
+ $SkipInstall = 1;
+ }
+ elsif ( $arg =~ /^--test(?:only)?$/ ) {
+ $TestOnly = 1;
+ }
+ }
+}
+
+# overrides MakeMaker's prompt() to automatically accept the default choice
+sub _prompt {
+ goto &ExtUtils::MakeMaker::prompt unless $AcceptDefault;
+
+ my ( $prompt, $default ) = @_;
+ my $y = ( $default =~ /^[Yy]/ );
+
+ print $prompt, ' [', ( $y ? 'Y' : 'y' ), '/', ( $y ? 'n' : 'N' ), '] ';
+ print "$default\n";
+ return $default;
+}
+
+# the workhorse
+sub import {
+ my $class = shift;
+ my @args = @_ or return;
+ my $core_all;
+
+ print "*** $class version " . $class->VERSION . "\n";
+ print "*** Checking for dependencies...\n";
+
+ my $cwd = Cwd::cwd();
+
+ $Config = [];
+
+ my $maxlen = length(
+ (
+ sort { length($b) <=> length($a) }
+ grep { /^[^\-]/ }
+ map {
+ ref($_)
+ ? ( ( ref($_) eq 'HASH' ) ? keys(%$_) : @{$_} )
+ : ''
+ }
+ map { +{@args}->{$_} }
+ grep { /^[^\-]/ or /^-core$/i } keys %{ +{@args} }
+ )[0]
+ );
+
+ while ( my ( $feature, $modules ) = splice( @args, 0, 2 ) ) {
+ my ( @required, @tests, @skiptests );
+ my $default = 1;
+ my $conflict = 0;
+
+ if ( $feature =~ m/^-(\w+)$/ ) {
+ my $option = lc($1);
+
+ # check for a newer version of myself
+ _update_to( $modules, @_ ) and return if $option eq 'version';
+
+ # sets CPAN configuration options
+ $Config = $modules if $option eq 'config';
+
+ # promote every features to core status
+ $core_all = ( $modules =~ /^all$/i ) and next
+ if $option eq 'core';
+
+ next unless $option eq 'core';
+ }
+
+ print "[" . ( $FeatureMap{ lc($feature) } || $feature ) . "]\n";
+
+ $modules = [ %{$modules} ] if UNIVERSAL::isa( $modules, 'HASH' );
+
+ unshift @$modules, -default => &{ shift(@$modules) }
+ if ( ref( $modules->[0] ) eq 'CODE' ); # XXX: bugward combatability
+
+ while ( my ( $mod, $arg ) = splice( @$modules, 0, 2 ) ) {
+ if ( $mod =~ m/^-(\w+)$/ ) {
+ my $option = lc($1);
+
+ $default = $arg if ( $option eq 'default' );
+ $conflict = $arg if ( $option eq 'conflict' );
+ @tests = @{$arg} if ( $option eq 'tests' );
+ @skiptests = @{$arg} if ( $option eq 'skiptests' );
+
+ next;
+ }
+
+ printf( "- %-${maxlen}s ...", $mod );
+
+ if ( $arg and $arg =~ /^\D/ ) {
+ unshift @$modules, $arg;
+ $arg = 0;
+ }
+
+ # XXX: check for conflicts and uninstalls(!) them.
+ if (
+ defined( my $cur = _version_check( _load($mod), $arg ||= 0 ) ) )
+ {
+ print "loaded. ($cur" . ( $arg ? " >= $arg" : '' ) . ")\n";
+ push @Existing, $mod => $arg;
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+ else {
+ print "missing." . ( $arg ? " (would need $arg)" : '' ) . "\n";
+ push @required, $mod => $arg;
+ }
+ }
+
+ next unless @required;
+
+ my $mandatory = ( $feature eq '-core' or $core_all );
+
+ if (
+ !$SkipInstall
+ and (
+ $CheckOnly
+ or _prompt(
+ qq{==> Auto-install the }
+ . ( @required / 2 )
+ . ( $mandatory ? ' mandatory' : ' optional' )
+ . qq{ module(s) from CPAN?},
+ $default ? 'y' : 'n',
+ ) =~ /^[Yy]/
+ )
+ )
+ {
+ push( @Missing, @required );
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+
+ elsif ( !$SkipInstall
+ and $default
+ and $mandatory
+ and
+ _prompt( qq{==> The module(s) are mandatory! Really skip?}, 'n', )
+ =~ /^[Nn]/ )
+ {
+ push( @Missing, @required );
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+
+ else {
+ $DisabledTests{$_} = 1 for map { glob($_) } @tests;
+ }
+ }
+
+ _check_lock(); # check for $UnderCPAN
+
+ if ( @Missing and not( $CheckOnly or $UnderCPAN ) ) {
+ require Config;
+ print
+"*** Dependencies will be installed the next time you type '$Config::Config{make}'.\n";
+
+ # make an educated guess of whether we'll need root permission.
+ print " (You may need to do that as the 'root' user.)\n"
+ if eval '$>';
+ }
+ print "*** $class configuration finished.\n";
+
+ chdir $cwd;
+
+ # import to main::
+ no strict 'refs';
+ *{'main::WriteMakefile'} = \&Write if caller(0) eq 'main';
+}
+
+# CPAN.pm is non-reentrant, so check if we're under it and have no CPANPLUS
+sub _check_lock {
+ return unless @Missing;
+ return if _has_cpanplus();
+
+ require CPAN;
+ CPAN::Config->load;
+ my $lock = MM->catfile( $CPAN::Config->{cpan_home}, ".lock" );
+
+ if ( -f $lock
+ and open( LOCK, $lock )
+ and ( $^O eq 'MSWin32' ? _under_cpan() : <LOCK> == getppid() )
+ and ( $CPAN::Config->{prerequisites_policy} || '' ) ne 'ignore' )
+ {
+ print << '.';
+
+*** Since we're running under CPAN, I'll just let it take care
+ of the dependency's installation later.
+.
+ $UnderCPAN = 1;
+ }
+
+ close LOCK;
+}
+
+sub install {
+ my $class = shift;
+
+ my $i; # used below to strip leading '-' from config keys
+ my @config = ( map { s/^-// if ++$i; $_ } @{ +shift } );
+
+ my ( @modules, @installed );
+ while ( my ( $pkg, $ver ) = splice( @_, 0, 2 ) ) {
+
+ # grep out those already installed
+ if ( defined( _version_check( _load($pkg), $ver ) ) ) {
+ push @installed, $pkg;
+ }
+ else {
+ push @modules, $pkg, $ver;
+ }
+ }
+
+ return @installed unless @modules; # nothing to do
+
+ print "*** Installing dependencies...\n";
+
+ return unless _connected_to('cpan.org');
+
+ my %args = @config;
+ my %failed;
+ local *FAILED;
+ if ( $args{do_once} and open( FAILED, '.#autoinstall.failed' ) ) {
+ while (<FAILED>) { chomp; $failed{$_}++ }
+ close FAILED;
+
+ my @newmod;
+ while ( my ( $k, $v ) = splice( @modules, 0, 2 ) ) {
+ push @newmod, ( $k => $v ) unless $failed{$k};
+ }
+ @modules = @newmod;
+ }
+
+ if ( _has_cpanplus() ) {
+ _install_cpanplus( \@modules, \@config );
+ }
+ else {
+ _install_cpan( \@modules, \@config );
+ }
+
+ print "*** $class installation finished.\n";
+
+ # see if we have successfully installed them
+ while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) {
+ if ( defined( _version_check( _load($pkg), $ver ) ) ) {
+ push @installed, $pkg;
+ }
+ elsif ( $args{do_once} and open( FAILED, '>> .#autoinstall.failed' ) ) {
+ print FAILED "$pkg\n";
+ }
+ }
+
+ close FAILED if $args{do_once};
+
+ return @installed;
+}
+
+sub _install_cpanplus {
+ my @modules = @{ +shift };
+ my @config = @{ +shift };
+ my $installed = 0;
+
+ require CPANPLUS::Backend;
+ my $cp = CPANPLUS::Backend->new;
+ my $conf = $cp->configure_object;
+
+ return unless $conf->can('conf') # 0.05x+ with "sudo" support
+ or _can_write($conf->_get_build('base')); # 0.04x
+
+ # if we're root, set UNINST=1 to avoid trouble unless user asked for it.
+ my $makeflags = $conf->get_conf('makeflags') || '';
+ if ( UNIVERSAL::isa( $makeflags, 'HASH' ) ) {
+
+ # 0.03+ uses a hashref here
+ $makeflags->{UNINST} = 1 unless exists $makeflags->{UNINST};
+ }
+ else {
+
+ # 0.02 and below uses a scalar
+ $makeflags = join( ' ', split( ' ', $makeflags ), 'UNINST=1' )
+ if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } );
+ }
+ $conf->set_conf( makeflags => $makeflags );
+ $conf->set_conf( prereqs => 1 );
+
+ while ( my ( $key, $val ) = splice( @config, 0, 2 ) ) {
+ eval { $conf->set_conf( $key, $val ) };
+ }
+
+ my $modtree = $cp->module_tree;
+ while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) {
+ print "*** Installing $pkg...\n";
+
+ MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall;
+
+ my $success;
+ my $obj = $modtree->{$pkg};
+
+ if ( $obj and defined( _version_check( $obj->{version}, $ver ) ) ) {
+ my $pathname = $pkg;
+ $pathname =~ s/::/\\W/;
+
+ foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) {
+ delete $INC{$inc};
+ }
+
+ my $rv = $cp->install( modules => [ $obj->{module} ] );
+
+ if ( $rv and ( $rv->{ $obj->{module} } or $rv->{ok} ) ) {
+ print "*** $pkg successfully installed.\n";
+ $success = 1;
+ }
+ else {
+ print "*** $pkg installation cancelled.\n";
+ $success = 0;
+ }
+
+ $installed += $success;
+ }
+ else {
+ print << ".";
+*** Could not find a version $ver or above for $pkg; skipping.
+.
+ }
+
+ MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall;
+ }
+
+ return $installed;
+}
+
+sub _install_cpan {
+ my @modules = @{ +shift };
+ my @config = @{ +shift };
+ my $installed = 0;
+ my %args;
+
+ require CPAN;
+ CPAN::Config->load;
+ require Config;
+
+ if (CPAN->VERSION < 1.80) {
+ # no "sudo" support, probe for writableness
+ return unless _can_write( MM->catfile( $CPAN::Config->{cpan_home}, 'sources' ) )
+ and _can_write( $Config::Config{sitelib} );
+ }
+
+ # if we're root, set UNINST=1 to avoid trouble unless user asked for it.
+ my $makeflags = $CPAN::Config->{make_install_arg} || '';
+ $CPAN::Config->{make_install_arg} =
+ join( ' ', split( ' ', $makeflags ), 'UNINST=1' )
+ if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } );
+
+ # don't show start-up info
+ $CPAN::Config->{inhibit_startup_message} = 1;
+
+ # set additional options
+ while ( my ( $opt, $arg ) = splice( @config, 0, 2 ) ) {
+ ( $args{$opt} = $arg, next )
+ if $opt =~ /^force$/; # pseudo-option
+ $CPAN::Config->{$opt} = $arg;
+ }
+
+ local $CPAN::Config->{prerequisites_policy} = 'follow';
+
+ while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) {
+ MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall;
+
+ print "*** Installing $pkg...\n";
+
+ my $obj = CPAN::Shell->expand( Module => $pkg );
+ my $success = 0;
+
+ if ( $obj and defined( _version_check( $obj->cpan_version, $ver ) ) ) {
+ my $pathname = $pkg;
+ $pathname =~ s/::/\\W/;
+
+ foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) {
+ delete $INC{$inc};
+ }
+
+ $obj->force('install') if $args{force};
+
+ my $rv = $obj->install || eval {
+ $CPAN::META->instance( 'CPAN::Distribution', $obj->cpan_file, )
+ ->{install}
+ if $CPAN::META;
+ };
+
+ if ( $rv eq 'YES' ) {
+ print "*** $pkg successfully installed.\n";
+ $success = 1;
+ }
+ else {
+ print "*** $pkg installation failed.\n";
+ $success = 0;
+ }
+
+ $installed += $success;
+ }
+ else {
+ print << ".";
+*** Could not find a version $ver or above for $pkg; skipping.
+.
+ }
+
+ MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall;
+ }
+
+ return $installed;
+}
+
+sub _has_cpanplus {
+ return (
+ $HasCPANPLUS = (
+ $INC{'CPANPLUS/Config.pm'}
+ or _load('CPANPLUS::Shell::Default')
+ )
+ );
+}
+
+# make guesses on whether we're under the CPAN installation directory
+sub _under_cpan {
+ require Cwd;
+ require File::Spec;
+
+ my $cwd = File::Spec->canonpath( Cwd::cwd() );
+ my $cpan = File::Spec->canonpath( $CPAN::Config->{cpan_home} );
+
+ return ( index( $cwd, $cpan ) > -1 );
+}
+
+sub _update_to {
+ my $class = __PACKAGE__;
+ my $ver = shift;
+
+ return
+ if defined( _version_check( _load($class), $ver ) ); # no need to upgrade
+
+ if (
+ _prompt( "==> A newer version of $class ($ver) is required. Install?",
+ 'y' ) =~ /^[Nn]/
+ )
+ {
+ die "*** Please install $class $ver manually.\n";
+ }
+
+ print << ".";
+*** Trying to fetch it from CPAN...
+.
+
+ # install ourselves
+ _load($class) and return $class->import(@_)
+ if $class->install( [], $class, $ver );
+
+ print << '.'; exit 1;
+
+*** Cannot bootstrap myself. :-( Installation terminated.
+.
+}
+
+# check if we're connected to some host, using inet_aton
+sub _connected_to {
+ my $site = shift;
+
+ return (
+ ( _load('Socket') and Socket::inet_aton($site) ) or _prompt(
+ qq(
+*** Your host cannot resolve the domain name '$site', which
+ probably means the Internet connections are unavailable.
+==> Should we try to install the required module(s) anyway?), 'n'
+ ) =~ /^[Yy]/
+ );
+}
+
+# check if a directory is writable; may create it on demand
+sub _can_write {
+ my $path = shift;
+ mkdir( $path, 0755 ) unless -e $path;
+
+ return 1 if -w $path;
+
+ print << ".";
+*** You are not allowed to write to the directory '$path';
+ the installation may fail due to insufficient permissions.
+.
+
+ if (
+ eval '$>' and lc(`sudo -V`) =~ /version/ and _prompt(
+ qq(
+==> Should we try to re-execute the autoinstall process with 'sudo'?),
+ ((-t STDIN) ? 'y' : 'n')
+ ) =~ /^[Yy]/
+ )
+ {
+
+ # try to bootstrap ourselves from sudo
+ print << ".";
+*** Trying to re-execute the autoinstall process with 'sudo'...
+.
+ my $missing = join( ',', @Missing );
+ my $config = join( ',',
+ UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} )
+ if $Config;
+
+ return
+ unless system( 'sudo', $^X, $0, "--config=$config",
+ "--installdeps=$missing" );
+
+ print << ".";
+*** The 'sudo' command exited with error! Resuming...
+.
+ }
+
+ return _prompt(
+ qq(
+==> Should we try to install the required module(s) anyway?), 'n'
+ ) =~ /^[Yy]/;
+}
+
+# load a module and return the version it reports
+sub _load {
+ my $mod = pop; # class/instance doesn't matter
+ my $file = $mod;
+
+ $file =~ s|::|/|g;
+ $file .= '.pm';
+
+ local $@;
+ return eval { require $file; $mod->VERSION } || ( $@ ? undef: 0 );
+}
+
+# compare two versions, either use Sort::Versions or plain comparison
+sub _version_check {
+ my ( $cur, $min ) = @_;
+ return unless defined $cur;
+
+ $cur =~ s/\s+$//;
+
+ # check for version numbers that are not in decimal format
+ if ( ref($cur) or ref($min) or $cur =~ /v|\..*\./ or $min =~ /v|\..*\./ ) {
+ if ( $version::VERSION or defined( _load('version') ) ) {
+
+ # use version.pm if it is installed.
+ return (
+ ( version->new($cur) >= version->new($min) ) ? $cur : undef );
+ }
+ elsif ( $Sort::Versions::VERSION or defined( _load('Sort::Versions') ) )
+ {
+
+ # use Sort::Versions as the sorting algorithm for a.b.c versions
+ return ( ( Sort::Versions::versioncmp( $cur, $min ) != -1 )
+ ? $cur
+ : undef );
+ }
+
+ warn "Cannot reliably compare non-decimal formatted versions.\n"
+ . "Please install version.pm or Sort::Versions.\n";
+ }
+
+ # plain comparison
+ local $^W = 0; # shuts off 'not numeric' bugs
+ return ( $cur >= $min ? $cur : undef );
+}
+
+# nothing; this usage is deprecated.
+sub main::PREREQ_PM { return {}; }
+
+sub _make_args {
+ my %args = @_;
+
+ $args{PREREQ_PM} = { %{ $args{PREREQ_PM} || {} }, @Existing, @Missing }
+ if $UnderCPAN or $TestOnly;
+
+ if ( $args{EXE_FILES} and -e 'MANIFEST' ) {
+ require ExtUtils::Manifest;
+ my $manifest = ExtUtils::Manifest::maniread('MANIFEST');
+
+ $args{EXE_FILES} =
+ [ grep { exists $manifest->{$_} } @{ $args{EXE_FILES} } ];
+ }
+
+ $args{test}{TESTS} ||= 't/*.t';
+ $args{test}{TESTS} = join( ' ',
+ grep { !exists( $DisabledTests{$_} ) }
+ map { glob($_) } split( /\s+/, $args{test}{TESTS} ) );
+
+ my $missing = join( ',', @Missing );
+ my $config =
+ join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} )
+ if $Config;
+
+ $PostambleActions = (
+ $missing
+ ? "\$(PERL) $0 --config=$config --installdeps=$missing"
+ : "\@\$(NOOP)"
+ );
+
+ return %args;
+}
+
+# a wrapper to ExtUtils::MakeMaker::WriteMakefile
+sub Write {
+ require Carp;
+ Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+
+ if ($CheckOnly) {
+ print << ".";
+*** Makefile not written in check-only mode.
+.
+ return;
+ }
+
+ my %args = _make_args(@_);
+
+ no strict 'refs';
+
+ $PostambleUsed = 0;
+ local *MY::postamble = \&postamble unless defined &MY::postamble;
+ ExtUtils::MakeMaker::WriteMakefile(%args);
+
+ print << "." unless $PostambleUsed;
+*** WARNING: Makefile written with customized MY::postamble() without
+ including contents from Module::AutoInstall::postamble() --
+ auto installation features disabled. Please contact the author.
+.
+
+ return 1;
+}
+
+sub postamble {
+ $PostambleUsed = 1;
+
+ return << ".";
+
+config :: installdeps
+\t\@\$(NOOP)
+
+checkdeps ::
+\t\$(PERL) $0 --checkdeps
+
+installdeps ::
+\t$PostambleActions
+
+.
+
+}
+
+1;
+
+__END__
+
+#line 943
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,9 @@
-#line 1 "inc/Module/Install/AutoInstall.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/AutoInstall.pm"
+#line 1 "inc/Module/Install/AutoInstall.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/AutoInstall.pm"
package Module::Install::AutoInstall;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw{Module::Install::Base};
+
sub AutoInstall { $_[0] }
sub run {
@@ -18,45 +20,35 @@
my $self = shift;
return if $self->{done}++;
-# ExtUtils::AutoInstall Bootstrap Code, version 7.
-AUTO:{my$p='ExtUtils::AutoInstall';my$v=0.49;$p->VERSION||0>=$v
-or+eval"use $p $v;1"or+do{my$e=$ENV{PERL_EXTUTILS_AUTOINSTALL};
-(!defined($e)||$e!~m/--(?:default|skip|testonly)/and-t STDIN or
-eval"use ExtUtils::MakeMaker;WriteMakefile(PREREQ_PM=>{'$p',$v}
-);1"and exit)and print"==> $p $v required. Install it from CP".
-"AN? [Y/n] "and<STDIN>!~/^n/i and print"*** Installing $p\n"and
-do{if (eval '$>' and lc(`sudo -V`) =~ /version/){system('sudo',
-$^X,"-MCPANPLUS","-e","CPANPLUS::install $p");eval"use $p $v;1"
-||system('sudo', $^X, "-MCPAN", "-e", "CPAN::install $p")}eval{
-require CPANPLUS;CPANPLUS::install$p};eval"use $p $v;1"or eval{
-require CPAN;CPAN::install$p};eval"use $p $v;1"||die"*** Please
-manually install $p $v from cpan.org first...\n"}}}
-
# Flatten array of arrays into a single array
my @core = map @$_, map @$_, grep ref,
$self->build_requires, $self->requires;
- while ( @core and @_ > 1 and $_[0] =~ /^-\w+$/ ) {
- push @core, splice(@_, 0, 2);
- }
+ my @config = @_;
- ExtUtils::AutoInstall->import(
- (@core ? (-core => \@core) : ()), @_, $self->features
+ # We'll need Module::AutoInstall
+ $self->include('Module::AutoInstall');
+ require Module::AutoInstall;
+
+ Module::AutoInstall->import(
+ (@config ? (-config => \@config) : ()),
+ (@core ? (-core => \@core) : ()),
+ $self->features,
);
- $self->makemaker_args( ExtUtils::AutoInstall::_make_args() );
+ $self->makemaker_args( Module::AutoInstall::_make_args() );
my $class = ref($self);
$self->postamble(
"# --- $class section:\n" .
- ExtUtils::AutoInstall::postamble()
+ Module::AutoInstall::postamble()
);
}
sub auto_install_now {
my $self = shift;
- $self->auto_install;
- ExtUtils::AutoInstall::do_install();
+ $self->auto_install(@_);
+ Module::AutoInstall::do_install();
}
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,8 +1,14 @@
-#line 1 "inc/Module/Install/Base.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Base.pm"
+#line 1 "inc/Module/Install/Base.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Base.pm"
package Module::Install::Base;
-#line 28
+# Suspend handler for "redefined" warnings
+BEGIN {
+ my $w = $SIG{__WARN__};
+ $SIG{__WARN__} = sub { $w };
+}
+#line 36
+
sub new {
my ($class, %args) = @_;
@@ -15,27 +21,28 @@
bless(\%args, $class);
}
-#line 46
+#line 56
sub AUTOLOAD {
my $self = shift;
- goto &{$self->_top->autoload};
+
+ local $@;
+ my $autoload = eval { $self->_top->autoload } or return;
+ goto &$autoload;
}
-#line 57
+#line 72
sub _top { $_[0]->{_top} }
-#line 68
+#line 85
sub admin {
- my $self = shift;
- $self->_top->{admin} or Module::Install::Base::FakeAdmin->new;
+ $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new;
}
sub is_admin {
- my $self = shift;
- $self->admin->VERSION;
+ $_[0]->admin->VERSION;
}
sub DESTROY {}
@@ -44,11 +51,16 @@
my $Fake;
sub new { $Fake ||= bless(\@_, $_[0]) }
+
sub AUTOLOAD {}
+
sub DESTROY {}
+# Restore warning handler
+BEGIN {
+ $SIG{__WARN__} = $SIG{__WARN__}->();
+}
+
1;
-__END__
-
-#line 112
+#line 134
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,6 +1,9 @@
-#line 1 "inc/Module/Install/Can.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Can.pm"
+#line 1 "inc/Module/Install/Can.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Can.pm"
package Module::Install::Can;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
$VERSION = '0.01';
use strict;
@@ -8,6 +11,20 @@
use File::Spec ();
use ExtUtils::MakeMaker ();
+# check if we can load some module
+sub can_use {
+ my ($self, $mod, $ver) = @_;
+ $mod =~ s{::|\\}{/}g;
+ $mod .= ".pm" unless $mod =~ /\.pm$/i;
+
+ my $pkg = $mod;
+ $pkg =~ s{/}{::}g;
+ $pkg =~ s{\.pm$}{}i;
+
+ local $@;
+ eval { require $mod; $pkg->VERSION($ver || 0); 1 };
+}
+
# check if we can run some command
sub can_run {
my ($self, $cmd) = @_;
@@ -35,4 +52,21 @@
return;
}
+# Fix Cygwin bug on maybe_command();
+if ($^O eq 'cygwin') {
+ require ExtUtils::MM_Cygwin;
+ require ExtUtils::MM_Win32;
+ if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) {
+ *ExtUtils::MM_Cygwin::maybe_command = sub {
+ my ($self, $file) = @_;
+ if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) {
+ ExtUtils::MM_Win32->maybe_command($file);
+ }
+ else {
+ ExtUtils::MM_Unix->maybe_command($file);
+ }
+ }
+ }
+}
+
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,9 @@
-#line 1 "inc/Module/Install/Fetch.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Fetch.pm"
+#line 1 "inc/Module/Install/Fetch.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Fetch.pm"
package Module::Install::Fetch;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
$VERSION = '0.01';
sub get_file {
@@ -9,7 +11,7 @@
my ($scheme, $host, $path, $file) =
$args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
- if ($scheme eq 'http' and !eval { require LWP::Simple; 1 }) {
+ if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) {
$args{url} = $args{ftp_url}
or (warn("LWP support unavailable!\n"), return);
($scheme, $host, $path, $file) =
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,10 +1,12 @@
-#line 1 "inc/Module/Install/Include.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Include.pm"
+#line 1 "inc/Module/Install/Include.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Include.pm"
package Module::Install::Include;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
sub include { +shift->admin->include(@_) };
sub include_deps { +shift->admin->include_deps(@_) };
sub auto_include { +shift->admin->auto_include(@_) };
sub auto_include_deps { +shift->admin->auto_include_deps(@_) };
-
+sub auto_include_dependent_dists { +shift->admin->auto_include_dependent_dists(@_) }
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,9 @@
-#line 1 "inc/Module/Install/Makefile.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Makefile.pm"
+#line 1 "inc/Module/Install/Makefile.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Makefile.pm"
package Module::Install::Makefile;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
$VERSION = '0.01';
use strict 'vars';
@@ -23,6 +25,14 @@
$args;
}
+sub build_subdirs {
+ my $self = shift;
+ my $subdirs = $self->makemaker_args->{DIR} ||= [];
+ for my $subdir (@_) {
+ push @$subdirs, $subdir;
+ }
+}
+
sub clean_files {
my $self = shift;
my $clean = $self->makemaker_args->{clean} ||= {};
@@ -54,15 +64,17 @@
$args->{VERSION} = $self->version || $self->determine_VERSION($args);
$args->{NAME} =~ s/-/::/g;
+ $args->{test} = {TESTS => $self->tests} if $self->tests;
+
if ($] >= 5.005) {
- $args->{ABSTRACT} = $self->abstract;
- $args->{AUTHOR} = $self->author;
+ $args->{ABSTRACT} = $self->abstract;
+ $args->{AUTHOR} = $self->author;
}
if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) {
$args->{NO_META} = 1;
}
if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 ) {
- $args->{SIGN} = 1 if $self->sign;
+ $args->{SIGN} = 1 if $self->sign;
}
delete $args->{SIGN} unless $self->is_admin;
@@ -72,10 +84,13 @@
($self->build_requires, $self->requires) );
# merge both kinds of requires into prereq_pm
- my $dir = ($args->{DIR} ||= []);
+ my $subdirs = ($args->{DIR} ||= []);
if ($self->bundles) {
- push @$dir, map "$_->[1]", @{$self->bundles};
- delete $prereq->{$_->[0]} for @{$self->bundles};
+ foreach my $bundle (@{ $self->bundles }) {
+ my ($file, $dir) = @$bundle;
+ push @$subdirs, $dir if -d $dir;
+ delete $prereq->{$file};
+ }
}
if (my $perl_version = $self->perl_version) {
@@ -106,6 +121,7 @@
my $postamble = "# Postamble by $top_class $top_version\n" .
($self->postamble || '');
+ local *MAKEFILE;
open MAKEFILE, '< Makefile' or die $!;
my $makefile = do { local $/; <MAKEFILE> };
close MAKEFILE;
@@ -140,4 +156,4 @@
__END__
-#line 273
+#line 288
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,25 +1,31 @@
-#line 1 "inc/Module/Install/Metadata.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Metadata.pm"
+#line 1 "inc/Module/Install/Metadata.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Metadata.pm"
package Module::Install::Metadata;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
-$VERSION = '0.04';
+use Module::Install::Base;
+ at ISA = qw{Module::Install::Base};
+$VERSION = '0.06';
+
use strict 'vars';
-use vars qw($VERSION);
-sub Meta { shift }
+my @scalar_keys = qw{
+ name module_name abstract author version license
+ distribution_type perl_version tests
+};
-my @scalar_keys = qw(
- name module_name version abstract author license
- distribution_type sign perl_version
-);
-my @tuple_keys = qw(build_requires requires recommends bundles);
+my @tuple_keys = qw{
+ build_requires requires recommends bundles
+};
+sub Meta { shift }
+sub Meta_ScalarKeys { @scalar_keys }
+sub Meta_TupleKeys { @tuple_keys }
+
foreach my $key (@scalar_keys) {
*$key = sub {
my $self = shift;
- return $self->{'values'}{$key} unless @_;
- $self->{'values'}{$key} = shift;
+ return $self->{values}{$key} if defined wantarray and !@_;
+ $self->{values}{$key} = shift;
return $self;
};
}
@@ -27,122 +33,152 @@
foreach my $key (@tuple_keys) {
*$key = sub {
my $self = shift;
- return $self->{'values'}{$key} unless @_;
+ return $self->{values}{$key} unless @_;
+
my @rv;
while (@_) {
- my $module = shift or last;
+ my $module = shift or last;
my $version = shift || 0;
- if ($module eq 'perl') {
+ if ( $module eq 'perl' ) {
$version =~ s{^(\d+)\.(\d+)\.(\d+)}
{$1 + $2/1_000 + $3/1_000_000}e;
$self->perl_version($version);
next;
}
- my $rv = [$module, $version];
- push @{$self->{'values'}{$key}}, $rv;
+ my $rv = [ $module, $version ];
push @rv, $rv;
}
- return @rv;
+ push @{ $self->{values}{$key} }, @rv;
+ @rv;
};
}
-sub features {
+sub sign {
my $self = shift;
- while (my ($name, $mods) = splice(@_, 0, 2)) {
- my $count = 0;
- push @{$self->{'values'}{'features'}}, ($name => [
- map { (++$count % 2 and ref($_) and ($count += $#$_)) ? @$_ : $_ } @$mods
- ] );
+ return $self->{'values'}{'sign'} if defined wantarray and !@_;
+ $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 );
+ return $self;
+}
+
+sub all_from {
+ my ( $self, $file ) = @_;
+
+ unless ( defined($file) ) {
+ my $name = $self->name
+ or die "all_from called with no args without setting name() first";
+ $file = join('/', 'lib', split(/-/, $name)) . '.pm';
+ $file =~ s{.*/}{} unless -e $file;
+ die "all_from: cannot find $file from $name" unless -e $file;
}
- return @{$self->{'values'}{'features'}};
+
+ $self->version_from($file) unless $self->version;
+ $self->perl_version_from($file) unless $self->perl_version;
+
+ # The remaining probes read from POD sections; if the file
+ # has an accompanying .pod, use that instead
+ my $pod = $file;
+ if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) {
+ $file = $pod;
+ }
+
+ $self->author_from($file) unless $self->author;
+ $self->license_from($file) unless $self->license;
+ $self->abstract_from($file) unless $self->abstract;
}
-sub no_index {
- my $self = shift;
- my $type = shift;
- push @{$self->{'values'}{'no_index'}{$type}}, @_ if $type;
- return $self->{'values'}{'no_index'};
+sub provides {
+ my $self = shift;
+ my $provides = ( $self->{values}{provides} ||= {} );
+ %$provides = (%$provides, @_) if @_;
+ return $provides;
}
-sub _dump {
+sub auto_provides {
my $self = shift;
- my $package = ref($self->_top);
- my $version = $self->_top->VERSION;
- my %values = %{$self->{'values'}};
+ return $self unless $self->is_admin;
- delete $values{sign};
- if (my $perl_version = delete $values{perl_version}) {
- # Always canonical to three-dot version
- $perl_version =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2), int($3))}e
- if $perl_version >= 5.006;
- $values{requires} = [
- [perl => $perl_version],
- @{$values{requires}||[]},
- ];
+ unless (-e 'MANIFEST') {
+ warn "Cannot deduce auto_provides without a MANIFEST, skipping\n";
+ return $self;
}
- warn "No license specified, setting license = 'unknown'\n"
- unless $values{license};
+ # Avoid spurious warnings as we are not checking manifest here.
- $values{license} ||= 'unknown';
- $values{distribution_type} ||= 'module';
- $values{name} ||= do {
- my $name = $values{module_name};
- $name =~ s/::/-/g;
- $name;
- } if $values{module_name};
+ local $SIG{__WARN__} = sub {1};
+ require ExtUtils::Manifest;
+ local *ExtUtils::Manifest::manicheck = sub { return };
- if ($values{name} =~ /::/) {
- my $name = $values{name};
- $name =~ s/::/-/g;
- die "Error in name(): '$values{name}' should be '$name'!\n";
- }
+ require Module::Build;
+ my $build = Module::Build->new(
+ dist_name => $self->{name},
+ dist_version => $self->{version},
+ license => $self->{license},
+ );
+ $self->provides(%{ $build->find_dist_packages || {} });
+}
- my $dump = '';
- foreach my $key (@scalar_keys) {
- $dump .= "$key: $values{$key}\n" if exists $values{$key};
- }
- foreach my $key (@tuple_keys) {
- next unless exists $values{$key};
- $dump .= "$key:\n";
- foreach (@{$values{$key}}) {
- $dump .= " $_->[0]: $_->[1]\n";
- }
- }
+sub feature {
+ my $self = shift;
+ my $name = shift;
+ my $features = ( $self->{values}{features} ||= [] );
- if (my $no_index = $values{no_index}) {
- push @{$no_index->{'directory'}}, 'inc';
- require YAML;
- local $YAML::UseHeader = 0;
- $dump .= YAML::Dump({ no_index => $no_index});
+ my $mods;
+
+ if ( @_ == 1 and ref( $_[0] ) ) {
+ # The user used ->feature like ->features by passing in the second
+ # argument as a reference. Accomodate for that.
+ $mods = $_[0];
}
else {
- $dump .= << "META";
-no_index:
- directory:
- - inc
-META
+ $mods = \@_;
}
-
- $dump .= "generated_by: $package version $version\n";
- return $dump;
+
+ my $count = 0;
+ push @$features, (
+ $name => [
+ map {
+ ref($_) ? ( ref($_) eq 'HASH' ) ? %$_
+ : @$_
+ : $_
+ } @$mods
+ ]
+ );
+
+ return @$features;
}
+sub features {
+ my $self = shift;
+ while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
+ $self->feature( $name, @$mods );
+ }
+ return @{ $self->{values}{features} };
+}
+
+sub no_index {
+ my $self = shift;
+ my $type = shift;
+ push @{ $self->{values}{no_index}{$type} }, @_ if $type;
+ return $self->{values}{no_index};
+}
+
sub read {
my $self = shift;
$self->include_deps( 'YAML', 0 );
+
require YAML;
- my $data = YAML::LoadFile( 'META.yml' );
+ my $data = YAML::LoadFile('META.yml');
+
# Call methods explicitly in case user has already set some values.
- while ( my ($key, $value) = each %$data ) {
- next unless $self->can( $key );
- if (ref $value eq 'HASH') {
- while (my ($module, $version) = each %$value) {
- $self->$key( $module => $version );
+ while ( my ( $key, $value ) = each %$data ) {
+ next unless $self->can($key);
+ if ( ref $value eq 'HASH' ) {
+ while ( my ( $module, $version ) = each %$value ) {
+ $self->can($key)->($self, $module => $version );
}
}
else {
- $self->$key( $value );
+ $self->can($key)->($self, $value);
}
}
return $self;
@@ -151,37 +187,113 @@
sub write {
my $self = shift;
return $self unless $self->is_admin;
-
- META_NOT_OURS: {
- local *FH;
- if (open FH, "META.yml") {
- while (<FH>) {
- last META_NOT_OURS if /^generated_by: Module::Install\b/;
- }
- return $self if -s FH;
- }
- }
-
- warn "Writing META.yml\n";
- open META, "> META.yml" or warn "Cannot write to META.yml: $!";
- print META $self->_dump;
- close META;
+ $self->admin->write_meta;
return $self;
}
sub version_from {
- my ($self, $version_from) = @_;
+ my ( $self, $file ) = @_;
require ExtUtils::MM_Unix;
- $self->version(ExtUtils::MM_Unix->parse_version($version_from));
+ $self->version( ExtUtils::MM_Unix->parse_version($file) );
}
sub abstract_from {
- my ($self, $abstract_from) = @_;
+ my ( $self, $file ) = @_;
require ExtUtils::MM_Unix;
$self->abstract(
- bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix')
- ->parse_abstract($abstract_from)
- );
+ bless(
+ { DISTNAME => $self->name },
+ 'ExtUtils::MM_Unix'
+ )->parse_abstract($file)
+ );
}
+sub _slurp {
+ my ( $self, $file ) = @_;
+
+ local *FH;
+ open FH, "< $file" or die "Cannot open $file.pod: $!";
+ do { local $/; <FH> };
+}
+
+sub perl_version_from {
+ my ( $self, $file ) = @_;
+
+ if (
+ $self->_slurp($file) =~ m/
+ ^
+ use \s*
+ v?
+ ([\d\.]+)
+ \s* ;
+ /ixms
+ )
+ {
+ $self->perl_version($1);
+ }
+ else {
+ warn "Cannot determine perl version info from $file\n";
+ return;
+ }
+}
+
+sub author_from {
+ my ( $self, $file ) = @_;
+ my $content = $self->_slurp($file);
+ if ($content =~ m/
+ =head \d \s+ (?:authors?)\b \s*
+ ([^\n]*)
+ |
+ =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
+ .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
+ ([^\n]*)
+ /ixms) {
+ my $author = $1 || $2;
+ $author =~ s{E<lt>}{<}g;
+ $author =~ s{E<gt>}{>}g;
+ $self->author($author);
+ }
+ else {
+ warn "Cannot determine author info from $file\n";
+ }
+}
+
+sub license_from {
+ my ( $self, $file ) = @_;
+
+ if (
+ $self->_slurp($file) =~ m/
+ =head \d \s+
+ (?:licen[cs]e|licensing|copyright|legal)\b
+ (.*?)
+ (=head\\d.*|=cut.*|)
+ \z
+ /ixms
+ )
+ {
+ my $license_text = $1;
+ my @phrases = (
+ 'under the same (?:terms|license) as perl itself' => 'perl',
+ 'GNU public license' => 'gpl',
+ 'GNU lesser public license' => 'gpl',
+ 'BSD license' => 'bsd',
+ 'Artistic license' => 'artistic',
+ 'GPL' => 'gpl',
+ 'LGPL' => 'lgpl',
+ 'BSD' => 'bsd',
+ 'Artistic' => 'artistic',
+ );
+ while ( my ( $pattern, $license ) = splice( @phrases, 0, 2 ) ) {
+ $pattern =~ s{\s+}{\\s+}g;
+ if ( $license_text =~ /\b$pattern\b/i ) {
+ $self->license($license);
+ return 1;
+ }
+ }
+ }
+
+ warn "Cannot determine license info from $file\n";
+ return 'unknown';
+}
+
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,11 @@
-#line 1 "inc/Module/Install/Scripts.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Scripts.pm"
+#line 1 "inc/Module/Install/Scripts.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Scripts.pm"
package Module::Install::Scripts;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
$VERSION = '0.02';
+
use strict;
use File::Basename ();
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,7 +1,9 @@
-#line 1 "inc/Module/Install/Win32.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Win32.pm"
+#line 1 "inc/Module/Install/Win32.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/Win32.pm"
package Module::Install::Win32;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
$VERSION = '0.02';
use strict;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,13 +1,15 @@
-#line 1 "inc/Module/Install/WriteAll.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/WriteAll.pm"
+#line 1 "inc/Module/Install/WriteAll.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install/WriteAll.pm"
package Module::Install::WriteAll;
-use Module::Install::Base; @ISA = qw(Module::Install::Base);
+use Module::Install::Base;
+ at ISA = qw(Module::Install::Base);
+
sub WriteAll {
my $self = shift;
my %args = (
- meta => 1,
- sign => 0,
- inline => 0,
+ meta => 1,
+ sign => 0,
+ inline => 0,
check_nmake => 1,
@_
);
@@ -17,10 +19,10 @@
$self->admin->WriteAll(%args) if $self->is_admin;
if ($0 =~ /Build.PL$/i) {
- $self->Build->write;
+ $self->Build->write;
}
else {
- $self->check_nmake if $args{check_nmake};
+ $self->check_nmake if $args{check_nmake};
$self->makemaker_args( PL_FILES => {} )
unless $self->makemaker_args->{'PL_FILES'};
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,8 +1,17 @@
-#line 1 "inc/Module/Install.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install.pm"
+#line 1 "/home/autrijus/work/Module-Signature-0.50/inc/Module/Install.pm - /usr/local/lib/perl5/site_perl/5.8.8/Module/Install.pm"
package Module::Install;
-$VERSION = '0.36';
-die << "." unless $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'};
+use 5.004;
+use strict 'vars';
+use vars qw{$VERSION};
+BEGIN {
+ # Don't forget to update Module::Install::Admin too!
+ $VERSION = '0.55';
+}
+
+# inc::Module::Install must be loaded first
+unless ( $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'} ) {
+ die <<"END_DIE";
Please invoke ${\__PACKAGE__} with:
use inc::${\__PACKAGE__};
@@ -11,23 +20,40 @@
use ${\__PACKAGE__};
-.
+END_DIE
+}
-use strict 'vars';
-use Cwd ();
+use Cwd ();
+use FindBin;
use File::Find ();
use File::Path ();
- at inc::Module::Install::ISA = 'Module::Install';
*inc::Module::Install::VERSION = *VERSION;
+ at inc::Module::Install::ISA = 'Module::Install';
-#line 129
+sub autoload {
+ my $self = shift;
+ my $caller = $self->_caller;
+ my $cwd = Cwd::cwd();
+ my $sym = "$caller\::AUTOLOAD";
+ $sym->{$cwd} = sub {
+ my $pwd = Cwd::cwd();
+ if ( my $code = $sym->{$pwd} ) {
+ # delegate back to parent dirs
+ goto &$code unless $cwd eq $pwd;
+ }
+ $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller - $sym";
+ unshift @_, ($self, $1);
+ goto &{$self->can('call')} unless uc($1) eq $1;
+ };
+}
+
sub import {
my $class = shift;
- my $self = $class->new(@_);
+ my $self = $class->new(@_);
- if (not -f $self->{file}) {
+ unless ( -f $self->{file} ) {
require "$self->{path}/$self->{dispatch}.pm";
File::Path::mkpath("$self->{prefix}/$self->{author}");
$self->{admin} =
@@ -37,44 +63,64 @@
goto &{"$self->{name}::import"};
}
- *{caller(0) . "::AUTOLOAD"} = $self->autoload;
+ *{$self->_caller . "::AUTOLOAD"} = $self->autoload;
+ $self->preload;
# Unregister loader and worker packages so subdirs can use them again
delete $INC{"$self->{file}"};
delete $INC{"$self->{path}.pm"};
}
-#line 156
+sub preload {
+ my ($self) = @_;
-sub autoload {
- my $self = shift;
- my $caller = caller;
+ unless ( $self->{extentions} ) {
+ $self->load_extensions(
+ "$self->{prefix}/$self->{path}", $self
+ );
+ }
- my $cwd = Cwd::cwd();
- my $sym = "$caller\::AUTOLOAD";
+ my @exts = @{$self->{extensions}};
+ unless ( @exts ) {
+ my $admin = $self->{admin};
+ @exts = $admin->load_all_extensions;
+ }
- $sym->{$cwd} = sub {
- my $pwd = Cwd::cwd();
- if (my $code = $sym->{$pwd}) {
- goto &$code unless $cwd eq $pwd; # delegate back to parent dirs
+ my %seen_method;
+ foreach my $obj ( @exts ) {
+ while (my ($method, $glob) = each %{ref($obj) . '::'}) {
+ next unless defined *{$glob}{CODE};
+ next if $method =~ /^_/;
+ next if $method eq uc($method);
+ $seen_method{$method}++;
}
- $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller";
- unshift @_, ($self, $1);
- goto &{$self->can('call')} unless uc($1) eq $1;
- };
+ }
+
+ my $caller = $self->_caller;
+ foreach my $name (sort keys %seen_method) {
+ *{"${caller}::$name"} = sub {
+ ${"${caller}::AUTOLOAD"} = "${caller}::$name";
+ goto &{"${caller}::AUTOLOAD"};
+ };
+ }
}
-#line 181
-
sub new {
my ($class, %args) = @_;
+ # ignore the prefix on extension modules built from top level.
+ my $base_path = Cwd::abs_path($FindBin::Bin);
+ unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) {
+ delete $args{prefix};
+ }
+
return $args{_self} if $args{_self};
$args{dispatch} ||= 'Admin';
$args{prefix} ||= 'inc';
$args{author} ||= '.author';
$args{bundle} ||= 'inc/BUNDLES';
+ $args{base} ||= $base_path;
$class =~ s/^\Q$args{prefix}\E:://;
$args{name} ||= $class;
@@ -84,24 +130,20 @@
$args{path} = $args{name};
$args{path} =~ s!::!/!g;
}
- $args{file} ||= "$args{prefix}/$args{path}.pm";
+ $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm";
bless(\%args, $class);
}
-#line 210
-
sub call {
my $self = shift;
my $method = shift;
- my $obj = $self->load($method) or return;
+ my $obj = $self->load($method) or return;
unshift @_, $obj;
goto &{$obj->can($method)};
}
-#line 225
-
sub load {
my ($self, $method) = @_;
@@ -113,10 +155,10 @@
return $obj if $obj->can($method);
}
- my $admin = $self->{admin} or die << "END";
+ my $admin = $self->{admin} or die <<"END_DIE";
The '$method' method does not exist in the '$self->{prefix}' path!
Please remove the '$self->{prefix}' directory and run $0 again to load it.
-END
+END_DIE
my $obj = $admin->load($method, 1);
push @{$self->{extensions}}, $obj;
@@ -124,8 +166,6 @@
$obj;
}
-#line 255
-
sub load_extensions {
my ($self, $path, $top_obj) = @_;
@@ -137,33 +177,46 @@
my ($file, $pkg) = @{$rv};
next if $self->{pathnames}{$pkg};
- eval { require $file; 1 } or (warn($@), next);
+ local $@;
+ my $new = eval { require $file; $pkg->can('new') };
+ unless ( $new ) {
+ warn $@ if $@;
+ next;
+ }
$self->{pathnames}{$pkg} = delete $INC{$file};
- push @{$self->{extensions}}, $pkg->new( _top => $top_obj );
+ push @{$self->{extensions}}, &{$new}($pkg, _top => $top_obj );
}
+
+ $self->{extensions} ||= [];
}
-#line 279
-
sub find_extensions {
my ($self, $path) = @_;
+
my @found;
-
- File::Find::find(sub {
+ File::Find::find( sub {
my $file = $File::Find::name;
return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is;
return if $1 eq $self->{dispatch};
$file = "$self->{path}/$1.pm";
my $pkg = "$self->{name}::$1"; $pkg =~ s!/!::!g;
- push @found, [$file, $pkg];
- }, $path) if -d $path;
+ push @found, [ $file, $pkg ];
+ }, $path ) if -d $path;
@found;
}
-1;
+sub _caller {
+ my $depth = 0;
+ my $caller = caller($depth);
-__END__
+ while ($caller eq __PACKAGE__) {
+ $depth++;
+ $caller = caller($depth);
+ }
-#line 617
+ $caller;
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder/Module.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder/Module.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder/Module.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -0,0 +1,82 @@
+#line 1 "inc/Test/Builder/Module.pm - /usr/local/lib/perl5/site_perl/5.8.7/Test/Builder/Module.pm"
+package Test::Builder::Module;
+
+use Test::Builder;
+
+require Exporter;
+ at ISA = qw(Exporter);
+
+$VERSION = '0.03';
+
+use strict;
+
+# 5.004's Exporter doesn't have export_to_level.
+my $_export_to_level = sub {
+ my $pkg = shift;
+ my $level = shift;
+ (undef) = shift; # redundant arg
+ my $callpkg = caller($level);
+ $pkg->export($callpkg, @_);
+};
+
+
+#line 82
+
+sub import {
+ my($class) = shift;
+
+ my $test = $class->builder;
+
+ my $caller = caller;
+
+ $test->exported_to($caller);
+
+ $class->import_extra(\@_);
+ my(@imports) = $class->_strip_imports(\@_);
+
+ $test->plan(@_);
+
+ $class->$_export_to_level(1, $class, @imports);
+}
+
+
+sub _strip_imports {
+ my $class = shift;
+ my $list = shift;
+
+ my @imports = ();
+ my @other = ();
+ my $idx = 0;
+ while( $idx <= $#{$list} ) {
+ my $item = $list->[$idx];
+
+ if( defined $item and $item eq 'import' ) {
+ push @imports, @{$list->[$idx+1]};
+ $idx++;
+ }
+ else {
+ push @other, $item;
+ }
+
+ $idx++;
+ }
+
+ @$list = @other;
+
+ return @imports;
+}
+
+
+#line 144
+
+sub import_extra {}
+
+
+#line 175
+
+sub builder {
+ return Test::Builder->new;
+}
+
+
+1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,4 +1,4 @@
-#line 1 "inc/Test/Builder.pm - /usr/local/lib/perl5/site_perl/5.8.6/Test/Builder.pm"
+#line 1 "inc/Test/Builder.pm - /usr/local/lib/perl5/site_perl/5.8.7/Test/Builder.pm"
package Test::Builder;
use 5.004;
@@ -8,64 +8,139 @@
$^C ||= 0;
use strict;
-use vars qw($VERSION $CLASS);
-$VERSION = '0.17';
-$CLASS = __PACKAGE__;
+use vars qw($VERSION);
+$VERSION = '0.32';
+$VERSION = eval $VERSION; # make the alpha version come out as a number
-my $IsVMS = $^O eq 'VMS';
-
# Make Test::Builder thread-safe for ithreads.
BEGIN {
use Config;
- if( $] >= 5.008 && $Config{useithreads} ) {
- require threads;
+ # Load threads::shared when threads are turned on
+ if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) {
require threads::shared;
- threads::shared->import;
+
+ # Hack around YET ANOTHER threads::shared bug. It would
+ # occassionally forget the contents of the variable when sharing it.
+ # So we first copy the data, then share, then put our copy back.
+ *share = sub (\[$@%]) {
+ my $type = ref $_[0];
+ my $data;
+
+ if( $type eq 'HASH' ) {
+ %$data = %{$_[0]};
+ }
+ elsif( $type eq 'ARRAY' ) {
+ @$data = @{$_[0]};
+ }
+ elsif( $type eq 'SCALAR' ) {
+ $$data = ${$_[0]};
+ }
+ else {
+ die "Unknown type: ".$type;
+ }
+
+ $_[0] = &threads::shared::share($_[0]);
+
+ if( $type eq 'HASH' ) {
+ %{$_[0]} = %$data;
+ }
+ elsif( $type eq 'ARRAY' ) {
+ @{$_[0]} = @$data;
+ }
+ elsif( $type eq 'SCALAR' ) {
+ ${$_[0]} = $$data;
+ }
+ else {
+ die "Unknown type: ".$type;
+ }
+
+ return $_[0];
+ };
}
+ # 5.8.0's threads::shared is busted when threads are off.
+ # We emulate it here.
else {
- *share = sub { 0 };
+ *share = sub { return $_[0] };
*lock = sub { 0 };
}
}
-use vars qw($Level);
-my($Test_Died) = 0;
-my($Have_Plan) = 0;
-my $Original_Pid = $$;
-my $Curr_Test = 0; share($Curr_Test);
-my @Test_Results = (); share(@Test_Results);
-my @Test_Details = (); share(@Test_Details);
+#line 127
-#line 94
-
-my $Test;
+my $Test = Test::Builder->new;
sub new {
my($class) = shift;
- $Test ||= bless ['Move along, nothing to see here'], $class;
+ $Test ||= $class->create;
return $Test;
}
-#line 120
-my $Exported_To;
+#line 149
+
+sub create {
+ my $class = shift;
+
+ my $self = bless {}, $class;
+ $self->reset;
+
+ return $self;
+}
+
+#line 168
+
+use vars qw($Level);
+
+sub reset {
+ my ($self) = @_;
+
+ # We leave this a global because it has to be localized and localizing
+ # hash keys is just asking for pain. Also, it was documented.
+ $Level = 1;
+
+ $self->{Test_Died} = 0;
+ $self->{Have_Plan} = 0;
+ $self->{No_Plan} = 0;
+ $self->{Original_Pid} = $$;
+
+ share($self->{Curr_Test});
+ $self->{Curr_Test} = 0;
+ $self->{Test_Results} = &share([]);
+
+ $self->{Exported_To} = undef;
+ $self->{Expected_Tests} = 0;
+
+ $self->{Skip_All} = 0;
+
+ $self->{Use_Nums} = 1;
+
+ $self->{No_Header} = 0;
+ $self->{No_Ending} = 0;
+
+ $self->_dup_stdhandles unless $^C;
+
+ return undef;
+}
+
+#line 220
+
sub exported_to {
my($self, $pack) = @_;
if( defined $pack ) {
- $Exported_To = $pack;
+ $self->{Exported_To} = $pack;
}
- return $Exported_To;
+ return $self->{Exported_To};
}
-#line 143
+#line 242
sub plan {
my($self, $cmd, $arg) = @_;
return unless $cmd;
- if( $Have_Plan ) {
+ if( $self->{Have_Plan} ) {
die sprintf "You tried to plan twice! Second plan at %s line %d\n",
($self->caller)[1,2];
}
@@ -97,42 +172,47 @@
return 1;
}
-#line 190
+#line 289
-my $Expected_Tests = 0;
sub expected_tests {
- my($self, $max) = @_;
+ my $self = shift;
+ my($max) = @_;
- if( defined $max ) {
- $Expected_Tests = $max;
- $Have_Plan = 1;
+ if( @_ ) {
+ die "Number of tests must be a postive integer. You gave it '$max'.\n"
+ unless $max =~ /^\+?\d+$/ and $max > 0;
+ $self->{Expected_Tests} = $max;
+ $self->{Have_Plan} = 1;
+
$self->_print("1..$max\n") unless $self->no_header;
}
- return $Expected_Tests;
+ return $self->{Expected_Tests};
}
-#line 212
+#line 314
-my($No_Plan) = 0;
sub no_plan {
- $No_Plan = 1;
- $Have_Plan = 1;
+ my $self = shift;
+
+ $self->{No_Plan} = 1;
+ $self->{Have_Plan} = 1;
}
-#line 226
+#line 329
sub has_plan {
- return($Expected_Tests) if $Expected_Tests;
- return('no_plan') if $No_Plan;
- return(undef);
+ my $self = shift;
+
+ return($self->{Expected_Tests}) if $self->{Expected_Tests};
+ return('no_plan') if $self->{No_Plan};
+ return(undef);
};
-#line 242
+#line 347
-my $Skip_All = 0;
sub skip_all {
my($self, $reason) = @_;
@@ -140,13 +220,13 @@
$out .= " # Skip $reason" if $reason;
$out .= "\n";
- $Skip_All = 1;
+ $self->{Skip_All} = 1;
$self->_print($out) unless $self->no_header;
exit(0);
}
-#line 276
+#line 380
sub ok {
my($self, $test, $name) = @_;
@@ -155,14 +235,17 @@
# store, so we turn it into a boolean.
$test = $test ? 1 : 0;
- unless( $Have_Plan ) {
+ unless( $self->{Have_Plan} ) {
require Carp;
Carp::croak("You tried to run a test without a plan! Gotta have a plan.");
}
- lock $Curr_Test;
- $Curr_Test++;
+ lock $self->{Curr_Test};
+ $self->{Curr_Test}++;
+ # In case $name is a string overloaded object, force it to stringify.
+ $self->_unoverload_str(\$name);
+
$self->diag(<<ERR) if defined $name and $name =~ /^[\d\s]+$/;
You named your test '$name'. You shouldn't use numbers for your test names.
Very confusing.
@@ -171,10 +254,10 @@
my($pack, $file, $line) = $self->caller;
my $todo = $self->todo($pack);
+ $self->_unoverload_str(\$todo);
my $out;
- my $result = {};
- share($result);
+ my $result = &share({});
unless( $test ) {
$out .= "not ";
@@ -185,7 +268,7 @@
}
$out .= "ok";
- $out .= " $Curr_Test" if $self->use_numbers;
+ $out .= " $self->{Curr_Test}" if $self->use_numbers;
if( defined $name ) {
$name =~ s|#|\\#|g; # # in a name can confuse Test::Harness.
@@ -197,9 +280,8 @@
}
if( $todo ) {
- my $what_todo = $todo;
- $out .= " # TODO $what_todo";
- $result->{reason} = $what_todo;
+ $out .= " # TODO $todo";
+ $result->{reason} = $todo;
$result->{type} = 'todo';
}
else {
@@ -207,25 +289,92 @@
$result->{type} = '';
}
- $Test_Results[$Curr_Test-1] = $result;
+ $self->{Test_Results}[$self->{Curr_Test}-1] = $result;
$out .= "\n";
$self->_print($out);
unless( $test ) {
my $msg = $todo ? "Failed (TODO)" : "Failed";
- $self->diag(" $msg test ($file at line $line)\n");
+ $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE};
+
+ if( defined $name ) {
+ $self->diag(qq[ $msg test '$name'\n]);
+ $self->diag(qq[ in $file at line $line.\n]);
+ }
+ else {
+ $self->diag(qq[ $msg test in $file at line $line.\n]);
+ }
}
return $test ? 1 : 0;
}
-#line 364
+sub _unoverload {
+ my $self = shift;
+ my $type = shift;
+
+ local($@,$!);
+
+ eval { require overload } || return;
+
+ foreach my $thing (@_) {
+ eval {
+ if( _is_object($$thing) ) {
+ if( my $string_meth = overload::Method($$thing, $type) ) {
+ $$thing = $$thing->$string_meth();
+ }
+ }
+ };
+ }
+}
+
+
+sub _is_object {
+ my $thing = shift;
+
+ return eval { ref $thing && $thing->isa('UNIVERSAL') } ? 1 : 0;
+}
+
+
+sub _unoverload_str {
+ my $self = shift;
+
+ $self->_unoverload(q[""], @_);
+}
+
+sub _unoverload_num {
+ my $self = shift;
+
+ $self->_unoverload('0+', @_);
+
+ for my $val (@_) {
+ next unless $self->_is_dualvar($$val);
+ $$val = $$val+0;
+ }
+}
+
+
+# This is a hack to detect a dualvar such as $!
+sub _is_dualvar {
+ my($self, $val) = @_;
+
+ local $^W = 0;
+ my $numval = $val+0;
+ return 1 if $numval != 0 and $numval ne $val;
+}
+
+
+
+#line 535
+
sub is_eq {
my($self, $got, $expect, $name) = @_;
local $Level = $Level + 1;
+ $self->_unoverload_str(\$got, \$expect);
+
if( !defined $got || !defined $expect ) {
# undef only matches undef and nothing else
my $test = !defined $got && !defined $expect;
@@ -242,6 +391,8 @@
my($self, $got, $expect, $name) = @_;
local $Level = $Level + 1;
+ $self->_unoverload_num(\$got, \$expect);
+
if( !defined $got || !defined $expect ) {
# undef only matches undef and nothing else
my $test = !defined $got && !defined $expect;
@@ -265,7 +416,7 @@
}
else {
# force numeric context
- $$val = $$val+0;
+ $self->_unoverload_num($val);
}
}
else {
@@ -280,7 +431,7 @@
}
-#line 438
+#line 613
sub isnt_eq {
my($self, $got, $dont_expect, $name) = @_;
@@ -291,7 +442,7 @@
my $test = defined $got || defined $dont_expect;
$self->ok($test, $name);
- $self->_cmp_diag('ne', $got, $dont_expect) unless $test;
+ $self->_cmp_diag($got, 'ne', $dont_expect) unless $test;
return $test;
}
@@ -307,7 +458,7 @@
my $test = defined $got || defined $dont_expect;
$self->ok($test, $name);
- $self->_cmp_diag('!=', $got, $dont_expect) unless $test;
+ $self->_cmp_diag($got, '!=', $dont_expect) unless $test;
return $test;
}
@@ -315,7 +466,7 @@
}
-#line 490
+#line 665
sub like {
my($self, $this, $regex, $name) = @_;
@@ -331,27 +482,35 @@
$self->_regex_ok($this, $regex, '!~', $name);
}
-#line 531
+#line 706
sub maybe_regex {
- my ($self, $regex) = @_;
+ my ($self, $regex) = @_;
my $usable_regex = undef;
+
+ return $usable_regex unless defined $regex;
+
+ my($re, $opts);
+
+ # Check for qr/foo/
if( ref $regex eq 'Regexp' ) {
$usable_regex = $regex;
}
- # Check if it looks like '/foo/'
- elsif( my($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx ) {
+ # Check for '/foo/' or 'm,foo,'
+ elsif( ($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx or
+ (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
+ )
+ {
$usable_regex = length $opts ? "(?$opts)$re" : $re;
- };
- return($usable_regex)
+ }
+
+ return $usable_regex;
};
sub _regex_ok {
my($self, $this, $regex, $cmp, $name) = @_;
- local $Level = $Level + 1;
-
my $ok = 0;
my $usable_regex = $self->maybe_regex($regex);
unless (defined $usable_regex) {
@@ -361,9 +520,19 @@
}
{
- local $^W = 0;
- my $test = $this =~ /$usable_regex/ ? 1 : 0;
+ my $test;
+ my $code = $self->_caller_context;
+
+ local($@, $!);
+
+ # Yes, it has to look like this or 5.4.5 won't see the #line directive.
+ # Don't ask me, man, I just work here.
+ $test = eval "
+$code" . q{$test = $this =~ /$usable_regex/ ? 1 : 0};
+
$test = !$test if $cmp eq '!~';
+
+ local $Level = $Level + 1;
$ok = $self->ok( $test, $name );
}
@@ -380,17 +549,35 @@
return $ok;
}
-#line 588
+#line 781
+
+my %numeric_cmps = map { ($_, 1) }
+ ("<", "<=", ">", ">=", "==", "!=", "<=>");
+
sub cmp_ok {
my($self, $got, $type, $expect, $name) = @_;
+ # Treat overloaded objects as numbers if we're asked to do a
+ # numeric comparison.
+ my $unoverload = $numeric_cmps{$type} ? '_unoverload_num'
+ : '_unoverload_str';
+
+ $self->$unoverload(\$got, \$expect);
+
+
my $test;
{
- local $^W = 0;
local($@,$!); # don't interfere with $@
# eval() sometimes resets $!
- $test = eval "\$got $type \$expect";
+
+ my $code = $self->_caller_context;
+
+ # Yes, it has to look like this or 5.4.5 won't see the #line directive.
+ # Don't ask me, man, I just work here.
+ $test = eval "
+$code" . "\$got $type \$expect;";
+
}
local $Level = $Level + 1;
my $ok = $self->ok($test, $name);
@@ -418,87 +605,102 @@
DIAGNOSTIC
}
-#line 636
-sub BAILOUT {
+sub _caller_context {
+ my $self = shift;
+
+ my($pack, $file, $line) = $self->caller(1);
+
+ my $code = '';
+ $code .= "#line $line $file\n" if defined $file and defined $line;
+
+ return $code;
+}
+
+
+#line 860
+
+sub BAIL_OUT {
my($self, $reason) = @_;
+ $self->{Bailed_Out} = 1;
$self->_print("Bail out! $reason");
exit 255;
}
-#line 652
+#line 873
+*BAILOUT = \&BAIL_OUT;
+
+
+#line 885
+
sub skip {
my($self, $why) = @_;
$why ||= '';
+ $self->_unoverload_str(\$why);
- unless( $Have_Plan ) {
+ unless( $self->{Have_Plan} ) {
require Carp;
Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
}
- lock($Curr_Test);
- $Curr_Test++;
+ lock($self->{Curr_Test});
+ $self->{Curr_Test}++;
- my %result;
- share(%result);
- %result = (
+ $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
'ok' => 1,
actual_ok => 1,
name => '',
type => 'skip',
reason => $why,
- );
- $Test_Results[$Curr_Test-1] = \%result;
+ });
my $out = "ok";
- $out .= " $Curr_Test" if $self->use_numbers;
- $out .= " # skip $why\n";
+ $out .= " $self->{Curr_Test}" if $self->use_numbers;
+ $out .= " # skip";
+ $out .= " $why" if length $why;
+ $out .= "\n";
- $Test->_print($out);
+ $self->_print($out);
return 1;
}
-#line 697
+#line 930
sub todo_skip {
my($self, $why) = @_;
$why ||= '';
- unless( $Have_Plan ) {
+ unless( $self->{Have_Plan} ) {
require Carp;
Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
}
- lock($Curr_Test);
- $Curr_Test++;
+ lock($self->{Curr_Test});
+ $self->{Curr_Test}++;
- my %result;
- share(%result);
- %result = (
+ $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
'ok' => 1,
actual_ok => 0,
name => '',
type => 'todo_skip',
reason => $why,
- );
+ });
- $Test_Results[$Curr_Test-1] = \%result;
-
my $out = "not ok";
- $out .= " $Curr_Test" if $self->use_numbers;
+ $out .= " $self->{Curr_Test}" if $self->use_numbers;
$out .= " # TODO & SKIP $why\n";
- $Test->_print($out);
+ $self->_print($out);
return 1;
}
-#line 772
+#line 1001
sub level {
my($self, $level) = @_;
@@ -509,69 +711,66 @@
return $Level;
}
-$CLASS->level(1);
+#line 1036
-#line 809
-
-my $Use_Nums = 1;
sub use_numbers {
my($self, $use_nums) = @_;
if( defined $use_nums ) {
- $Use_Nums = $use_nums;
+ $self->{Use_Nums} = $use_nums;
}
- return $Use_Nums;
+ return $self->{Use_Nums};
}
-#line 836
-my($No_Header, $No_Ending) = (0,0);
-sub no_header {
- my($self, $no_header) = @_;
+#line 1070
- if( defined $no_header ) {
- $No_Header = $no_header;
- }
- return $No_Header;
-}
+foreach my $attribute (qw(No_Header No_Ending No_Diag)) {
+ my $method = lc $attribute;
-sub no_ending {
- my($self, $no_ending) = @_;
+ my $code = sub {
+ my($self, $no) = @_;
- if( defined $no_ending ) {
- $No_Ending = $no_ending;
- }
- return $No_Ending;
+ if( defined $no ) {
+ $self->{$attribute} = $no;
+ }
+ return $self->{$attribute};
+ };
+
+ no strict 'refs';
+ *{__PACKAGE__.'::'.$method} = $code;
}
-#line 891
+#line 1124
sub diag {
my($self, @msgs) = @_;
+
+ return if $self->no_diag;
return unless @msgs;
# Prevent printing headers when compiling (i.e. -c)
return if $^C;
+ # Smash args together like print does.
+ # Convert undef to 'undef' so its readable.
+ my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
+
# Escape each line with a #.
- foreach (@msgs) {
- $_ = 'undef' unless defined;
- s/^/# /gms;
- }
+ $msg =~ s/^/# /gm;
- push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
+ # Stick a newline on the end if it needs it.
+ $msg .= "\n" unless $msg =~ /\n\Z/;
local $Level = $Level + 1;
- my $fh = $self->todo ? $self->todo_output : $self->failure_output;
- local($\, $", $,) = (undef, ' ', '');
- print $fh @msgs;
+ $self->_print_diag($msg);
return 0;
}
-#line 926
+#line 1161
sub _print {
my($self, @msgs) = @_;
@@ -580,73 +779,107 @@
# tests are deparsed with B::Deparse
return if $^C;
+ my $msg = join '', @msgs;
+
local($\, $", $,) = (undef, ' ', '');
my $fh = $self->output;
# Escape each line after the first with a # so we don't
# confuse Test::Harness.
- foreach (@msgs) {
- s/\n(.)/\n# $1/sg;
- }
+ $msg =~ s/\n(.)/\n# $1/sg;
- push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
+ # Stick a newline on the end if it needs it.
+ $msg .= "\n" unless $msg =~ /\n\Z/;
- print $fh @msgs;
+ print $fh $msg;
}
-#line 977
+#line 1192
-my($Out_FH, $Fail_FH, $Todo_FH);
+sub _print_diag {
+ my $self = shift;
+
+ local($\, $", $,) = (undef, ' ', '');
+ my $fh = $self->todo ? $self->todo_output : $self->failure_output;
+ print $fh @_;
+}
+
+#line 1229
+
sub output {
my($self, $fh) = @_;
if( defined $fh ) {
- $Out_FH = _new_fh($fh);
+ $self->{Out_FH} = _new_fh($fh);
}
- return $Out_FH;
+ return $self->{Out_FH};
}
sub failure_output {
my($self, $fh) = @_;
if( defined $fh ) {
- $Fail_FH = _new_fh($fh);
+ $self->{Fail_FH} = _new_fh($fh);
}
- return $Fail_FH;
+ return $self->{Fail_FH};
}
sub todo_output {
my($self, $fh) = @_;
if( defined $fh ) {
- $Todo_FH = _new_fh($fh);
+ $self->{Todo_FH} = _new_fh($fh);
}
- return $Todo_FH;
+ return $self->{Todo_FH};
}
+
sub _new_fh {
my($file_or_fh) = shift;
my $fh;
- unless( UNIVERSAL::isa($file_or_fh, 'GLOB') ) {
+ if( _is_fh($file_or_fh) ) {
+ $fh = $file_or_fh;
+ }
+ else {
$fh = do { local *FH };
open $fh, ">$file_or_fh" or
die "Can't open test output log $file_or_fh: $!";
+ _autoflush($fh);
}
- else {
- $fh = $file_or_fh;
- }
return $fh;
}
-unless( $^C ) {
- # We dup STDOUT and STDERR so people can change them in their
- # test suites while still getting normal test output.
- open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!";
- open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!";
+sub _is_fh {
+ my $maybe_fh = shift;
+ return 0 unless defined $maybe_fh;
+
+ return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob
+
+ return UNIVERSAL::isa($maybe_fh, 'GLOB') ||
+ UNIVERSAL::isa($maybe_fh, 'IO::Handle') ||
+
+ # 5.5.4's tied() and can() doesn't like getting undef
+ UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE');
+}
+
+
+sub _autoflush {
+ my($fh) = shift;
+ my $old_fh = select $fh;
+ $| = 1;
+ select $old_fh;
+}
+
+
+sub _dup_stdhandles {
+ my $self = shift;
+
+ $self->_open_testhandles;
+
# Set everything to unbuffered else plain prints to STDOUT will
# come out in the wrong order from our own prints.
_autoflush(\*TESTOUT);
@@ -654,78 +887,89 @@
_autoflush(\*TESTERR);
_autoflush(\*STDERR);
- $CLASS->output(\*TESTOUT);
- $CLASS->failure_output(\*TESTERR);
- $CLASS->todo_output(\*TESTOUT);
+ $self->output(\*TESTOUT);
+ $self->failure_output(\*TESTERR);
+ $self->todo_output(\*TESTOUT);
}
-sub _autoflush {
- my($fh) = shift;
- my $old_fh = select $fh;
- $| = 1;
- select $old_fh;
+
+my $Opened_Testhandles = 0;
+sub _open_testhandles {
+ return if $Opened_Testhandles;
+ # We dup STDOUT and STDERR so people can change them in their
+ # test suites while still getting normal test output.
+ open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!";
+ open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!";
+ $Opened_Testhandles = 1;
}
-#line 1065
+#line 1347
sub current_test {
my($self, $num) = @_;
- lock($Curr_Test);
+ lock($self->{Curr_Test});
if( defined $num ) {
- unless( $Have_Plan ) {
+ unless( $self->{Have_Plan} ) {
require Carp;
Carp::croak("Can't change the current test number without a plan!");
}
- $Curr_Test = $num;
- if( $num > @Test_Results ) {
- my $start = @Test_Results ? $#Test_Results + 1 : 0;
+ $self->{Curr_Test} = $num;
+
+ # If the test counter is being pushed forward fill in the details.
+ my $test_results = $self->{Test_Results};
+ if( $num > @$test_results ) {
+ my $start = @$test_results ? @$test_results : 0;
for ($start..$num-1) {
- my %result;
- share(%result);
- %result = ( ok => 1,
- actual_ok => undef,
- reason => 'incrementing test number',
- type => 'unknown',
- name => undef
- );
- $Test_Results[$_] = \%result;
+ $test_results->[$_] = &share({
+ 'ok' => 1,
+ actual_ok => undef,
+ reason => 'incrementing test number',
+ type => 'unknown',
+ name => undef
+ });
}
}
+ # If backward, wipe history. Its their funeral.
+ elsif( $num < @$test_results ) {
+ $#{$test_results} = $num - 1;
+ }
}
- return $Curr_Test;
+ return $self->{Curr_Test};
}
-#line 1106
+#line 1393
sub summary {
my($self) = shift;
- return map { $_->{'ok'} } @Test_Results;
+ return map { $_->{'ok'} } @{ $self->{Test_Results} };
}
-#line 1161
+#line 1448
sub details {
- return @Test_Results;
+ my $self = shift;
+ return @{ $self->{Test_Results} };
}
-#line 1185
+#line 1473
sub todo {
my($self, $pack) = @_;
- $pack = $pack || $self->exported_to || $self->caller(1);
+ $pack = $pack || $self->exported_to || $self->caller($Level);
+ return 0 unless $pack;
no strict 'refs';
return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
: 0;
}
-#line 1205
+#line 1494
sub caller {
my($self, $height) = @_;
@@ -735,20 +979,22 @@
return wantarray ? @caller : $caller[0];
}
-#line 1217
+#line 1506
-#line 1231
+#line 1520
#'#
sub _sanity_check {
- _whoa($Curr_Test < 0, 'Says here you ran a negative number of tests!');
- _whoa(!$Have_Plan and $Curr_Test,
+ my $self = shift;
+
+ _whoa($self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!');
+ _whoa(!$self->{Have_Plan} and $self->{Curr_Test},
'Somehow your tests ran without a plan!');
- _whoa($Curr_Test != @Test_Results,
+ _whoa($self->{Curr_Test} != @{ $self->{Test_Results} },
'Somehow you got a different number of results than tests ran!');
}
-#line 1250
+#line 1541
sub _whoa {
my($check, $desc) = @_;
@@ -760,7 +1006,7 @@
}
}
-#line 1271
+#line 1562
sub _my_exit {
$? = $_[0];
@@ -769,7 +1015,7 @@
}
-#line 1284
+#line 1575
$SIG{__DIE__} = sub {
# We don't want to muck with death in an eval, but $^S isn't
@@ -780,77 +1026,104 @@
for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) {
$in_eval = 1 if $sub =~ /^\(eval\)/;
}
- $Test_Died = 1 unless $in_eval;
+ $Test->{Test_Died} = 1 unless $in_eval;
};
sub _ending {
my $self = shift;
- _sanity_check();
+ $self->_sanity_check();
# Don't bother with an ending if this is a forked copy. Only the parent
# should do the ending.
- do{ _my_exit($?) && return } if $Original_Pid != $$;
+ # Exit if plan() was never called. This is so "require Test::Simple"
+ # doesn't puke.
+ # Don't do an ending if we bailed out.
+ if( ($self->{Original_Pid} != $$) or
+ (!$self->{Have_Plan} && !$self->{Test_Died}) or
+ $self->{Bailed_Out}
+ )
+ {
+ _my_exit($?);
+ return;
+ }
- # Bailout if plan() was never called. This is so
- # "require Test::Simple" doesn't puke.
- do{ _my_exit(0) && return } if !$Have_Plan && !$Test_Died;
-
# Figure out if we passed or failed and print helpful messages.
- if( @Test_Results ) {
+ my $test_results = $self->{Test_Results};
+ if( @$test_results ) {
# The plan? We have no plan.
- if( $No_Plan ) {
- $self->_print("1..$Curr_Test\n") unless $self->no_header;
- $Expected_Tests = $Curr_Test;
+ if( $self->{No_Plan} ) {
+ $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header;
+ $self->{Expected_Tests} = $self->{Curr_Test};
}
- # 5.8.0 threads bug. Shared arrays will not be auto-extended
- # by a slice. Worse, we have to fill in every entry else
- # we'll get an "Invalid value for shared scalar" error
- for my $idx ($#Test_Results..$Expected_Tests-1) {
- my %empty_result = ();
- share(%empty_result);
- $Test_Results[$idx] = \%empty_result
- unless defined $Test_Results[$idx];
+ # Auto-extended arrays and elements which aren't explicitly
+ # filled in with a shared reference will puke under 5.8.0
+ # ithreads. So we have to fill them in by hand. :(
+ my $empty_result = &share({});
+ for my $idx ( 0..$self->{Expected_Tests}-1 ) {
+ $test_results->[$idx] = $empty_result
+ unless defined $test_results->[$idx];
}
- my $num_failed = grep !$_->{'ok'}, @Test_Results[0..$Expected_Tests-1];
- $num_failed += abs($Expected_Tests - @Test_Results);
+ my $num_failed = grep !$_->{'ok'},
+ @{$test_results}[0..$self->{Curr_Test}-1];
- if( $Curr_Test < $Expected_Tests ) {
+ my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
+
+ if( $num_extra < 0 ) {
+ my $s = $self->{Expected_Tests} == 1 ? '' : 's';
$self->diag(<<"FAIL");
-Looks like you planned $Expected_Tests tests but only ran $Curr_Test.
+Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}.
FAIL
}
- elsif( $Curr_Test > $Expected_Tests ) {
- my $num_extra = $Curr_Test - $Expected_Tests;
+ elsif( $num_extra > 0 ) {
+ my $s = $self->{Expected_Tests} == 1 ? '' : 's';
$self->diag(<<"FAIL");
-Looks like you planned $Expected_Tests tests but ran $num_extra extra.
+Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra.
FAIL
}
- elsif ( $num_failed ) {
+
+ if ( $num_failed ) {
+ my $num_tests = $self->{Curr_Test};
+ my $s = $num_failed == 1 ? '' : 's';
+
+ my $qualifier = $num_extra == 0 ? '' : ' run';
+
$self->diag(<<"FAIL");
-Looks like you failed $num_failed tests of $Expected_Tests.
+Looks like you failed $num_failed test$s of $num_tests$qualifier.
FAIL
}
- if( $Test_Died ) {
+ if( $self->{Test_Died} ) {
$self->diag(<<"FAIL");
-Looks like your test died just after $Curr_Test.
+Looks like your test died just after $self->{Curr_Test}.
FAIL
_my_exit( 255 ) && return;
}
- _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return;
+ my $exit_code;
+ if( $num_failed ) {
+ $exit_code = $num_failed <= 254 ? $num_failed : 254;
+ }
+ elsif( $num_extra != 0 ) {
+ $exit_code = 255;
+ }
+ else {
+ $exit_code = 0;
+ }
+
+ _my_exit( $exit_code ) && return;
}
- elsif ( $Skip_All ) {
+ elsif ( $self->{Skip_All} ) {
_my_exit( 0 ) && return;
}
- elsif ( $Test_Died ) {
+ elsif ( $self->{Test_Died} ) {
$self->diag(<<'FAIL');
Looks like your test died before it could output anything.
FAIL
+ _my_exit( 255 ) && return;
}
else {
$self->diag("No tests run!\n");
@@ -862,6 +1135,6 @@
$Test->_ending if defined $Test and !$Test->no_ending;
}
-#line 1407
+#line 1747
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,10 +1,9 @@
-#line 1 "inc/Test/More.pm - /usr/local/lib/perl5/site_perl/5.8.6/Test/More.pm"
+#line 1 "inc/Test/More.pm - /usr/local/lib/perl5/site_perl/5.8.7/Test/More.pm"
package Test::More;
use 5.004;
use strict;
-use Test::Builder;
# Can't use Carp because it might cause use_ok() to accidentally succeed
@@ -17,10 +16,12 @@
-require Exporter;
use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO);
-$VERSION = '0.47';
- at ISA = qw(Exporter);
+$VERSION = '0.62';
+$VERSION = eval $VERSION; # make the alpha version come out as a number
+
+use Test::Builder::Module;
+ at ISA = qw(Test::Builder::Module);
@EXPORT = qw(ok use_ok require_ok
is isnt like unlike is_deeply
cmp_ok
@@ -31,101 +32,107 @@
plan
can_ok isa_ok
diag
+ BAIL_OUT
);
-my $Test = Test::Builder->new;
+#line 157
-# 5.004's Exporter doesn't have export_to_level.
-sub _export_to_level
-{
- my $pkg = shift;
- my $level = shift;
- (undef) = shift; # redundant arg
- my $callpkg = caller($level);
- $pkg->export($callpkg, @_);
+sub plan {
+ my $tb = Test::More->builder;
+
+ $tb->plan(@_);
}
-#line 172
+# This implements "use Test::More 'no_diag'" but the behavior is
+# deprecated.
+sub import_extra {
+ my $class = shift;
+ my $list = shift;
-sub plan {
- my(@plan) = @_;
+ my @other = ();
+ my $idx = 0;
+ while( $idx <= $#{$list} ) {
+ my $item = $list->[$idx];
- my $caller = caller;
+ if( defined $item and $item eq 'no_diag' ) {
+ $class->builder->no_diag(1);
+ }
+ else {
+ push @other, $item;
+ }
- $Test->exported_to($caller);
-
- my @imports = ();
- foreach my $idx (0..$#plan) {
- if( $plan[$idx] eq 'import' ) {
- my($tag, $imports) = splice @plan, $idx, 2;
- @imports = @$imports;
- last;
- }
+ $idx++;
}
- $Test->plan(@plan);
-
- __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports);
+ @$list = @other;
}
-sub import {
- my($class) = shift;
- goto &plan;
-}
+#line 257
-#line 266
-
sub ok ($;$) {
my($test, $name) = @_;
- $Test->ok($test, $name);
+ my $tb = Test::More->builder;
+
+ $tb->ok($test, $name);
}
-#line 330
+#line 324
sub is ($$;$) {
- $Test->is_eq(@_);
+ my $tb = Test::More->builder;
+
+ $tb->is_eq(@_);
}
sub isnt ($$;$) {
- $Test->isnt_eq(@_);
+ my $tb = Test::More->builder;
+
+ $tb->isnt_eq(@_);
}
*isn't = \&isnt;
-#line 371
+#line 369
sub like ($$;$) {
- $Test->like(@_);
+ my $tb = Test::More->builder;
+
+ $tb->like(@_);
}
#line 385
-sub unlike {
- $Test->unlike(@_);
+sub unlike ($$;$) {
+ my $tb = Test::More->builder;
+
+ $tb->unlike(@_);
}
-#line 423
+#line 425
sub cmp_ok($$$;$) {
- $Test->cmp_ok(@_);
+ my $tb = Test::More->builder;
+
+ $tb->cmp_ok(@_);
}
-#line 457
+#line 461
sub can_ok ($@) {
my($proto, @methods) = @_;
my $class = ref $proto || $proto;
+ my $tb = Test::More->builder;
unless( @methods ) {
- my $ok = $Test->ok( 0, "$class->can(...)" );
- $Test->diag(' can_ok() called with no methods');
+ my $ok = $tb->ok( 0, "$class->can(...)" );
+ $tb->diag(' can_ok() called with no methods');
return $ok;
}
@@ -140,17 +147,18 @@
$name = @methods == 1 ? "$class->can('$methods[0]')"
: "$class->can(...)";
- my $ok = $Test->ok( !@nok, $name );
+ my $ok = $tb->ok( !@nok, $name );
- $Test->diag(map " $class->can('$_') failed\n", @nok);
+ $tb->diag(map " $class->can('$_') failed\n", @nok);
return $ok;
}
-#line 514
+#line 519
sub isa_ok ($$;$) {
my($object, $class, $obj_name) = @_;
+ my $tb = Test::More->builder;
my $diag;
$obj_name = 'The object' unless defined $obj_name;
@@ -190,54 +198,62 @@
my $ok;
if( $diag ) {
- $ok = $Test->ok( 0, $name );
- $Test->diag(" $diag\n");
+ $ok = $tb->ok( 0, $name );
+ $tb->diag(" $diag\n");
}
else {
- $ok = $Test->ok( 1, $name );
+ $ok = $tb->ok( 1, $name );
}
return $ok;
}
-#line 583
+#line 589
sub pass (;$) {
- $Test->ok(1, @_);
+ my $tb = Test::More->builder;
+ $tb->ok(1, @_);
}
sub fail (;$) {
- $Test->ok(0, @_);
+ my $tb = Test::More->builder;
+ $tb->ok(0, @_);
}
-#line 627
+#line 650
-sub diag {
- $Test->diag(@_);
-}
-
-
-#line 677
-
sub use_ok ($;@) {
my($module, @imports) = @_;
@imports = () unless @imports;
+ my $tb = Test::More->builder;
- my $pack = caller;
+ my($pack,$filename,$line) = caller;
local($@,$!); # eval sometimes interferes with $!
- eval <<USE;
+
+ if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
+ # probably a version check. Perl needs to see the bare number
+ # for it to work with non-Exporter based modules.
+ eval <<USE;
package $pack;
-require $module;
-'$module'->import(\@imports);
+use $module $imports[0];
USE
+ }
+ else {
+ eval <<USE;
+package $pack;
+use $module \@imports;
+USE
+ }
- my $ok = $Test->ok( !$@, "use $module;" );
+ my $ok = $tb->ok( !$@, "use $module;" );
unless( $ok ) {
chomp $@;
- $Test->diag(<<DIAGNOSTIC);
+ $@ =~ s{^BEGIN failed--compilation aborted at .*$}
+ {BEGIN failed--compilation aborted at $filename line $line.}m;
+ $tb->diag(<<DIAGNOSTIC);
Tried to use '$module'.
Error: $@
DIAGNOSTIC
@@ -247,24 +263,29 @@
return $ok;
}
-#line 712
+#line 699
sub require_ok ($) {
my($module) = shift;
+ my $tb = Test::More->builder;
my $pack = caller;
+ # Try to deterine if we've been given a module name or file.
+ # Module names must be barewords, files not.
+ $module = qq['$module'] unless _is_module_name($module);
+
local($!, $@); # eval sometimes interferes with $!
eval <<REQUIRE;
package $pack;
require $module;
REQUIRE
- my $ok = $Test->ok( !$@, "require $module;" );
+ my $ok = $tb->ok( !$@, "require $module;" );
unless( $ok ) {
chomp $@;
- $Test->diag(<<DIAGNOSTIC);
+ $tb->diag(<<DIAGNOSTIC);
Tried to require '$module'.
Error: $@
DIAGNOSTIC
@@ -274,67 +295,57 @@
return $ok;
}
-#line 796
-#'#
-sub skip {
- my($why, $how_many) = @_;
+sub _is_module_name {
+ my $module = shift;
- unless( defined $how_many ) {
- # $how_many can only be avoided when no_plan is in use.
- _carp "skip() needs to know \$how_many tests are in the block"
- unless $Test::Builder::No_Plan;
- $how_many = 1;
- }
-
- for( 1..$how_many ) {
- $Test->skip($why);
- }
-
- local $^W = 0;
- last SKIP;
+ # Module names start with a letter.
+ # End with an alphanumeric.
+ # The rest is an alphanumeric or ::
+ $module =~ s/\b::\b//g;
+ $module =~ /^[a-zA-Z]\w*$/;
}
+#line 775
-#line 874
+use vars qw(@Data_Stack %Refs_Seen);
+my $DNE = bless [], 'Does::Not::Exist';
+sub is_deeply {
+ my $tb = Test::More->builder;
-sub todo_skip {
- my($why, $how_many) = @_;
+ unless( @_ == 2 or @_ == 3 ) {
+ my $msg = <<WARNING;
+is_deeply() takes two or three args, you gave %d.
+This usually means you passed an array or hash instead
+of a reference to it
+WARNING
+ chop $msg; # clip off newline so carp() will put in line/file
- unless( defined $how_many ) {
- # $how_many can only be avoided when no_plan is in use.
- _carp "todo_skip() needs to know \$how_many tests are in the block"
- unless $Test::Builder::No_Plan;
- $how_many = 1;
- }
+ _carp sprintf $msg, scalar @_;
- for( 1..$how_many ) {
- $Test->todo_skip($why);
+ return $tb->ok(0);
}
- local $^W = 0;
- last TODO;
-}
+ my($this, $that, $name) = @_;
-#line 933
+ $tb->_unoverload_str(\$that, \$this);
-use vars qw(@Data_Stack);
-my $DNE = bless [], 'Does::Not::Exist';
-sub is_deeply {
- my($this, $that, $name) = @_;
-
my $ok;
- if( !ref $this || !ref $that ) {
- $ok = $Test->is_eq($this, $that, $name);
+ if( !ref $this and !ref $that ) { # neither is a reference
+ $ok = $tb->is_eq($this, $that, $name);
}
- else {
+ elsif( !ref $this xor !ref $that ) { # one's a reference, one isn't
+ $ok = $tb->ok(0, $name);
+ $tb->diag( _format_stack({ vals => [ $this, $that ] }) );
+ }
+ else { # both references
local @Data_Stack = ();
if( _deep_check($this, $that) ) {
- $ok = $Test->ok(1, $name);
+ $ok = $tb->ok(1, $name);
}
else {
- $ok = $Test->ok(0, $name);
- $ok = $Test->diag(_format_stack(@Data_Stack));
+ $ok = $tb->ok(0, $name);
+ $tb->diag(_format_stack(@Data_Stack));
}
}
@@ -370,9 +381,10 @@
my $out = "Structures begin differing at:\n";
foreach my $idx (0..$#vals) {
my $val = $vals[$idx];
- $vals[$idx] = !defined $val ? 'undef' :
- $val eq $DNE ? "Does not exist"
- : "'$val'";
+ $vals[$idx] = !defined $val ? 'undef' :
+ $val eq $DNE ? "Does not exist" :
+ ref $val ? "$val" :
+ "'$val'";
}
$out .= "$vars[0] = $vals[0]\n";
@@ -383,11 +395,96 @@
}
-#line 1007
+sub _type {
+ my $thing = shift;
+ return '' if !ref $thing;
+
+ for my $type (qw(ARRAY HASH REF SCALAR GLOB CODE Regexp)) {
+ return $type if UNIVERSAL::isa($thing, $type);
+ }
+
+ return '';
+}
+
+#line 915
+
+sub diag {
+ my $tb = Test::More->builder;
+
+ $tb->diag(@_);
+}
+
+
+#line 984
+
#'#
-sub eq_array {
+sub skip {
+ my($why, $how_many) = @_;
+ my $tb = Test::More->builder;
+
+ unless( defined $how_many ) {
+ # $how_many can only be avoided when no_plan is in use.
+ _carp "skip() needs to know \$how_many tests are in the block"
+ unless $tb->has_plan eq 'no_plan';
+ $how_many = 1;
+ }
+
+ for( 1..$how_many ) {
+ $tb->skip($why);
+ }
+
+ local $^W = 0;
+ last SKIP;
+}
+
+
+#line 1066
+
+sub todo_skip {
+ my($why, $how_many) = @_;
+ my $tb = Test::More->builder;
+
+ unless( defined $how_many ) {
+ # $how_many can only be avoided when no_plan is in use.
+ _carp "todo_skip() needs to know \$how_many tests are in the block"
+ unless $tb->has_plan eq 'no_plan';
+ $how_many = 1;
+ }
+
+ for( 1..$how_many ) {
+ $tb->todo_skip($why);
+ }
+
+ local $^W = 0;
+ last TODO;
+}
+
+#line 1119
+
+sub BAIL_OUT {
+ my $reason = shift;
+ my $tb = Test::More->builder;
+
+ $tb->BAIL_OUT($reason);
+}
+
+#line 1158
+
+#'#
+sub eq_array {
+ local @Data_Stack;
+ _deep_check(@_);
+}
+
+sub _eq_array {
my($a1, $a2) = @_;
+
+ if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) {
+ warn "eq_array passed a non-array ref";
+ return 0;
+ }
+
return 1 if $a1 eq $a2;
my $ok = 1;
@@ -402,49 +499,82 @@
last unless $ok;
}
+
return $ok;
}
sub _deep_check {
my($e1, $e2) = @_;
+ my $tb = Test::More->builder;
+
my $ok = 0;
- my $eq;
+ # Effectively turn %Refs_Seen into a stack. This avoids picking up
+ # the same referenced used twice (such as [\$a, \$a]) to be considered
+ # circular.
+ local %Refs_Seen = %Refs_Seen;
+
{
# Quiet uninitialized value warnings when comparing undefs.
local $^W = 0;
- if( $e1 eq $e2 ) {
+ $tb->_unoverload_str(\$e1, \$e2);
+
+ # Either they're both references or both not.
+ my $same_ref = !(!ref $e1 xor !ref $e2);
+ my $not_ref = (!ref $e1 and !ref $e2);
+
+ if( defined $e1 xor defined $e2 ) {
+ $ok = 0;
+ }
+ elsif ( $e1 == $DNE xor $e2 == $DNE ) {
+ $ok = 0;
+ }
+ elsif ( $same_ref and ($e1 eq $e2) ) {
$ok = 1;
}
+ elsif ( $not_ref ) {
+ push @Data_Stack, { type => '', vals => [$e1, $e2] };
+ $ok = 0;
+ }
else {
- if( UNIVERSAL::isa($e1, 'ARRAY') and
- UNIVERSAL::isa($e2, 'ARRAY') )
- {
- $ok = eq_array($e1, $e2);
+ if( $Refs_Seen{$e1} ) {
+ return $Refs_Seen{$e1} eq $e2;
}
- elsif( UNIVERSAL::isa($e1, 'HASH') and
- UNIVERSAL::isa($e2, 'HASH') )
- {
- $ok = eq_hash($e1, $e2);
+ else {
+ $Refs_Seen{$e1} = "$e2";
}
- elsif( UNIVERSAL::isa($e1, 'REF') and
- UNIVERSAL::isa($e2, 'REF') )
- {
- push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
+
+ my $type = _type($e1);
+ $type = 'DIFFERENT' unless _type($e2) eq $type;
+
+ if( $type eq 'DIFFERENT' ) {
+ push @Data_Stack, { type => $type, vals => [$e1, $e2] };
+ $ok = 0;
+ }
+ elsif( $type eq 'ARRAY' ) {
+ $ok = _eq_array($e1, $e2);
+ }
+ elsif( $type eq 'HASH' ) {
+ $ok = _eq_hash($e1, $e2);
+ }
+ elsif( $type eq 'REF' ) {
+ push @Data_Stack, { type => $type, vals => [$e1, $e2] };
$ok = _deep_check($$e1, $$e2);
pop @Data_Stack if $ok;
}
- elsif( UNIVERSAL::isa($e1, 'SCALAR') and
- UNIVERSAL::isa($e2, 'SCALAR') )
- {
+ elsif( $type eq 'SCALAR' ) {
push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
$ok = _deep_check($$e1, $$e2);
+ pop @Data_Stack if $ok;
}
- else {
- push @Data_Stack, { vals => [$e1, $e2] };
+ elsif( $type ) {
+ push @Data_Stack, { type => $type, vals => [$e1, $e2] };
$ok = 0;
}
+ else {
+ _whoa(1, "No type in _deep_check");
+ }
}
}
@@ -452,10 +582,32 @@
}
-#line 1083
+sub _whoa {
+ my($check, $desc) = @_;
+ if( $check ) {
+ die <<WHOA;
+WHOA! $desc
+This should never happen! Please contact the author immediately!
+WHOA
+ }
+}
+
+#line 1289
+
sub eq_hash {
+ local @Data_Stack;
+ return _deep_check(@_);
+}
+
+sub _eq_hash {
my($a1, $a2) = @_;
+
+ if( grep !_type($_) eq 'HASH', $a1, $a2 ) {
+ warn "eq_hash passed a non-hash ref";
+ return 0;
+ }
+
return 1 if $a1 eq $a2;
my $ok = 1;
@@ -474,27 +626,32 @@
return $ok;
}
-#line 1116
+#line 1346
-# We must make sure that references are treated neutrally. It really
-# doesn't matter how we sort them, as long as both arrays are sorted
-# with the same algorithm.
-sub _bogus_sort { local $^W = 0; ref $a ? 0 : $a cmp $b }
-
sub eq_set {
my($a1, $a2) = @_;
return 0 unless @$a1 == @$a2;
# There's faster ways to do this, but this is easiest.
- return eq_array( [sort _bogus_sort @$a1], [sort _bogus_sort @$a2] );
-}
+ local $^W = 0;
-#line 1154
-
-sub builder {
- return Test::Builder->new;
+ # It really doesn't matter how we sort them, as long as both arrays are
+ # sorted with the same algorithm.
+ #
+ # Ensure that references are not accidentally treated the same as a
+ # string containing the reference.
+ #
+ # Have to inline the sort routine due to a threading/sort bug.
+ # See [rt.cpan.org 6782]
+ #
+ # I don't know how references would be sorted so we just don't sort
+ # them. This means eq_set doesn't really work with refs.
+ return eq_array(
+ [grep(ref, @$a1), sort( grep(!ref, @$a1) )],
+ [grep(ref, @$a2), sort( grep(!ref, @$a2) )],
+ );
}
-#line 1247
+#line 1534
1;
Modified: packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm 2006-03-15 16:18:02 UTC (rev 2357)
@@ -1,12 +1,13 @@
package Module::Signature;
-$Module::Signature::VERSION = '0.44';
+$Module::Signature::VERSION = '0.53';
+use 5.005;
use strict;
use vars qw($VERSION $SIGNATURE @ISA @EXPORT_OK);
use vars qw($Preamble $Cipher $Debug $Verbose $Timeout);
use vars qw($KeyServer $KeyServerPort $AutoKeyRetrieve $CanKeyRetrieve);
-use constant CANNOT_VERIFY => "0E0";
+use constant CANNOT_VERIFY => '0E0';
use constant SIGNATURE_OK => 0;
use constant SIGNATURE_MISSING => -1;
use constant SIGNATURE_MALFORMED => -2;
@@ -18,18 +19,20 @@
use ExtUtils::Manifest ();
use Exporter;
- at EXPORT_OK = (qw(sign verify),
- qw($SIGNATURE $KeyServer $Cipher $Preamble),
- grep /^[A-Z_]+_[A-Z_]+$/, keys %Module::Signature::);
- at ISA = 'Exporter';
+ at EXPORT_OK = (
+ qw(sign verify),
+ qw($SIGNATURE $KeyServer $Cipher $Preamble),
+ (grep { /^[A-Z_]+_[A-Z_]+$/ } keys %Module::Signature::),
+);
+ at ISA = 'Exporter';
-$SIGNATURE = 'SIGNATURE';
+$SIGNATURE = 'SIGNATURE';
$Timeout = $ENV{MODULE_SIGNATURE_TIMEOUT} || 3;
$Verbose = $ENV{MODULE_SIGNATURE_VERBOSE} || 0;
-$KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pgp.mit.edu';
-$KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371';
-$Cipher = 'SHA1';
-$Preamble = << ".";
+$KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pgp.mit.edu';
+$KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371';
+$Cipher = $ENV{MODULE_SIGNATURE_CIPHER} || 'SHA1';
+$Preamble = << ".";
This file contains message digests of all files listed in MANIFEST,
signed via the Module::Signature module, version $VERSION.
@@ -46,327 +49,50 @@
.
$AutoKeyRetrieve = 1;
-$CanKeyRetrieve = undef;
+$CanKeyRetrieve = undef;
-=head1 NAME
-
-Module::Signature - Module signature file manipulation
-
-=head1 VERSION
-
-This document describes version 0.44 of B<Module::Signature>,
-released December 16, 2004.
-
-=head1 SYNOPSIS
-
-As a shell command:
-
- % cpansign # verify an existing SIGNATURE, or
- # make a new one if none exists
-
- % cpansign sign # make signature; overwrites existing one
- % cpansign -s # same thing
-
- % cpansign verify # verify a signature
- % cpansign -v # same thing
- % cpansign -v --skip # ignore files in MANIFEST.SKIP
-
- % cpansign help # display this documentation
- % cpansign -h # same thing
-
-In programs:
-
- use Module::Signature qw(sign verify SIGNATURE_OK);
- sign();
- sign(overwrite => 1); # overwrites without asking
-
- # see the CONSTANTS section below
- (verify() == SIGNATURE_OK) or die "failed!";
-
-=head1 DESCRIPTION
-
-B<Module::Signature> adds cryptographic authentications to CPAN
-distributions, via the special F<SIGNATURE> file.
-
-If you are a module user, all you have to do is to remember to run
-C<cpansign -v> (or just C<cpansign>) before issuing C<perl Makefile.PL>
-or C<perl Build.PL>; that will ensure the distribution has not been
-tampered with.
-
-For module authors, you'd want to add the F<SIGNATURE> file to your
-F<MANIFEST>, then type C<cpansign -s> before making a distribution.
-You may also want to consider adding this code as F<t/0-signature.t>:
-
- #!/usr/bin/perl
- use strict;
- print "1..1\n";
-
- if (!-s 'SIGNATURE') {
- print "ok 1 # skip No signature file found\n";
- }
- elsif (!eval { require Module::Signature; 1 }) {
- print "ok 1 # skip ",
- "Next time around, consider install Module::Signature, ",
- "so you can verify the integrity of this distribution.\n";
- }
- elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
- print "ok 1 # skip Cannot connect to the keyserver\n";
- }
- else {
- (Module::Signature::verify() == Module::Signature::SIGNATURE_OK())
- or print "not ";
- print "ok 1 # Valid signature\n";
- }
-
- __END__
-
-Note that you'd want to keep your F<SIGNATURE> file at 0 bytes (or
-missing altogether) during development, so C<make test> would not fail;
-that file should only be generated during the C<make dist> time; see
-L</NOTES> for how to do it automatically.
-
-If you are already using B<Test::More> for testing, a more
-straightforward version of F<t/0-signature.t> can be found in the
-B<Module::Signature> distribution.
-
-Also, if you prefer a more full-fledged testing package, and are
-willing to inflict the dependency of B<Module::Build> on your users,
-Iain Truskett's B<Test::Signature> might be a better choice.
-
-Please also see L</NOTES> about F<MANIFEST.SKIP> issues, especially if
-you are using B<Module::Build> or writing your own F<MANIFEST.SKIP>.
-
-=head1 VARIABLES
-
-No package variables are exported by default.
-
-=over 4
-
-=item $Verbose
-
-If true, Module::Signature will give information during processing including
-gpg output. If false, Module::Signature will be as quiet as possible as
-long as everything is working ok. Defaults to false.
-
-=item $SIGNATURE
-
-The filename for a distribution's signature file. Defaults to
-C<SIGNATURE>.
-
-=item $KeyServer
-
-The OpenPGP key server for fetching the author's public key
-(currently only implemented on C<gpg>, not C<Crypt::OpenPGP>).
-May be set to a false value to prevent this module from
-fetching public keys.
-
-=item $KeyServerPort
-
-The OpenPGP key server port, defaults to C<11371>.
-
-=item $Timeout
-
-Maximum time to wait to try to establish a link to the key server.
-Defaults to C<3>.
-
-=item $AutoKeyRetrieve
-
-Whether to automatically fetch unknown keys from the key server.
-Defaults to C<1>.
-
-=item $Cipher
-
-The default cipher used by the C<Digest> module to make signature
-files. Defaults to C<SHA1>, but may be changed to other ciphers
-if the SHA1 cipher is undesirable for the user.
-
-The cipher specified in the F<SIGNATURE> file's first entry will
-be used to validate its integrity. For C<SHA1>, the user needs
-to have any one of these four modules installed: B<Digest::SHA>,
-B<Digest::SHA1>, B<Digest::SHA::PurePerl>, or (currently nonexistent)
-B<Digest::SHA1::PurePerl>.
-
-=item $Preamble
-
-The explanatory text written to newly generated F<SIGNATURE> files
-before the actual entries.
-
-=back
-
-=head1 ENVIRONMENT
-
-B<Module::Signature> honors these environment variables:
-
-=over 4
-
-=item MODULE_SIGNATURE_VERBOSE
-
-Works like $Verbose.
-
-=item MODULE_SIGNATURE_KEYSERVER
-
-Works like $KeyServer.
-
-=item MODULE_SIGNATURE_KEYSERVERPORT
-
-Works like $KeyServerPort.
-
-=item MODULE_SIGNATURE_TIMEOUT
-
-Works like $Timeout.
-
-=back
-
-=head1 CONSTANTS
-
-These constants are not exported by default.
-
-=over 4
-
-=item CANNOT_VERIFY (C<0E0>)
-
-Cannot verify the OpenPGP signature, maybe due to the lack of a network
-connection to the key server, or if neither gnupg nor Crypt::OpenPGP
-exists on the system.
-
-=item SIGNATURE_OK (C<0>)
-
-Signature successfully verified.
-
-=item SIGNATURE_MISSING (C<-1>)
-
-The F<SIGNATURE> file does not exist.
-
-=item SIGNATURE_MALFORMED (C<-2>)
-
-The signature file does not contains a valid OpenPGP message.
-
-=item SIGNATURE_BAD (C<-3>)
-
-Invalid signature detected -- it might have been tampered with.
-
-=item SIGNATURE_MISMATCH (C<-4>)
-
-The signature is valid, but files in the distribution have changed
-since its creation.
-
-=item MANIFEST_MISMATCH (C<-5>)
-
-There are extra files in the current directory not specified by
-the MANIFEST file.
-
-=item CIPHER_UNKNOWN (C<-6>)
-
-The cipher used by the signature file is not recognized by the
-C<Digest> and C<Digest::*> modules.
-
-=back
-
-=head1 NOTES
-
-=head2 Signing your module as part of C<make dist>
-
-B<Module::Install> users should simply do this:
-
- WriteAll( sign => 1 );
-
-For B<ExtUtils::MakeMaker> (version 6.18 or above), you may do this:
-
- WriteMakefile(
- (MM->can('signature_target') ? (SIGN => 1) : ()),
- # ... original arguments ...
- );
-
-Users of B<Module::Build> may do this:
-
- Module::Build->new(
- (sign => 1),
- # ... original arguments ...
- )->create_build_script;
-
-=head2 F<MANIFEST.SKIP> Considerations
-
-(The following section is lifted from Iain Truskett's B<Test::Signature>
-module, under the Perl license. Thanks, Iain!)
-
-It is B<imperative> that your F<MANIFEST> and F<MANIFEST.SKIP> files be
-accurate and complete. If you are using C<ExtUtils::MakeMaker> and you
-do not have a F<MANIFEST.SKIP> file, then don't worry about the rest of
-this. If you do have a F<MANIFEST.SKIP> file, or you use
-C<Module::Build>, you must read this.
-
-Since the test is run at C<make test> time, the distribution has been
-made. Thus your F<MANIFEST.SKIP> file should have the entries listed
-below.
-
-If you're using C<ExtUtils::MakeMaker>, you should have, at least:
-
- #defaults
- ^Makefile$
- ^blib/
- ^pm_to_blib
- ^blibdirs
-
-These entries are part of the default set provided by
-C<ExtUtils::Manifest>, which is ignored if you provide your own
-F<MANIFEST.SKIP> file.
-
-If you are using C<Module::Build>, you should have two extra entries:
-
- ^Build$
- ^_build/
-
-If you don't have the correct entries, C<Module::Signature> will
-complain that you have:
-
- ==> MISMATCHED content between MANIFEST and distribution files! <==
-
-You should note this during normal development testing anyway.
-
-=cut
-
sub verify {
my %args = ( skip => 1, @_ );
my $rv;
(-r $SIGNATURE) or do {
- warn "==> MISSING Signature file! <==\n";
- return SIGNATURE_MISSING;
+ warn "==> MISSING Signature file! <==\n";
+ return SIGNATURE_MISSING;
};
(my $sigtext = _read_sigfile($SIGNATURE)) or do {
- warn "==> MALFORMED Signature file! <==\n";
- return SIGNATURE_MALFORMED;
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
};
(my ($cipher) = ($sigtext =~ /^(\w+) /)) or do {
- warn "==> MALFORMED Signature file! <==\n";
- return SIGNATURE_MALFORMED;
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
};
(defined(my $plaintext = _mkdigest($cipher))) or do {
- warn "==> UNKNOWN Cipher format! <==\n";
- return CIPHER_UNKNOWN;
+ warn "==> UNKNOWN Cipher format! <==\n";
+ return CIPHER_UNKNOWN;
};
$rv = _verify($SIGNATURE, $sigtext, $plaintext);
if ($rv == SIGNATURE_OK) {
- my ($mani, $file) = _fullcheck($args{skip});
+ my ($mani, $file) = _fullcheck($args{skip});
- if (@{$mani} or @{$file}) {
- warn "==> MISMATCHED content between MANIFEST and distribution files! <==\n";
- return MANIFEST_MISMATCH;
- }
- else {
- warn "==> Signature verified OK! <==\n" if $Verbose;
- }
+ if (@{$mani} or @{$file}) {
+ warn "==> MISMATCHED content between MANIFEST and distribution files! <==\n";
+ return MANIFEST_MISMATCH;
+ }
+ else {
+ warn "==> Signature verified OK! <==\n" if $Verbose;
+ }
}
elsif ($rv == SIGNATURE_BAD) {
- warn "==> BAD/TAMPERED signature detected! <==\n";
+ warn "==> BAD/TAMPERED signature detected! <==\n";
}
elsif ($rv == SIGNATURE_MISMATCH) {
- warn "==> MISMATCHED content between SIGNATURE and distribution files! <==\n";
+ warn "==> MISMATCHED content between SIGNATURE and distribution files! <==\n";
}
return $rv;
@@ -380,27 +106,27 @@
local $SIGNATURE = $signature if $signature ne $SIGNATURE;
if ($AutoKeyRetrieve and !$CanKeyRetrieve) {
- if (!defined $CanKeyRetrieve) {
- require IO::Socket::INET;
- my $sock = IO::Socket::INET->new(
+ if (!defined $CanKeyRetrieve) {
+ require IO::Socket::INET;
+ my $sock = IO::Socket::INET->new(
Timeout => $Timeout,
PeerAddr => "$KeyServer:$KeyServerPort",
);
- $CanKeyRetrieve = ($sock ? 1 : 0);
- $sock->shutdown(2) if $sock;
- }
- $AutoKeyRetrieve = $CanKeyRetrieve;
+ $CanKeyRetrieve = ($sock ? 1 : 0);
+ $sock->shutdown(2) if $sock;
+ }
+ $AutoKeyRetrieve = $CanKeyRetrieve;
}
if (my $version = _has_gpg()) {
- return _verify_gpg($sigtext, $plaintext, $version);
+ return _verify_gpg($sigtext, $plaintext, $version);
}
elsif (eval {require Crypt::OpenPGP; 1}) {
- return _verify_crypt_openpgp($sigtext, $plaintext);
+ return _verify_crypt_openpgp($sigtext, $plaintext);
}
else {
- warn "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!\n";
- return _compare($sigtext, $plaintext, CANNOT_VERIFY);
+ warn "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!\n";
+ return _compare($sigtext, $plaintext, CANNOT_VERIFY);
}
}
@@ -421,13 +147,13 @@
my $_maniskip = &ExtUtils::Manifest::_maniskip;
local *ExtUtils::Manifest::_maniskip = sub { sub {
- return unless $skip;
- my $ok = $_maniskip->(@_);
- if ($ok ||= (!-e 'MANIFEST.SKIP' and _default_skip(@_))) {
- print "Skipping $_\n" for @_;
- push @extra, @_;
- }
- return $ok;
+ return unless $skip;
+ my $ok = $_maniskip->(@_);
+ if ($ok ||= (!-e 'MANIFEST.SKIP' and _default_skip(@_))) {
+ print "Skipping $_\n" for @_;
+ push @extra, @_;
+ }
+ return $ok;
} };
($mani, $file) = ExtUtils::Manifest::fullcheck();
@@ -437,9 +163,9 @@
}
foreach my $makefile ('Makefile', 'Build') {
- warn "==> SKIPPED CHECKING '$_'!" .
- (-e "$_.PL" && " (run $_.PL to ensure its integrity)") .
- " <===\n" for grep $_ eq $makefile, @extra;
+ warn "==> SKIPPED CHECKING '$_'!" .
+ (-e "$_.PL" && " (run $_.PL to ensure its integrity)") .
+ " <===\n" for grep $_ eq $makefile, @extra;
}
@{$mani} = grep {$_ ne 'SIGNATURE'} @{$mani};
@@ -458,28 +184,28 @@
sub _default_skip {
local $_ = shift;
return 1 if /\bRCS\b/ or /\bCVS\b/ or /\B\.svn\b/ or /,v$/
- or /^MANIFEST\.bak/ or /^Makefile$/ or /^blib\//
- or /^MakeMaker-\d/ or /^pm_to_blib/ or /^blibdirs/
- or /^_build\// or /^Build$/ or /^pmfiles\.dat/
- or /~$/ or /\.old$/ or /\#$/ or /^\.#/;
+ or /^MANIFEST\.bak/ or /^Makefile$/ or /^blib\//
+ or /^MakeMaker-\d/ or /^pm_to_blib/ or /^blibdirs/
+ or /^_build\// or /^Build$/ or /^pmfiles\.dat/
+ or /~$/ or /\.old$/ or /\#$/ or /^\.#/;
}
sub _verify_gpg {
my ($sigtext, $plaintext, $version) = @_;
local $SIGNATURE = Win32::GetShortPathName($SIGNATURE)
- if defined &Win32::GetShortPathName and $SIGNATURE =~ /[^-\w.:~\\\/]/;
+ if defined &Win32::GetShortPathName and $SIGNATURE =~ /[^-\w.:~\\\/]/;
my $keyserver = _keyserver($version);
my @quiet = $Verbose ? () : qw(-q --logger-fd=1);
my @cmd = (
- qw(gpg --verify --batch --no-tty), @quiet, ($KeyServer ? (
- "--keyserver=$keyserver",
- ($AutoKeyRetrieve and $version ge "1.0.7")
- ? "--keyserver-options=auto-key-retrieve"
- : ()
- ) : ()), $SIGNATURE
+ qw(gpg --verify --batch --no-tty), @quiet, ($KeyServer ? (
+ "--keyserver=$keyserver",
+ ($AutoKeyRetrieve and $version ge '1.0.7')
+ ? '--keyserver-options=auto-key-retrieve'
+ : ()
+ ) : ()), $SIGNATURE
);
my $output = '';
@@ -496,7 +222,7 @@
print STDERR $output;
}
elsif ($output =~ /((?: +[\dA-F]{4}){10,})/) {
- warn "WARNING: This key is not certified with a trusted signature!\n";
+ warn "WARNING: This key is not certified with a trusted signature!\n";
warn "Primary key fingerprint:$1\n";
}
@@ -506,8 +232,8 @@
sub _keyserver {
my $version = shift;
- my $scheme = "x-hkp";
- $scheme = "hkp" if $version ge "1.2.0";
+ my $scheme = 'x-hkp';
+ $scheme = 'hkp' if $version ge '1.2.0';
return "$scheme://$KeyServer:$KeyServerPort";
}
@@ -517,20 +243,20 @@
require Crypt::OpenPGP;
my $pgp = Crypt::OpenPGP->new(
- ($KeyServer) ? ( KeyServer => $KeyServer, AutoKeyRetrieve => $AutoKeyRetrieve ) : (),
+ ($KeyServer) ? ( KeyServer => $KeyServer, AutoKeyRetrieve => $AutoKeyRetrieve ) : (),
);
my $rv = $pgp->handle( Filename => $SIGNATURE )
- or die $pgp->errstr;
+ or die $pgp->errstr;
return SIGNATURE_BAD if (!$rv->{Validity} and $AutoKeyRetrieve);
if ($rv->{Validity}) {
- warn "Signature made ", scalar localtime($rv->{Signature}->timestamp),
- " using key ID ", substr(uc(unpack("H*", $rv->{Signature}->key_id)), -8), "\n",
- "Good signature from \"$rv->{Validity}\"\n" if $Verbose;
+ warn 'Signature made ', scalar localtime($rv->{Signature}->timestamp),
+ ' using key ID ', substr(uc(unpack('H*', $rv->{Signature}->key_id)), -8), "\n",
+ "Good signature from \"$rv->{Validity}\"\n" if $Verbose;
}
else {
- warn "Cannot verify signature; public key not found\n";
+ warn "Cannot verify signature; public key not found\n";
}
return _compare($sigtext, $plaintext, $rv->{Validity} ? SIGNATURE_OK : CANNOT_VERIFY);
@@ -543,11 +269,21 @@
local *D;
open D, $sigfile or die "Could not open $sigfile: $!";
+
+ if ($] >= 5.006 and <D> =~ /\r/) {
+ close D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+ binmode D, ':crlf';
+ } else {
+ close D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+ }
+
while (<D>) {
- next if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
- last if /^-----BEGIN PGP SIGNATURE/;
+ next if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
+ last if /^-----BEGIN PGP SIGNATURE/;
- $signature .= $_;
+ $signature .= $_;
}
return ((split(/\n+/, $signature, 2))[1]);
@@ -562,22 +298,22 @@
return $ok if $str1 eq $str2;
if (eval { require Text::Diff; 1 }) {
- warn "--- $SIGNATURE ".localtime((stat($SIGNATURE))[9])."\n";
- warn "+++ (current) ".localtime()."\n";
- warn Text::Diff::diff( \$str1, \$str2, { STYLE => "Unified" } );
+ warn "--- $SIGNATURE ".localtime((stat($SIGNATURE))[9])."\n";
+ warn '+++ (current) '.localtime()."\n";
+ warn Text::Diff::diff( \$str1, \$str2, { STYLE => 'Unified' } );
}
else {
- local (*D, *S);
- open S, $SIGNATURE or die "Could not open $SIGNATURE: $!";
- open D, "| diff -u $SIGNATURE -" or (warn "Could not call diff: $!", return SIGNATURE_MISMATCH);
- while (<S>) {
- print D $_ if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
- print D if (/^Hash: / .. /^$/);
- next if (1 .. /^-----BEGIN PGP SIGNATURE/);
- print D $str2, "-----BEGIN PGP SIGNATURE-----\n", $_ and last;
- }
- print D <S>;
- close D;
+ local (*D, *S);
+ open S, $SIGNATURE or die "Could not open $SIGNATURE: $!";
+ open D, "| diff -u $SIGNATURE -" or (warn "Could not call diff: $!", return SIGNATURE_MISMATCH);
+ while (<S>) {
+ print D $_ if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
+ print D if (/^Hash: / .. /^$/);
+ next if (1 .. /^-----BEGIN PGP SIGNATURE/);
+ print D $str2, "-----BEGIN PGP SIGNATURE-----\n", $_ and last;
+ }
+ print D <S>;
+ close D;
}
return SIGNATURE_MISMATCH;
@@ -591,24 +327,24 @@
my ($mani, $file) = _fullcheck($args{skip});
if (@{$mani} or @{$file}) {
- warn "==> MISMATCHED content between MANIFEST and the distribution! <==\n";
- warn "==> Please correct your MANIFEST file and/or delete extra files. <==\n";
+ warn "==> MISMATCHED content between MANIFEST and the distribution! <==\n";
+ warn "==> Please correct your MANIFEST file and/or delete extra files. <==\n";
}
if (!$overwrite and -e $SIGNATURE and -t STDIN) {
- local $/ = "\n";
- print "$SIGNATURE already exists; overwrite [y/N]? ";
- return unless <STDIN> =~ /[Yy]/;
+ local $/ = "\n";
+ print "$SIGNATURE already exists; overwrite [y/N]? ";
+ return unless <STDIN> =~ /[Yy]/;
}
if (my $version = _has_gpg()) {
- _sign_gpg($SIGNATURE, $plaintext, $version);
+ _sign_gpg($SIGNATURE, $plaintext, $version);
}
elsif (eval {require Crypt::OpenPGP; 1}) {
- _sign_crypt_openpgp($SIGNATURE, $plaintext);
+ _sign_crypt_openpgp($SIGNATURE, $plaintext);
}
else {
- die "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!";
+ die 'Cannot use GnuPG or Crypt::OpenPGP, please install either one first!';
}
warn "==> SIGNATURE file created successfully. <==\n";
@@ -619,7 +355,7 @@
my ($sigfile, $plaintext, $version) = @_;
die "Could not write to $sigfile"
- if -e $sigfile and (-d $sigfile or not -w $sigfile);
+ if -e $sigfile and (-d $sigfile or not -w $sigfile);
local *D;
open D, "| gpg --clearsign >> $sigfile.tmp" or die "Could not call gpg: $!";
@@ -627,15 +363,15 @@
close D;
(-e "$sigfile.tmp" and -s "$sigfile.tmp") or do {
- unlink "$sigfile.tmp";
- die "Cannot find $sigfile.tmp, signing aborted.\n";
+ unlink "$sigfile.tmp";
+ die "Cannot find $sigfile.tmp, signing aborted.\n";
};
open D, "$sigfile.tmp" or die "Cannot open $sigfile.tmp: $!";
open S, ">$sigfile" or do {
- unlink "$sigfile.tmp";
- die "Could not write to $sigfile: $!";
+ unlink "$sigfile.tmp";
+ die "Could not write to $sigfile: $!";
};
print S $Preamble;
@@ -694,27 +430,27 @@
require Crypt::OpenPGP;
my $pgp = Crypt::OpenPGP->new;
my $ring = Crypt::OpenPGP::KeyRing->new(
- Filename => $pgp->{cfg}->get('SecRing')
+ Filename => $pgp->{cfg}->get('SecRing')
) or die $pgp->error(Crypt::OpenPGP::KeyRing->errstr);
my $kb = $ring->find_keyblock_by_index(-1)
- or die $pgp->error("Can't find last keyblock: " . $ring->errstr);
+ or die $pgp->error('Can\'t find last keyblock: ' . $ring->errstr);
my $cert = $kb->signing_key;
my $uid = $cert->uid($kb->primary_uid);
warn "Debug: acquiring signature from $uid\n" if $Debug;
my $signature = $pgp->sign(
- Data => $plaintext,
- Detach => 0,
- Clearsign => 1,
- Armour => 1,
- Key => $cert,
- PassphraseCallback => \&Crypt::OpenPGP::_default_passphrase_cb,
+ Data => $plaintext,
+ Detach => 0,
+ Clearsign => 1,
+ Armour => 1,
+ Key => $cert,
+ PassphraseCallback => \&Crypt::OpenPGP::_default_passphrase_cb,
) or die $pgp->errstr;
local *D;
- open D, ">$sigfile" or die "Could not write to $sigfile: $!";
+ open D, "> $sigfile" or die "Could not write to $sigfile: $!";
print D $Preamble;
print D $signature;
close D;
@@ -746,8 +482,8 @@
my $plaintext = '';
foreach my $file (sort keys %$digest) {
- next if $file eq $SIGNATURE;
- $plaintext .= "@{$digest->{$file}} $file\n";
+ next if $file eq $SIGNATURE;
+ $plaintext .= "@{$digest->{$file}} $file\n";
}
return $plaintext;
@@ -761,40 +497,40 @@
my $found = ExtUtils::Manifest::manifind($p);
my(%digest) = ();
my $obj = eval { Digest->new($algorithm) } || eval {
- my ($base, $variant) = ($algorithm =~ /^(\w+)(\d+)$/g) or die;
- require "Digest/$base.pm"; "Digest::$base"->new($variant)
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ require "Digest/$base.pm"; "Digest::$base"->new($variant)
} || eval {
- require "Digest/$algorithm.pm"; "Digest::$algorithm"->new
+ require "Digest/$algorithm.pm"; "Digest::$algorithm"->new
} || eval {
- my ($base, $variant) = ($algorithm =~ /^(\w+)(\d+)$/g) or die;
- require "Digest/$base/PurePerl.pm"; "Digest::$base\::PurePerl"->new($variant)
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ require "Digest/$base/PurePerl.pm"; "Digest::$base\::PurePerl"->new($variant)
} || eval {
- require "Digest/$algorithm/PurePerl.pm"; "Digest::$algorithm\::PurePerl"->new
+ require "Digest/$algorithm/PurePerl.pm"; "Digest::$algorithm\::PurePerl"->new
} or do { eval {
- my ($base, $variant) = ($algorithm =~ /^(\w+)(\d+)$/g) or die;
- warn("Unknown cipher: $algorithm, please install Digest::$base, Digest::$base$variant, or Digest::$base\::PurePerl\n");
+ my ($base, $variant) = ($algorithm =~ /^(\w+?)(\d+)$/g) or die;
+ warn "Unknown cipher: $algorithm, please install Digest::$base, Digest::$base$variant, or Digest::$base\::PurePerl\n";
} and return } or do {
- warn("Unknown cipher: $algorithm, please install Digest::$algorithm\n"); return;
+ warn "Unknown cipher: $algorithm, please install Digest::$algorithm\n"; return;
};
foreach my $file (sort keys %$read){
warn "Debug: collecting digest from $file\n" if $Debug;
if ($dosnames){
$file = lc $file;
- $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge;
- $file =~ s=((\w|-)+)=substr ($1,0,8)=ge;
+ $file =~ s!(\.(\w|-)+)!substr ($1,0,4)!ge;
+ $file =~ s!((\w|-)+)!substr ($1,0,8)!ge;
}
unless ( exists $found->{$file} ) {
warn "No such file: $file\n" if $Verbose;
}
- else {
- local *F;
- open F, $file or die "Cannot open $file for reading: $!";
- binmode(F) if -B $file;
- $obj->addfile(*F);
- $digest{$file} = [$algorithm, $obj->hexdigest];
- $obj->reset;
- }
+ else {
+ local *F;
+ open F, $file or die "Cannot open $file for reading: $!";
+ binmode(F) if -B $file;
+ $obj->addfile(*F);
+ $digest{$file} = [$algorithm, $obj->hexdigest];
+ $obj->reset;
+ }
}
return \%digest;
@@ -804,19 +540,304 @@
__END__
+=head1 NAME
+
+Module::Signature - Module signature file manipulation
+
+=head1 VERSION
+
+This document describes version 0.53 of B<Module::Signature>,
+released January 31, 2006.
+
+=head1 SYNOPSIS
+
+As a shell command:
+
+ % cpansign # verify an existing SIGNATURE, or
+ # make a new one if none exists
+
+ % cpansign sign # make signature; overwrites existing one
+ % cpansign -s # same thing
+
+ % cpansign verify # verify a signature
+ % cpansign -v # same thing
+ % cpansign -v --skip # ignore files in MANIFEST.SKIP
+
+ % cpansign help # display this documentation
+ % cpansign -h # same thing
+
+In programs:
+
+ use Module::Signature qw(sign verify SIGNATURE_OK);
+ sign();
+ sign(overwrite => 1); # overwrites without asking
+
+ # see the CONSTANTS section below
+ (verify() == SIGNATURE_OK) or die "failed!";
+
+=head1 DESCRIPTION
+
+B<Module::Signature> adds cryptographic authentications to CPAN
+distributions, via the special F<SIGNATURE> file.
+
+If you are a module user, all you have to do is to remember to run
+C<cpansign -v> (or just C<cpansign>) before issuing C<perl Makefile.PL>
+or C<perl Build.PL>; that will ensure the distribution has not been
+tampered with.
+
+Module authors can easily add the F<SIGNATURE> file to the distribution
+tarball; see L</NOTES> below for how to do it as part of C<make dist>.
+
+If you I<really> want to sign a distribution manually, simply add
+C<SIGNATURE> to F<MANIFEST>, then type C<cpansign -s> immediately
+before C<make dist>. Be sure to delete the F<SIGNATURE> file afterwards.
+
+Please also see L</NOTES> about F<MANIFEST.SKIP> issues, especially if
+you are using B<Module::Build> or writing your own F<MANIFEST.SKIP>.
+
+=head1 VARIABLES
+
+No package variables are exported by default.
+
+=over 4
+
+=item $Verbose
+
+If true, Module::Signature will give information during processing including
+gpg output. If false, Module::Signature will be as quiet as possible as
+long as everything is working ok. Defaults to false.
+
+=item $SIGNATURE
+
+The filename for a distribution's signature file. Defaults to
+C<SIGNATURE>.
+
+=item $KeyServer
+
+The OpenPGP key server for fetching the author's public key
+(currently only implemented on C<gpg>, not C<Crypt::OpenPGP>).
+May be set to a false value to prevent this module from
+fetching public keys.
+
+=item $KeyServerPort
+
+The OpenPGP key server port, defaults to C<11371>.
+
+=item $Timeout
+
+Maximum time to wait to try to establish a link to the key server.
+Defaults to C<3>.
+
+=item $AutoKeyRetrieve
+
+Whether to automatically fetch unknown keys from the key server.
+Defaults to C<1>.
+
+=item $Cipher
+
+The default cipher used by the C<Digest> module to make signature
+files. Defaults to C<SHA1>, but may be changed to other ciphers
+via the C<MODULE_SIGNATURE_CIPHER> environment variable if the SHA1
+cipher is undesirable for the user.
+
+The cipher specified in the F<SIGNATURE> file's first entry will
+be used to validate its integrity. For C<SHA1>, the user needs
+to have any one of these four modules installed: B<Digest::SHA>,
+B<Digest::SHA1>, B<Digest::SHA::PurePerl>, or (currently nonexistent)
+B<Digest::SHA1::PurePerl>.
+
+=item $Preamble
+
+The explanatory text written to newly generated F<SIGNATURE> files
+before the actual entries.
+
+=back
+
+=head1 ENVIRONMENT
+
+B<Module::Signature> honors these environment variables:
+
+=over 4
+
+=item MODULE_SIGNATURE_CIPHER
+
+Works like C<$Cipher>.
+
+=item MODULE_SIGNATURE_VERBOSE
+
+Works like C<$Verbose>.
+
+=item MODULE_SIGNATURE_KEYSERVER
+
+Works like C<$KeyServer>.
+
+=item MODULE_SIGNATURE_KEYSERVERPORT
+
+Works like C<$KeyServerPort>.
+
+=item MODULE_SIGNATURE_TIMEOUT
+
+Works like C<$Timeout>.
+
+=back
+
+=head1 CONSTANTS
+
+These constants are not exported by default.
+
+=over 4
+
+=item CANNOT_VERIFY (C<0E0>)
+
+Cannot verify the OpenPGP signature, maybe due to the lack of a network
+connection to the key server, or if neither gnupg nor Crypt::OpenPGP
+exists on the system.
+
+=item SIGNATURE_OK (C<0>)
+
+Signature successfully verified.
+
+=item SIGNATURE_MISSING (C<-1>)
+
+The F<SIGNATURE> file does not exist.
+
+=item SIGNATURE_MALFORMED (C<-2>)
+
+The signature file does not contains a valid OpenPGP message.
+
+=item SIGNATURE_BAD (C<-3>)
+
+Invalid signature detected -- it might have been tampered with.
+
+=item SIGNATURE_MISMATCH (C<-4>)
+
+The signature is valid, but files in the distribution have changed
+since its creation.
+
+=item MANIFEST_MISMATCH (C<-5>)
+
+There are extra files in the current directory not specified by
+the MANIFEST file.
+
+=item CIPHER_UNKNOWN (C<-6>)
+
+The cipher used by the signature file is not recognized by the
+C<Digest> and C<Digest::*> modules.
+
+=back
+
+=head1 NOTES
+
+=head2 Signing your module as part of C<make dist>
+
+The easiest way is to use B<Module::Install>:
+
+ sign; # put this before "WriteAll"
+ WriteAll;
+
+For B<ExtUtils::MakeMaker> (version 6.18 or above), you may do this:
+
+ WriteMakefile(
+ (MM->can('signature_target') ? (SIGN => 1) : ()),
+ # ... original arguments ...
+ );
+
+Users of B<Module::Build> may do this:
+
+ Module::Build->new(
+ (sign => 1),
+ # ... original arguments ...
+ )->create_build_script;
+
+=head2 F<MANIFEST.SKIP> Considerations
+
+(The following section is lifted from Iain Truskett's B<Test::Signature>
+module, under the Perl license. Thanks, Iain!)
+
+It is B<imperative> that your F<MANIFEST> and F<MANIFEST.SKIP> files be
+accurate and complete. If you are using C<ExtUtils::MakeMaker> and you
+do not have a F<MANIFEST.SKIP> file, then don't worry about the rest of
+this. If you do have a F<MANIFEST.SKIP> file, or you use
+C<Module::Build>, you must read this.
+
+Since the test is run at C<make test> time, the distribution has been
+made. Thus your F<MANIFEST.SKIP> file should have the entries listed
+below.
+
+If you're using C<ExtUtils::MakeMaker>, you should have, at least:
+
+ #defaults
+ ^Makefile$
+ ^blib/
+ ^pm_to_blib
+ ^blibdirs
+
+These entries are part of the default set provided by
+C<ExtUtils::Manifest>, which is ignored if you provide your own
+F<MANIFEST.SKIP> file.
+
+If you are using C<Module::Build>, you should have two extra entries:
+
+ ^Build$
+ ^_build/
+
+If you don't have the correct entries, C<Module::Signature> will
+complain that you have:
+
+ ==> MISMATCHED content between MANIFEST and distribution files! <==
+
+You should note this during normal development testing anyway.
+
+=head2 Testing signatures
+
+You may add this code as F<t/0-signature.t> in your distribution tree:
+
+ #!/usr/bin/perl
+ use strict;
+ print "1..1\n";
+
+ if (!-s 'SIGNATURE') {
+ print "ok 1 # skip No signature file found\n";
+ }
+ elsif (!eval { require Module::Signature; 1 }) {
+ print "ok 1 # skip ",
+ "Next time around, consider install Module::Signature, ",
+ "so you can verify the integrity of this distribution.\n";
+ }
+ elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
+ print "ok 1 # skip Cannot connect to the keyserver\n";
+ }
+ else {
+ (Module::Signature::verify() == Module::Signature::SIGNATURE_OK())
+ or print "not ";
+ print "ok 1 # Valid signature\n";
+ }
+
+If you are already using B<Test::More> for testing, a more
+straightforward version of F<t/0-signature.t> can be found in the
+B<Module::Signature> distribution.
+
+Also, if you prefer a more full-fledged testing package, and are
+willing to inflict the dependency of B<Module::Build> on your users,
+Iain Truskett's B<Test::Signature> might be a better choice.
+
+=cut
+
=head1 SEE ALSO
L<Digest>, L<Digest::SHA>, L<Digest::SHA1>, L<Digest::SHA::PurePerl>
L<ExtUtils::Manifest>, L<Crypt::OpenPGP>, L<Test::Signature>
+L<Module::Install>, L<ExtUtils::MakeMaker>, L<Module::Build>
+
=head1 AUTHORS
-Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>
+Audrey Tang E<lt>autrijus at autrijus.orgE<gt>
=head1 COPYRIGHT
-Copyright 2002, 2003, 2004 by Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>.
+Copyright 2002, 2003, 2004, 2005 by Audrey Tang.
Parts of the documentation are copyrighted by Iain Truskett, 2002.
Modified: packages/libmodule-signature-perl/branches/upstream/current/script/cpansign
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/script/cpansign 2006-03-15 16:14:51 UTC (rev 2356)
+++ packages/libmodule-signature-perl/branches/upstream/current/script/cpansign 2006-03-15 16:18:02 UTC (rev 2357)
@@ -81,11 +81,11 @@
=head1 AUTHORS
-Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>
+Audrey Tang E<lt>autrijus at autrijus.orgE<gt>
=head1 COPYRIGHT
-Copyright 2002, 2003 by Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>.
+Copyright 2002, 2003, 2006 by Audrey Tang.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
More information about the Pkg-perl-cvs-commits
mailing list