r2359 - in packages/libmodule-signature-perl/trunk: . debian inc
inc/Module inc/Module/Install inc/Test lib/Module script
Krzysztof Krzyzaniak
eloy at costa.debian.org
Wed Mar 15 16:27:34 UTC 2006
Author: eloy
Date: 2006-03-15 16:26:45 +0000 (Wed, 15 Mar 2006)
New Revision: 2359
Added:
packages/libmodule-signature-perl/trunk/AUDREY2006.pub
packages/libmodule-signature-perl/trunk/inc/Module/AutoInstall.pm
packages/libmodule-signature-perl/trunk/inc/Test/Builder/
Removed:
packages/libmodule-signature-perl/trunk/AUTRIJUS.pub
packages/libmodule-signature-perl/trunk/TODO
packages/libmodule-signature-perl/trunk/inc/ExtUtils/
Modified:
packages/libmodule-signature-perl/trunk/Changes
packages/libmodule-signature-perl/trunk/MANIFEST
packages/libmodule-signature-perl/trunk/META.yml
packages/libmodule-signature-perl/trunk/Makefile.PL
packages/libmodule-signature-perl/trunk/README
packages/libmodule-signature-perl/trunk/SIGNATURE
packages/libmodule-signature-perl/trunk/debian/changelog
packages/libmodule-signature-perl/trunk/debian/control
packages/libmodule-signature-perl/trunk/debian/rules
packages/libmodule-signature-perl/trunk/inc/Module/Install.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/AutoInstall.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Base.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Can.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Fetch.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Include.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Makefile.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Metadata.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Scripts.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/Win32.pm
packages/libmodule-signature-perl/trunk/inc/Module/Install/WriteAll.pm
packages/libmodule-signature-perl/trunk/inc/Test/Builder.pm
packages/libmodule-signature-perl/trunk/inc/Test/More.pm
packages/libmodule-signature-perl/trunk/lib/Module/Signature.pm
packages/libmodule-signature-perl/trunk/script/cpansign
Log:
eloy: new upstream version
Copied: packages/libmodule-signature-perl/trunk/AUDREY2006.pub (from rev 2358, packages/libmodule-signature-perl/branches/upstream/current/AUDREY2006.pub)
Deleted: packages/libmodule-signature-perl/trunk/AUTRIJUS.pub
===================================================================
--- packages/libmodule-signature-perl/trunk/AUTRIJUS.pub 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/AUTRIJUS.pub 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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
-SXNiHr8C78/8N3fOv831i5/4zzf3mGUGm23GjaehNen6OFf/ABE3/XgTRtIMulWM
-36MMga2ib1P0f6gasanlz/wzd86/z/Wbjl/y0Tf3uGKaLSJWOk9a7nTP4/4SP/Es
-wqPH82zbh5d3VEfo2xVOR0uM7d9NWv4+VEwouYrK2jZ5NOiUKCSWsYloP9l5cjx2
-r21paRsTp0UfFaljYRpSnereXbfISzy6ld/VrO3SpqIwkUSsx+yTzt4bb90P5nTJ
-CBkbJ2HM8mcCADtZPIc0yuPMWi2w4Cxtpidw6QWJp7EPpcDYVDzBJPJ+5tbBKfZV
-7GyNfp+rqMmGg/lWLjjJq0rSHvFF8K/S32sl5/Lby9GnpjT46dC3xMfnyJrhOfDE
-0Ll5jkzGmyS3NRvoXlNp5o+pzldT0mynQfspZWER+fJrObb/AGOTXRdV8r640MEG
-m2cV05P+i/VLSSQgdSPQ0O4B+/Ga1+XkltbvJp8gdrWrRwzCvOOleAfINdxWLLHP
-bo1rIai5t3BorA/ahNBVR+0Ptp+2mWAQyxPBIg+9rnCWKQEgD3dz2b/DunsxposN
-K9tMQ/8AiuYqPLGngA/oOJh/2zEH3/8AOuZC/J1/Dfy/oq8WN7xByt5IoLZxNGBW
-qCPStQkZkH22eT4smsukyxR847aQkmlDYg9fl5cOYs/EgSJHl5lAiDQB5tt5Y08q
-eGhw17E6an/jOYn/AIashQHRIff/AHGJ1/8ACaxc6LKFr6Env/oC/wDjOYz9C3Hx
-f6MfhFd9OX/xm8HFLvPzRwjvH2oWTy3ajcaJEB3ppinb/wAJg4T6jocKXekgaQie
-pdshX9HKof8A0S5fjx/w3D6n2efD07r7Hqeh8H1q2Ov0RcyIJPqQqSaA6cNv/Daw
-q1HR7lLvSFNiq+peOoH1AKWItLlqcf8AD0XP7PLh6dz/AD+h8H1m3YzlvueR6+Se
-DerF3T//0I3o+kepo1jL+jPU5W0Tep+jufKsanl6n+GLvnX+f63ccv8Alom/vMMD
-pCRwAtpIG1anTQPxPlWP/iWFmk6fHJo9i500OTbQnmdPV+VUU8uf+Gbrny/n+t3P
-L/lom/vGXu7e3ihCiwVTTr9QC/j/AIat/wDiWYZ+otlHh+LGfMbwwrKWgSKnFVpB
-HEasaVH+4/T3/wCBycflz5bhOnrqMqAz3dHrT7KD7CD5LnN9YMDWcqKApMqfCqKl
-GLcd1WG134J3hXO9eSbdms4UjAEcaKBT5Y574IQH8R3+DkaYAGUj/CBX+cyKy0+O
-BRVT02wVLbBhutB2wxS2ChXYciorTAl7LIKvdTra2g3PQHiOvInp88jHCK9R4Q2n
-Kb2FlJru1ikBVqMGHEgUzhPnnyvqektM6RH6mZOYlTdB/KwP2o9vh/lzvUWqeVNU
-20u8humQkCSFw1WWnKjD7XGuKXWnRz2zqwEiSKQQR1B2OGJ8KW246rMeJAcW3c+S
-NOv5bK7hmqKRurfEqyAUNeXBw0b/AOqy8c75bRRahY2txFp60kIJ4WayAH9oBo/L
-8qNxP7Svx/ys5u3lrTovzBj0jWYzFp/q+pII/hWSEmq8ipXirNRJGX7Oda1zytYa
-TLaNp9lGkBcQNbiGOXcJWJ466dqlwwaOMq26JH6WWaipwBHdfwLjQxSFyNekn7F7
-6d8NDp/L52P/AI72U2mUSQ/o7tT/AHh9v/Adxv6NB4f7ju3/ACw+P/gu5cum0hlP
-6O61/wCPH/x3cxjyLWBuPepw6MDAh/R4Gx2+oDxP/fuYWarpXG90OP6gFL3sg/3i
-C8v9Dum40/QEXP7PLjwuP5/R+D6xbm8emBI0A07ooP8AvD3p/wCA7hdqun8dR0P/
-AEDjyvXFPqVOX+hXbUp+gouf2eXHhcfz+j8P1iARG3+afuTfrvzf/9GN6VpXqaNp
-8n6L5l7eBvU/R3PlWNTy9T/DF1z5fz/XLnn/AMtE/wDeNeqaR6UXJtNCAD/lgCHp
-/wCA5a/8SxmkaWJNH0+T9GepzghPqfo8PyrGDX1P8M3XPl/P9bueX+/5/wC9zatp
-3pxuP0d6YAP/AB4en2/8Bu0zEH1ls/hDDb23CafLJCCrpIHZQoUCiFh8PCLpxf8A
-3VH/AKmdc8gPPf8Al621K9vfQtUXiqRmhJQ8XLe9V/1s5Zb15S27pQcFcLxp8P7y
-MjiUh7H/AH3Hkr/KwXN3H+jY52WOyv0uVUGjKoDUIrX9sf8ABZdlFQjLurf3tmnI
-OSUSeY+0PZ9I816VewQXOl3a39o8otvWWvwyU5cH5BTXicM76GS9uYpIv3bxE0DA
-MrAgqQQwYdGwjuLJUtbdbdFjSK6jfigCgcpPiai0+JixZskztLA3IIGWnI8jTb2z
-HskmroEFyiAK2BJBB7kBpPlnRNMt1tLWyigiRmdUiBADuasw+ftg64tVjSifZ8MM
-LdlJBKUDAMD8/HG3Chq+2TlEEX1ahM8VdPseJ/mHYLba3ousqo5Lci3nNAaxSfAQ
-Qf2fjw985X4sPKkkE6Iv1e8s4baKXi3JXkjI+GRJ1+wHZecUvH/ff7OGHnjTxc2L
-jjyeJhIlR3U1zhX5i+fR5y1GI6fA9lplpvFG7Vkkl7zy0+HlT4I1+Lh/s8OIGQ4e
-g2LLJMQie+XL38nq0NleOIyNKibYUP1Q/wDjONjprS69FkfRxueosyfw/wAN4XeW
-RBqWnWV3DZLIskKElbRJAGC0ZS0eiXn2W23uZH/nw4uNMrDGv6O+0w/48P8Ax3Tm
-NMVY7nHiRxDYKf1SQGjaO2wA2sa9P/Bdwv1S3Av9FH6MkUm7ccTYFeX+hXR4gfoG
-L1P5uPC4/wB+eh8H1iA3OmfEf9x3f/lg/wDHdwu1TT+Op6IPqHHleutPqfHl/oV2
-aU/QUXPpy48bj+f0fh+sQMRud+h+5gSO5//Si2j6X6mk6e/6N9TnBEfU/R/PlWNd
-+f8Ahq79Sv8AN9auuX+/pv7xktX08RJJ/uOEex3+oCP/AMVy0/WuP0nSw+mac/6N
-EnO3ifn+j+fKqKa8z5auvUr/AD/Wbvl/v+X+8Yv1m0WMEfUViqaVNmsf4nQrOn/B
-LmJDecve2HkEsYLBPE4Con1eFXFKCjMzH9mLj9r/AH2n+pi3k3XP8PeaFuZG42Ux
-+r3LVpxDmsch/wBU9cKtUlMUrog+BSFC0G3p0Wm2FgYvNLC1CHBqPktR+rMoxBjw
-nqKYxJjISHQvr9Da3tgYq/bCspU0PJSGU1+jAumawGUpcSetIzsu61biNl4gZy38
-t/PUEtumgalOFvrMhbORzT14x9lan/dqr/wWTptKspNUXUrBhHBKhWaPkw4vUkkU
-P7VaMuYg9MuGRqvtdji8OYuR2O986PcyT9NXr3hsrS3ZpkI9RpCAgXvXjy+L2w59
-RhQMKEipGBNLiHBX68QFBpT4R0FPDK1e/t7C3kuriQRxxirMf8++TkRVg7MJ8PEI
-xjVDc95Yr551KHTdOuZpN2ZHEa9y3E0Azygq04Hu2/8ADO6fmBrLjQbrVr74J70G
-z0q2PVFkH7yQ/wCX6XLl/L9jOG0IZe4Wn4ZLT8pS7z9zRqOcY9QPvZ7+X+pItwdJ
-uY1m58mtC8UcpqN3jXnZanL/AJapFF/v12zqMunhxbgadWpH/HjXw/79055/juXt
-bpkQhWRw8ZYVAIHSh+E8v2lb7WdY0DVbPWktqWsP1pQfVgS2t3YMo+JlSDRb4rF/
-vtml/wCG5ZDU4/4xyNW1QO9d1sq/R3xf8c49f+WD/wAdzC3U7Hjqeij6hx5Xzin1
-Iry/0O6NKfoCLn05ceFz/P6PwfWIF1sCWX/caTUj/pXn/wAZrCvUrMi/0f8A3HFS
-144p9RK8v9FuTxp/h2Ln05ceF1/P6HwfWbfHjdn3H7kF/9OE6dpsp06xcWKNzt43
-Dtp/qVBQHlzOgXHqV/n+sXH/ABnk+3hZdQ+ncBpLaNFirI5+rJDQDao/3HWDdT+y
-+Cra2QadaMbJTW1ibkbNTWqA8uZ0OXlX+f6xPy/5aZf7zC+VUjtpAqLG9w3EqsaI
-Qi9fsW9mR+39qLMXCPVL+sW2XQeSU6i7PFGTuzEuW6k1bf8AFsLo6iXmdgKb4NYC
-Qs25KFar12ALN/w2BiAsasev2WA965ltakBRAffr3FO+TDyt+Yer6LKIb5nvrFqR
-upNZV7KUY/b/ANVsibL8HhTb6dz/AAwy8rQGXWLU8OaxyJM6iteEbBmyMoxkKkLT
-GcoG4mn0LYefpNRtIm0e3Z+YH7yWiIP+BJJxzW13fyi91m4M3pfGkYHGKOncJ+03
-+U3xYDutCGh67ex6YnpQckkNuB8FZEV3Cjt8ZbjTA/mbWJV0+Kxhk9K4u+QqvVY1
-B5t7ZgzB4jG9gadhAggSAokA/N5T+YWsHWdXJX/eOzrb2sddtiTJJX+ZmpkPeNhx
-8SvLD7VoY3vHijNUiKxhjQbgEt+LYGmtkF4E3RQvGnhTap+5szoACAA7nByG8kve
-q/4f+v2KajZXcDXDtwewlcRzfCNnj5UD7D7OJW/1zTm+t26O5i+0JYg8PgVeOUFW
-3+z8L52T8nvLwltppzbW5u45EkW6kj9ST0HSsXBm+GLkeX+XnVZdDvruIRT3UQtx
-UC2ECOpH8rM4+yf9TDzHe1k0Xz/5c1vTtZKwraQ/XErytxbW0kh4gcpBHbaBecUq
-f2nwXf2XG80v/cbxDXTCn6PK8v8ARrhqU/wzD6nTlw4Xf2ef1f4PrVt0bXfyk8u6
-oPrElgkVygP72x4wFvf0lQQv/wA9FfOa3/kvVYdZ0vRXt7ZHuLpxFqAsrH03jWGe
-RlNpHYI/qLCn2J7mSL1f3ka/7ugq8ECVjkei8Vv/1OTxyxi0hBtbYn0Yxy+s6UGP
-wj4mVrYzBv5lkf1/9+vzy7lrgqnGKERem3p8ZCV6fs0jX9jjxp+zkWzZTiqzVc+l
-/pbDfnyHcm1uZ6S0VT8BrViP2vi/ZOIyFuElFUHkvRifHwXC/Nl7BH1bgKKOu9WP
-t/k5KPy6edPNNi0EEE5E8f7ueZoUP7xeIaRIbhlj9T0+f7pvgyEZsUPrXX7rzIbt
-vW0nTFn4j1OGpTt8q101P2c5frc2rHVtRNzZ2qzmOPiBdSMogp0iJtVDfH9pqJ8e
-cazZiS4eKX08/wCk5mLi4RXHy6cP6WSRNcCeX1Y0I9ZqBncUPJuW/AsfiwRqDzG4
-X9zEs3AU4Slt+W5/ul/ayJ5syxycTq+p/IFzr627/ofS9Nkt/qdhwD6jMlFEb8D8
-OnSVkb/dg/Yb/fmTT6552p/xxtK9v9ytz09v9xeeJM2BBfbhvPOv/Vm0mv8A21bj
-/vFZGdbuvNB13y0ZdK0xZhqEpgVdSnYM36Pvgyux01Gjj4cn5qkv7xUj4fH6sfkn
-NhY9ej//2YhcBBMRAgAcBQI9APaKAhsDBAsHAwIDFQIDAxYCAQIeAQIXgAAKCRC0
-s903PDUBoHhtAJ4ik0f2cbVwqQb7eRpGeZJrLzREMQCfXJDFwawdEPstaoNe2+uk
-8UuanmCIRgQTEQIABgUCPw2YZQAKCRBd8Z4rZ6e1hHwkAJ9qcqZcdxNPCQ1byKP4
-yJUd85JY1wCfZLnZyLRx6bj+KWJ7wiJWR+7r1D60OEF1dHJpanVzIFRhbmcgKFRh
-bmcgWm9uZy1IYW4pIDxhdXRyaWp1c0Bzb3VyY2Vmb3JnZS5uZXQ+iEYEEBECAAYF
-AjxBfz4ACgkQlHx7WpUDpzN+AQCg0p0ZgHDb4vILs3fcF9aZXuDzmlAAn17w8L5d
-dCCLIrytOPvs/xmY7J9KiEYEEBECAAYFAjx9owwACgkQsKDmf6P4+zkjaACeIuNS
-gX265U0r+VLTtXQ2eHt+XGIAn0sIQHjepMyDWS0QPk9E3KPvxULciF0EExECAB0F
-Ajy5nsUCGwMFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRC0s903PDUBoBlXAJ91WG9V
-HuV2VUFAkzQ6ixv9KU4vSgCgnmblAMju1KdrPNBEUJEt6qXdKiKIRgQQEQIABgUC
-PQ97tAAKCRC7jLF01JaQ8qeOAKCkk/AOxaOjKZhBdJdSzv15aTpTNACfSgAw9KLB
-oksKGezTwI1bUmpuzLaIRgQSEQIABgUCPZpfAgAKCRDMvyCbopBYyCFEAKCZAlZQ
-LnP9zuZPqlfXMYlOEdV02ACguP7rVwN1hVzRl1Dv833knjw/NSuIRgQQEQIABgUC
-PkzI5QAKCRDjIEwfXSuxGuCVAJ9CepTCjCXdWjao8nWpKyO+ZqKrFQCffYxkKzzU
-ZovRNaA3bhD9IzfoSqSIRgQTEQIABgUCPw0IdgAKCRCENyTOn6h5XZCFAKCSG4lb
-42DwqTWBLaURUOpct2ySEQCgtCHeZKEMbACEy/fSZ2XoMXZkdqmIRgQTEQIABgUC
-Pw0f0AAKCRAeSvcp1c7/0CrKAJ97CnSyEK6oaq61/e0VWxGo9UtjfgCfRGoTmJbd
-AHAmTkiyICxodov9ZHWJARwEEwECAAYFAj8NkngACgkQ229lmotMvJxU0QgAxij1
-RmFpPsRXYROLdD/zLXagQzMYjfg4J+LkTsoKU2ad0lvDn1ajb4hRHDM/Vz62csn7
-eYpMwiTXWuaYTqxxYKqR+qBHi8Hjf9zXhW3ZoKEv3yeZjbyQR5OZDYm2vro6y6PX
-t73ErMcWuBZBVmge2YlajuV9k301NTVh30g0343ePsxFNFQbmCeIf2BLna1SL+dV
-NNXokJpvzQs8uL+z0bEips+AZCdPhS2XoTUgnZw9zpC69/26MtjDBXJMR4iPt/0X
-wuybzVPAr8IiRKNTy5w4NJ/UTjCNAW0jagp0Zr24ZL2y7eSoHENmVydTgu6XlRaG
-lkJM1kHDJtAE4LThAYhGBBMRAgAGBQI/DZhlAAoJEF3xnitnp7WEuGgAn2+L9oR6
-8++PRSdJv+TKXbH6fisaAJ9HGnx+n0CYqo0j7/OpfpeTaFl7m4kBHAQTAQIABgUC
-PxDPzgAKCRAiQhgCUFjMc2eMCACe4DaU26tbkcznXz4LDD6k764/J6BB6DS4tH+q
-A4T0xYoGdWqhlTwemq3/13WuvPnA/I6Lb6WaEZjCmrL+ENd8ESL3zXh28kbGYGf7
-0sFpcY/tXvy7pK095qN4vBgq+YnKhGQGS0PHsqZPsYYWAeKi+XzGhWzzWRO5ObXB
-Km+3m4eCkUq6tOPNcC1MIPneGTPT8YA0ydYycXcqvBvEFq7ncCq5A8+tEpi4g/m6
-TN0llu41oOf5ksOnhFE1R/JPXZPJ4zEbxFI6lZ0fTQ5TITYBqg0As1NaGRAQbYPx
-zFGIT8fPoR5ahGu3jaovhlmK9dnkwARK3ttHXwC1CMoGRvUdiEYEEhECAAYFAj8n
-0DoACgkQ5OVNEZoM2pl/ngCfZdy7wRT92XQP1Q+eyS2m2D5IOOQAn1Ttbdas1Vzj
-fi4QVJI+ZxbYovXJiEYEEhECAAYFAj6nm84ACgkQdU4vU8LFvP34bQCdGisQ9LWB
-cYUoQj+iBRVJpko3JSAAmwaVZMXDDwGx7NmBJl+9I6O2sVqtiEYEExECAAYFAj8/
-URYACgkQ1dlLUeP4bkzCiQCfb0kIPA0VuUYDOtZGAI/4Tlgg7h8AnA3zY70yZGXN
-iIu2nwBFS8IFqqfliEYEExECAAYFAj8/l4oACgkQlZ/JOHsLIwgt1QCeICmgpiT1
-yFia5DtjEKEWZJdPknkAoLqKfxrtO38q6DzXvT7BWJbxk9CouQINBDzBK1sQCACS
-sr2le1dFJHvv65E+/vAIbVUNmiswHsETsySCQkL+5SJkT0Kns8DODVKovTM8chuj
-YnIdq0GxswFOqNbNos8mazmZFU25sjN1nOqMNe7MSJBguVHlpoLTYnA1LNqq1xzZ
-WPt/5+WSQGwKpUiBiFlUNC1BzyoT4AxcMIeNNs8wCGwlZZPlGEXljPeEue3f/OTG
-+Q6v9xaw9jAeW0gIpKo0R7sqLrwRM+l/nczXDFpz4i6gSo3DRm5u1yGI4QVEY96I
-xJ43lrznFCJmSvRR8VbTnH+GZbp6U2X223u2P+X+i2DLcnmgwLfvXVzR4u1gobPo
-dBW1uZB2A/7jKY63DhkbAAMFB/402EMUEEhGClmXVLO8EflvnqGFqEkrbQDyZBHF
-97GRhvEBsJQFBha5D+6CFguRI3T53IA/bK0H9xsuHKLmKsEY6pXx4m+15+zplDqX
-wEmnfS6JABq8GLhx9FkBysM3tMAkh67E5cAPVlY3/MFkiS5CwCVL7ASkTfzGRRKB
-9v9AEOK6o5uA35EKDlFvkar7htIS+CLyId4kZ7eh1YGwyFaKqXJJ5ZvplLCjA/sX
-/yJWaMhzcbqwgcNTYOYtKdDtCx+91zf3hc1r6P4TPUorf+bXtCMBkmmV8g8lQuMK
-qGjQde4lw0my8LcBvQ+K3IRiLqA0IrgrkXEikH3NwzSsCReGiEwEGBECAAwFAj2o
-A3AFCQpM2ZUACgkQtLPdNzw1AaAliACfaDfD35b1ODV+1Eih4jn/Do3N74oAoKyn
-BdyEzdeucxCH9LJkh190KomSuQINBD0A+P4QCACf0Z//nfkS/+HaSuUxKCqjWs9B
-8N6vUeIc2Im2aExOwjsHlUGIwsFldZaYPNNg7OnTAgjQvTKC0R6I8pC5hDZa1Hns
-4JdcxdoHoTHAfiw4BjnnJsGTQukktreUpVslC3tW+65xB6e1dSspevzfDWKLrK9U
-u1DWCRjByGZ3nI/MDR163EP/qtGGBDKjbmJkSS0xTSZ+MmbJHowm+LRB4tPZeF+u
-A9vA+tiHA5RJ2euOPpfOfq/6jSXN2xH//Gdi8OnDCgVudnYQCASuz2Og1wVZ+R8P
-A4VtzoCdxcmvlpsGjkQHXJVYeLPOlvhcFtnW3khJEZXM0PggIctBBiIN6u6DAAMG
-B/4wmabes1vfaVgt0YoWSDVKTWqpvs4IlgAaeLBol6L5ep/f+9ZVfNsbNpV5DS2b
-AW46XPLPfET5UVs8IQbcw9akcxoHj1L1bYgZLbM9CRmwM7xNh0SIg8elaxTqHqKe
-I8fFV5H3HXKZtiavDYfxOfSrPLI8NlFQ/eTxr2dCkqEkpeChZrOnHcFN+sl9qQp/
-TeOWhA7itUe6St29/bBo/Pg7InpCCklUnjVbMVvuirFz1VHno4qW5Alx/sOr7k7I
-JrBj1N7icny8qt1a0pemie9MqlIn2lMXoy17/9z9rz8K/S0M9yD+EKad7iGvIqbS
-NZ4ZjXQavt5K0pml+jsgaPzgiEwEGBECAAwFAj2oA2gFCQoNC+oACgkQtLPdNzw1
-AaAsvACgh8LjFzY2cTJ8zgdA5GS+fPclwycAn2V/ckrItWPuq3J1JyZ56G6Fzd6B
-uQENBDrSdfMQBACkzcqrblbWeDIQ/EOQIY+Dq96NErj7QMl7Gyx9gp2qPyRpBgTr
-jQrSpN1nG7UHGVDC1aX/YJR+GCs1hcV/jIb2EIZ9ioafCCKZ5ruAZGBIIgF2E4Ol
-WxBeS/kdU3ZyBJJgKLAjCnh1qVrEcxeLKrkdSVPQwvfGdDq7q10R4ANYowADBgP+
-JPFESXJbWK8LTTRyArEWWEvSOI/bUa6D6GH6e172xAsqwOFKwhvKQfebMKQ6f/Gp
-0Xtimm+mCzPOUfDutW+bZtFIZ1NW2umzS3QAd1bALI/QZPnI8Vly2l8CNF84F73W
-T6k1wQdgpdQ/Gbb2h+jxBCebsr/iHQxKUioik1tuNzOISwQYEQIADAUCOtJ18wUJ
-AeEzgAAKCRC0s903PDUBoHScAJoDpQhhxpQ34HCxLr+aCM4Blzz+AgCYuvim2gQ6
-peRwqZxLK5ncvt4KMg==
-=/69j
------END PGP PUBLIC KEY BLOCK-----
Modified: packages/libmodule-signature-perl/trunk/Changes
===================================================================
--- packages/libmodule-signature-perl/trunk/Changes 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/Changes 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/MANIFEST
===================================================================
--- packages/libmodule-signature-perl/trunk/MANIFEST 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/MANIFEST 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/META.yml
===================================================================
--- packages/libmodule-signature-perl/trunk/META.yml 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/META.yml 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/Makefile.PL
===================================================================
--- packages/libmodule-signature-perl/trunk/Makefile.PL 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/Makefile.PL 2006-03-15 16:26:45 UTC (rev 2359)
@@ -3,68 +3,60 @@
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');
+$|++;
-=for Non-Debian
+name 'Module-Signature';
+all_from 'lib/Module/Signature.pm';
+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,
- ],
+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';
-=cut
+build_requires 'Test::More';
+auto_include_deps;
+auto_install -default => 0;
-&WriteAll( sign => 1 );
+sign; WriteAll;
my $make = eval { require Config; $Config{make} } || 'make';
print "\nNow, please enter '$make test' to test, and '$make install' to install.\n";
@@ -73,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;
}
}
@@ -83,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";
@@ -114,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.
.
@@ -127,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/trunk/README
===================================================================
--- packages/libmodule-signature-perl/trunk/README 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/README 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/SIGNATURE
===================================================================
--- packages/libmodule-signature-perl/trunk/SIGNATURE 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/SIGNATURE 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/TODO
===================================================================
--- packages/libmodule-signature-perl/trunk/TODO 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/TODO 2006-03-15 16:26:45 UTC (rev 2359)
@@ -1,3 +0,0 @@
-
-- PKI.
-
Modified: packages/libmodule-signature-perl/trunk/debian/changelog
===================================================================
--- packages/libmodule-signature-perl/trunk/debian/changelog 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/debian/changelog 2006-03-15 16:26:45 UTC (rev 2359)
@@ -1,3 +1,16 @@
+libmodule-signature-perl (0.53-1) unstable; urgency=low
+
+ * New upstream release, taking package for Perl Group
+ (closes: #329595) (closes: #357075)
+ * debian/watch - added
+ * debian/control:
+ - Standards-Version: upgraded to 3.6.2
+ - Uploaders: added me
+ - Maintainer: set to Debian Perl Group <pkg-perl-maintainers at lists.alioth.debian.org>
+ * debian/rules - compat increased to 4
+
+ -- Krzysztof Krzyzaniak (eloy) <eloy at debian.org> Wed, 15 Mar 2006 17:18:22 +0100
+
libmodule-signature-perl (0.44-3) unstable; urgency=low
* Re-upload with full source, as the 0.44-1 upload was borked so the
Modified: packages/libmodule-signature-perl/trunk/debian/control
===================================================================
--- packages/libmodule-signature-perl/trunk/debian/control 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/debian/control 2006-03-15 16:26:45 UTC (rev 2359)
@@ -3,8 +3,9 @@
Priority: optional
Build-Depends: debhelper (>= 3.0.5), libtest-simple-perl, libdigest-sha1-perl
Build-Depends-Indep: perl (>= 5.8.0-7)
-Maintainer: Chip Salzenberg <chip at debian.org>
-Standards-Version: 3.5.1
+Maintainer: Debian Perl Group <pkg-perl-maintainers at lists.alioth.debian.org>
+Uploaders: Krzysztof Krzyzaniak (eloy) <eloy at debian.org>
+Standards-Version: 3.6.2
Package: libmodule-signature-perl
Architecture: all
Modified: packages/libmodule-signature-perl/trunk/debian/rules
===================================================================
--- packages/libmodule-signature-perl/trunk/debian/rules 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/debian/rules 2006-03-15 16:26:45 UTC (rev 2359)
@@ -6,7 +6,7 @@
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
-export DH_COMPAT=3
+export DH_COMPAT=4
PACKAGE=$(shell dh_listpackages)
Copied: packages/libmodule-signature-perl/trunk/inc/Module/AutoInstall.pm (from rev 2358, packages/libmodule-signature-perl/branches/upstream/current/inc/Module/AutoInstall.pm)
Modified: packages/libmodule-signature-perl/trunk/inc/Module/Install/AutoInstall.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/AutoInstall.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/AutoInstall.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Base.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Base.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Base.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Can.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Can.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Can.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Fetch.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Fetch.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Fetch.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Include.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Include.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Include.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Makefile.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Makefile.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Makefile.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Metadata.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Metadata.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Metadata.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Scripts.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Scripts.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Scripts.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/Win32.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/Win32.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/Win32.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install/WriteAll.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install/WriteAll.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install/WriteAll.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Module/Install.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Module/Install.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Module/Install.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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;
Copied: packages/libmodule-signature-perl/trunk/inc/Test/Builder (from rev 2358, packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder)
Modified: packages/libmodule-signature-perl/trunk/inc/Test/Builder.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Test/Builder.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Test/Builder.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/inc/Test/More.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/inc/Test/More.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/inc/Test/More.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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/trunk/lib/Module/Signature.pm
===================================================================
--- packages/libmodule-signature-perl/trunk/lib/Module/Signature.pm 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/lib/Module/Signature.pm 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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} || 'subkeys.pgp.net';
-$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('subkeys.pgp.net') }) {
- 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/trunk/script/cpansign
===================================================================
--- packages/libmodule-signature-perl/trunk/script/cpansign 2006-03-15 16:18:08 UTC (rev 2358)
+++ packages/libmodule-signature-perl/trunk/script/cpansign 2006-03-15 16:26:45 UTC (rev 2359)
@@ -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