r2353 - in packages: . libmodule-signature-perl
libmodule-signature-perl/branches
libmodule-signature-perl/branches/upstream
libmodule-signature-perl/branches/upstream/current
libmodule-signature-perl/branches/upstream/current/inc
libmodule-signature-perl/branches/upstream/current/inc/ExtUtils
libmodule-signature-perl/branches/upstream/current/inc/Module
libmodule-signature-perl/branches/upstream/current/inc/Module/Install
libmodule-signature-perl/branches/upstream/current/inc/Test
libmodule-signature-perl/branches/upstream/current/lib
libmodule-signature-perl/branches/upstream/current/lib/Module
libmodule-signature-perl/branches/upstream/current/script
libmodule-signature-perl/branches/upstream/current/t
Krzysztof Krzyzaniak
eloy at costa.debian.org
Wed Mar 15 16:15:50 UTC 2006
Author: eloy
Date: 2006-03-15 16:14:26 +0000 (Wed, 15 Mar 2006)
New Revision: 2353
Added:
packages/libmodule-signature-perl/
packages/libmodule-signature-perl/branches/
packages/libmodule-signature-perl/branches/upstream/
packages/libmodule-signature-perl/branches/upstream/current/
packages/libmodule-signature-perl/branches/upstream/current/AUTHORS
packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub
packages/libmodule-signature-perl/branches/upstream/current/Changes
packages/libmodule-signature-perl/branches/upstream/current/MANIFEST
packages/libmodule-signature-perl/branches/upstream/current/META.yml
packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL
packages/libmodule-signature-perl/branches/upstream/current/PAUSE2003.pub
packages/libmodule-signature-perl/branches/upstream/current/README
packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE
packages/libmodule-signature-perl/branches/upstream/current/TODO
packages/libmodule-signature-perl/branches/upstream/current/inc/
packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/
packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/AutoInstall.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm
packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm
packages/libmodule-signature-perl/branches/upstream/current/lib/
packages/libmodule-signature-perl/branches/upstream/current/lib/Module/
packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm
packages/libmodule-signature-perl/branches/upstream/current/script/
packages/libmodule-signature-perl/branches/upstream/current/script/cpansign
packages/libmodule-signature-perl/branches/upstream/current/t/
packages/libmodule-signature-perl/branches/upstream/current/t/0-signature.t
packages/libmodule-signature-perl/branches/upstream/current/t/1-basic.t
packages/libmodule-signature-perl/tags/
Log:
[svn-inject] Installing original source of libmodule-signature-perl
Added: packages/libmodule-signature-perl/branches/upstream/current/AUTHORS
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/AUTHORS 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/AUTHORS 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,24 @@
+Here is a list of people and their CPAN id, extracted from the ChangeLog
+file and the mailing list archives. These people have either submitted
+patches or suggestions, or their bug reports or comments have inspired
+the appropriate patches. Corrections, additions, deletions welcome:
+
+Adam J. Foxson (FOX)
+Alan Burlison (ABURLISON)
+Arthur Bergman (ABERGMAN)
+Andreas Koenig (ANDK)
+Benjamin Goldberg (GOLDBB)
+Blair Zajac (BZAJAC)
+Dave Rolsky (DROLSKY)
+Iain Truskett (SPOON)
+Jarkko Hietaniemi (JHI)
+Jos Boumans (KANE)
+Mark Shelor
+Matt Southall
+Michael G Schwern (MSCHWERN)
+Scott R. Godin
+Soren A
+Steve Hay (SHAY)
+Tels (TELS)
+Walt Mankowski
+William Wentworth-Sheilds
Added: packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/AUTRIJUS.pub 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,368 @@
+-----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-----
Added: packages/libmodule-signature-perl/branches/upstream/current/Changes
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/Changes 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/Changes 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,290 @@
+[Changes for 0.44 - 2004-12-16]
+
+* Add "pmfiles.dat" to legacy manifest_skip routine to accomodate
+ early Win32 hacks. Reported by Steve Hay via Michael Schwern.
+
+[Changes for 0.43 - 2004-12-16]
+
+* Updated t/0-signature.t to be more friendly with Test::More;
+ contributed by Michael Schwern.
+
+* Add $Timeout (default 3 seconds) to control the timeout for
+ probing connections to the key server.
+
+* Take account of the .ts files produced by newer MakeMakers
+ in the suggested MANIFEST.SKIP list.
+
+[Changes for 0.42 - 2004-11-20]
+
+* Move under SVK version control management; ditch keyword tags.
+
+* Michael Schwern pointed out that during development, the
+ "signature.t" file would keep failing.
+
+* Documented how to generate SIGNATURE files as part of "make dist",
+ for Module::Install, ExtUtils::MakeMaker and Module::Build users .
+
+[Changes for 0.41 - 2004-07-04]
+
+* Mark Shelor points out that support for Digest::SHA was broken.
+
+[Changes for 0.40 - 2004-07-01]
+
+* Dave Rolsky points out that GPG version detection always
+ returns '1'. (bug #6810)
+
+[Changes for 0.39 - 2004-06-17]
+
+* Supports Digest::SHA (now preferred) and Digest::SHA1::PurePerl,
+ in addition to the original Digest::SHA1 backend.
+
+* We now asks before importing the default keys,
+ also suggested by Tels.
+
+* Unknown cipher is made fatal, thanks to suggestion by Tels.
+
+* Apply Dave Rolsky's patch to verify that author's pubkey
+ is available on a keyserver. may need more work.
+
+[Changes for 0.38 - 2004-01-01]
+
+* Update to the newest Module::Install.
+
+* Not using inc/SCRIPT/ anymore.
+
+* Add "#defaults" and "^blibdirs$" to recommended MANIFEST.SKIP
+ to pacify newer ExtUtil::MakeMaker.
+
+* Starting to think about how to make "disttest" + "dist"
+ not signing twice.
+
+[Changes for 0.37 - 2003-11-06]
+
+* Move bin/cpansign to script/cpansign.
+
+* Make cpansign exit upon failure.
+
+[Changes for 0.36 - 2003-10-28]
+
+* Use sign(1) to autosign ourselves.
+
+* Soren A pointed out that hkp:// didn't work with GnuPG.
+
+[Changes for 0.25 - 2003-08-28]
+
+* Now ships with my pubkey and PAUSE's.
+
+* Interactive Makefile.PL, suggested by Jarkko.
+
+[Changes for 0.34 - 2003-08-18]
+
+* Don't ask user to install Crypt::OpenPGP if she does not have a
+ C compiler anyway.
+
+* ExtUtils::Manifest 1.38 does not support good enough skips even
+ for Makefile.PL, sigh.
+
+[Changes for 0.33 - 2003-08-12]
+
+* William Wentworth-Sheilds points out that META.yml is dynamic,
+ which makes SIGNATURE incorrect for people without either "diff"
+ or "gpg". Fixed.
+
+[Changes for 0.32 - 2003-08-11]
+
+* Take Schwern's patch to only set _maniskip for legacy EU::Manifest.
+
+* Remove ::TieOut since we are not using it anymore.
+
+* Reduce noise for untrusted signatures to two lines.
+
+[Changes for 0.31 - 2003-08-10]
+
+* Scott R. Godin pointed out 0.30 had bad signature. whoops.
+
+[Changes for 0.30 - 2003-08-10]
+
+* Add JHI to authors.
+
+* Patch from Michael Schwern: only let GnuPG display anything
+ if we're handling suspicious keys, not when you have added
+ the signer into the trustdb.
+
+* New global config variable, $Verbose.
+
+* MODULE_SIGNATURE_VERBOSE, MODULE_SIGNATURE_KEYSERVER and
+ MODULE_SIGNATURE_KEYSERVERPORT env variables are now respected.
+
+* Only supply _default_skip if our ExtUtils::MakeMaker is too old.
+
+[Changes for 0.29 - 2003-08-08]
+
+* Now fails gracefully all the time, including when incapable of
+ connecting to the keyserver.
+
+* Also, SHA1 sum is still checked even if the user does not have
+ GnuPg/Crypt::OpenPGP.
+
+* Hence, Crypt::OpenPGP is no longer a mandatory prerequisite even
+ for users without gnupg.
+
+* "0E0" is now made into a constant, CANNOT_VERIFY.
+
+* Do not die() when we absolutely can't verify.
+
+* BZAJAC pointed out that we should add .svn to _default_skip.
+
+[Changes for 0.28 - 2003-07-29]
+
+* Remove Digest.pm dependency.
+
+* Don't test for "diff -version" anymore -- not all diffs
+ have -version, thanks again to Alan Burlison.
+
+[Changes for 0.27 - 2003-07-28]
+
+* More punctuation cleanups in POD.
+
+* Michael Schwern pointed out that successful tests shouldn't be noisy.
+
+[Changes for 0.26 - 2003-07-17]
+
+* New internal function, _verify(), that takes $sigfile as its first
+ argument, eliminating the "local $Module::Signautre::SIGNATURE" approach.
+
+* sign() now also takes a skip=> parameter (defaults to true)
+ about whether to respect MANIFEST.SKIP. This needs to be
+ set to 0 to sign blib/ archives.
+
+* Officially supporting signing and verification of PAR files, using PAR::Dist.
+
+* Let's ignore warnings when performing on exe files
+
+[Changes for 0.24 - 2003-07-08]
+
+* Preliminary PAR support.
+
+[Changes for 0.23 - 2003-07-07]
+
+* Ken Williams noted that M::B now works on 5.005.
+
+[Changes for 0.22 - 2003-05-15]
+
+* Move Signature.pm to lib/Module/Signature.pm.
+
+* Switch to the Module::Install framework.
+
+* Updates TODO to reflect correspondence with andk.
+
+* Matt Southall mentioned that, if somebody has never run gpg before,
+ we need to initialize it once before running test.
+
+* Warn about potential 'Makefile' exploit as pointed out by Tels.
+ Document pending.
+
+* Bugfix for incorrect 'MALFORMED' response to signatures made from
+ older versions of GnuPG, as reported by Tels.
+
+[Changes for 0.18 - 2002-11-04]
+
+* Binary files handling on win32 was broken. (Jos Boumans)
+
+[Changes for 0.17 - 2002-10-30]
+
+* Resolve bug report by Iain Truskett: cpansign -s should not complain
+ manifest mismatch if SIGNATURE is lacking.
+
+* Also, bail out gracefully when signing fails, instead of crippling the
+ old SIGNATURE.
+
+* MANIFEST.SKIP doc lifted from Test::Signature.
+
+* Minor POD fixups.
+
+[Changes for 0.16 - 2002-10-28]
+
+* Adds AUTHORS file.
+
+* Added connectivity probing for testing.
+
+* Print a helpful success message after signing.
+
+* Don't cripple old SIGNATURE file.
+
+* Suggestion from Tels: skip the ambiguous 'optional'
+ probing for Crypt::OpenPGP if gnupg is there.
+
+[Changes for 0.15 - 2002-10-17]
+
+* Fixed compatibility with old MakeMaker versions, thanks to chromatic.
+
+* Fixed "no /dev/tty" bug during smoke testing,
+ as reported by the excellent CPAN Smokers.
+
+[Changes for 0.12 - 2002-10-12]
+
+* Supports automatic key retrieval, implemented in Crypt::OpenPGP.
+
+[Changes for 1.02 - 2002-10-12]
+
+* Fixed the default cipher from MD5 back to SHA1.
+
+[Changes for 0.10 - 2002-10-12]
+
+* Fixed a problem that prevents earlier versions of GnuPG from fetching
+ public keys via --keyserver-option=auto-key-retrieve.
+
+[Changes for 0.09 - 2002-10-12]
+
+* Documented the package variables so they become part of APIs.
+
+* Alternative (non-SHA1) ciphers in SIGNATUREs are now recognized.
+
+* Added a new return value, CIPHER_UNKNOWN.
+
+* Mention Test::Signature.
+
+* Ditch Test::More from the sample script.
+
+* Label tests.
+
+[Changes for 0.09 - 2002-10-11]
+
+* We're no longer alpha status; reflect in README.
+
+* Incoporated a suggestion from Tels: undefining the $KeyServer
+ package variable should disable automatic key-fetching.
+
+* Include the tests from Iain.
+
+* Tels: disable KeyServer fetching if it's undef'ed.
+
+[Changes for 0.07 - 2002-10-11]
+
+* Fixed our own signatures.
+
+[Changes for 0.06 - 2002-10-10]
+
+* Use many-arg system() instead of the one-arg form to prevent security breach.
+
+* Iain Truskett: fixed export bug so SIGNATURE_OK is properly exported.
+
+* Introduced global $KeyServer variable, default at 'pgp.mit.edu'.
+
+* Suggestion from Aurthur Bergman: cpansign without arg should DWIM.
+
+* Set a default keyserver for cpansign -v.
+
+* Use by-name params for functions. sign(override => $bool).
+
+[Changes for 0.05 - 2002-08-14]
+
+* Typo correction and safety checking.
+
+[Changes for 0.04 - 2002-08-14]
+
+* Added boilerplate text before SIGNATURE to explain what's it about.
+
+* Crypt::OpenPGP signature didn't work.
+
+* Add keyword expansion tags.
Added: packages/libmodule-signature-perl/branches/upstream/current/MANIFEST
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/MANIFEST 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/MANIFEST 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,28 @@
+AUTHORS
+AUTRIJUS.pub
+Changes
+inc/ExtUtils/AutoInstall.pm
+inc/Module/Install.pm
+inc/Module/Install/AutoInstall.pm
+inc/Module/Install/Base.pm
+inc/Module/Install/Can.pm
+inc/Module/Install/Fetch.pm
+inc/Module/Install/Include.pm
+inc/Module/Install/Makefile.pm
+inc/Module/Install/Metadata.pm
+inc/Module/Install/Scripts.pm
+inc/Module/Install/Win32.pm
+inc/Module/Install/WriteAll.pm
+inc/Test/Builder.pm
+inc/Test/More.pm
+lib/Module/Signature.pm
+Makefile.PL
+MANIFEST This list of files
+META.yml
+PAUSE2003.pub
+README
+script/cpansign
+SIGNATURE
+t/0-signature.t
+t/1-basic.t
+TODO
Added: packages/libmodule-signature-perl/branches/upstream/current/META.yml
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/META.yml 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/META.yml 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,16 @@
+name: Module-Signature
+version: 0.44
+abstract: Module signature file manipulation
+author: Autrijus Tang (autrijus at autrijus.org)
+license: perl
+distribution_type: module
+build_requires:
+ Test::More: 0
+requires:
+ perl: 5.005
+recommends:
+ PAR::Dist: 0
+no_index:
+ directory:
+ - inc
+generated_by: Module::Install version 0.36
Added: packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/Makefile.PL 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,134 @@
+#!/usr/bin/perl
+
+use 5.005;
+use inc::Module::Install;
+
+name ('Module-Signature');
+abstract ('Module signature file manipulation');
+author ('Autrijus Tang (autrijus at autrijus.org)');
+version_from ('lib/Module/Signature.pm');
+license ('perl');
+install_script ('script/cpansign');
+
+requires( perl => 5.005 );
+requires( can_cc() ? 'Digest::SHA' : 'Digest::SHA::PurePerl' )
+ unless eval { require Digest::SHA1; 1 }
+ or eval { require Digest::SHA; 1 }
+ or eval { require Digest::SHA::PurePerl; 1 };
+features(
+ 'Crypt::OpenPGP Support' => [
+ -default => 0,
+ 'MIME::Base64' => 0,
+ 'Compress::Zlib' => 0,
+ 'Crypt::CBC' => 0,
+ 'Crypt::DES' => 0,
+ 'Crypt::Blowfish' => 0,
+ 'Crypt::RIPEMD160' => 0,
+ 'Tie::EncryptedHash' => 0,
+ 'Class::Loader' => 0,
+ 'Convert::ASCII::Armour' => 0,
+ 'Data::Buffer' => 0.04,
+ 'Digest::MD2' => 0,
+ 'Math::Pari' => 0,
+ 'Crypt::Random' => 0,
+ 'Crypt::Primes' => 0,
+ 'Crypt::DES_EDE3' => 0,
+ 'Crypt::DSA' => 0,
+ 'Crypt::RSA' => 0,
+ 'Convert::ASN1' => 0,
+ 'Convert::PEM' => 0,
+ 'Crypt::OpenPGP' => 1.0,
+ ],
+) if want_openpgp();
+
+features(
+ 'Display checksum differences' => [
+ recommends( 'Algorithm::Diff' => 0 ),
+ recommends( 'Text::Diff' => 0 ),
+ ],
+) unless (can_run('diff'));
+
+features(
+ 'Sign and verify PAR (Perl Archive) files' => [
+ -default => 0,
+ recommends( 'PAR::Dist' => 0 ),
+ ],
+);
+
+include('ExtUtils/AutoInstall.pm');
+build_requires('Test::More');
+auto_include_deps();
+auto_install( -default => 0 );
+
+&WriteAll( sign => 1 );
+
+my $make = eval { require Config; $Config{make} } || 'make';
+print "\nNow, please enter '$make test' to test, and '$make install' to install.\n";
+
+sub locate_openpgp {
+ 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;
+ }
+}
+
+sub locate_gpg {
+ print "*** Looking for GnuPG (GNU Privacy Guard, a cryptographic signature tool)...\n";
+
+ my $gpg = can_run('gpg');
+ my $has_gpg = (
+ $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 "GnugPG not found anywhere in your PATH, eek.\n";
+ return;
+}
+
+sub want_openpgp {
+ return if (locate_gpg() or locate_openpgp());
+
+ print << '.';
+
+What do you want me to do?
+1) Let you install GnuPG manually while I'm waiting for your answer;
+ it is available at http://www.gnupg.org/download/.
+.
+
+ my $punt = 2;
+ if (can_cc()) {
+ $punt++;
+ print << '.';
+2) Automatically install Crypt::OpenPGP and the 20 modules it requires
+ from CPAN, which will give the same functionality as GnuPG.
+.
+ }
+
+ print << ".";
+$punt) Forget this cryptographic signature stuff for now.
+.
+
+ my $choice;
+ while (1) {
+ $choice = prompt("Your choice:", 3) || 3;
+ last if $choice =~ /^[123]$/;
+ print "Sorry, I cannot understand '$choice'.\n"
+ }
+
+ goto &want_openpgp if $choice == 1;
+ return if $choice == $punt;
+ return 1;
+}
Added: packages/libmodule-signature-perl/branches/upstream/current/PAUSE2003.pub
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/PAUSE2003.pub 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/PAUSE2003.pub 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: OpenKeyServer v1.2
+Comment: Extracted from belgium.keyserver.net
+
+mQGiBD4+cJARBACxOByY0SJBBuJoFrH2hoqRFny423gY6V3jq1uTgGY/PPaxP+Sq
+r3RzxPct4vJcsoo48pwBsMHLrWfORq26zb6eKgmMq/CQo2gzaRbeRxCi3ke4KBmu
+aREi6RjaZSU94yABtDmspUBrpYV8zfZMv5ZIQlg9W1Tu66BFOUrrNeDpKwCgosCp
+9dtNAMhHkzxs8UJH5i3Uzb0D/0VLoAE8sOfUXqjc38rxiHuGBFSNC70Ih4mzGUCJ
+MGT4z1X3K6uUawnXMoc8XqPaYnEgOzztMymydtr+urjUwcGnuXDSpV6nulE5irxh
+zlikSTJy/42QzTMcrdRynffmJo9PRgymMI8GgWaYG5g3zzGAhi5BA6G8JKfC93IV
+xiRPBACXJpLBYQljqJY9UDNJuq8nHhKiWHBXdZzrC3LM0FSF3PKuP/ugc+KBIKXm
+clNPNFKla/SRbH6dMHsGIy8wnGPI5AtTS0roNQrttv3/ghRT7+OKXrGmBxZ/KHVr
+v3PVgiRA5MDr1mIsovfuc9WQnFu2TkgnN/F3pDcrVVSi5b+rZLQzUEFVU0UgQmF0
+Y2ggU2lnbmluZyBLZXkgMjAwMyA8cGF1c2VAcGF1c2UucGVybC5vcmc+iF8EExEC
+AB8FAj4+cJAFCQPCZwAECwcDAgMVAgMDFgIBAh4BAheAAAoJEDKNqGdFD4nsd4sA
+n3gYvr37VkUycx61wm5t4BoSO904AJ9dkl/zU5BbDnXEPKk0FNWFSnwnxbkCDQQ+
+PnCyEAgAjAKDcvpogvJvSrg3rkstDhxP4O+JZvfxzrdL9Qk0FPBlb31ECxPMBf2z
+KObrwGKwxgD3+lSb/y9SgOYnAsuwztn6BqjQ8AVKiI0MFDTa+tLrtY5860X7TxJD
+9bzMx/A4gEsYoFZYR4s/alGAzcqFcdQ2IiFnKE4KPtNXEMQ67lCEw5zdYSoJta9J
+UKsCX3KI/DOne1NnjNZL2dQadqjsEc8mjvUOTXSG1sCawzTP5tNoPHg13GeyJ0XG
+HbHY35BbF33yr9kP76+zQFaiMyLDUnyQAU/0P+rm/I6Ts6q4OZwKK/tC5LD0SPDe
+08uAzkb4krRqxheo6seHdT7HjdDbKwADBgf/RGpQhhZc+F9o79S9aLV4XnY5CFev
+4EJvUqq6TF9V0rvZg148mbO/b8EtOfcBSdvAfo3H8w6wcC7X8Kt/6Pl69UZKuQOt
+354092gTrjJyg1uZBK9Ey/LSh0k+BNCfIw04+6W8ijARkpdoBrU3CwDKTyroWYkS
+FDkkzLvJRTkMpVpqyI0xIEExPXZTf67Abv1dzceTDciblLJfQcsfDyWYv8D12ELE
+zLYQnFM1s6yD6Q51Xk/XQ6MJ59bB3uuFO8VpkCMEvqIxZXsLjgqyQgo73y1qFizs
+KnFG+TTvooBdG3yqSt9OsLSoRrJkZbMX3PKpbT0ceWL8dULc1v2ol4fJGohMBBgR
+AgAMBQI+PnCyBQkDwmcAAAoJEDKNqGdFD4nsS44An14sFX5E2jJc87HFJeqPmeas
+hdayAKCCmOqjo0CW5uepN19pXdP7BujUOw==
+=ocE3
+-----END PGP PUBLIC KEY BLOCK-----
Added: packages/libmodule-signature-perl/branches/upstream/current/README
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/README 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/README 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,21 @@
+This is the README file for Module::Signature, a module to
+check and create SIGNATURE files for CPAN distributions.
+
+* Installation
+
+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
+
+* Copyright
+
+Copyright 2002, 2003, 2004 by Autrijus Tang <autrijus at autrijus.org>.
+
+All rights reserved. You can redistribute and/or modify
+this bundle under the same terms as Perl itself.
+
+See <http://www.perl.com/perl/misc/Artistic.html>.
Added: packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/SIGNATURE 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,50 @@
+This file contains message digests of all files listed in MANIFEST,
+signed via the Module::Signature module, version 0.42.
+
+To verify the content in this distribution, first make sure you have
+Module::Signature installed, then type:
+
+ % cpansign -v
+
+It will check each file's integrity, as well as the signature's
+validity. If "==> Signature verified OK! <==" is not displayed,
+the distribution may already have been compromised, and you should
+not run its Makefile.PL or Build.PL.
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+SHA1 6b29cb3b011d6dd95e512361c6b4ce2f5a8cdb17 AUTHORS
+SHA1 e3d33ad00ef3d1a151a20f2ca0259370198ed837 AUTRIJUS.pub
+SHA1 6a0fbc62cd2d6be73f90a8ba2fecd2f32724c9dd Changes
+SHA1 106e3d36e8ef72c765753635cd006df64d07a1fd MANIFEST
+SHA1 ad594608e587bf9c3c6a5c7fce7ad9901d7c7b8c META.yml
+SHA1 f75067726286d7d8d7f936f5d9747020ef8eccfe 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 ad7d30f2b8e7f62006bd64a64759049af0cd97bb t/0-signature.t
+SHA1 307a744384e704d94031df73233f24174b843bc8 t/1-basic.t
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.6 (FreeBSD)
+
+iD8DBQFBwTWMtLPdNzw1AaARAuN0AKCBz2vZwBGTOUADRYIiYHhLv7ZrNwCgjNJL
+O2odqvSr2ODE/plPnTjG4YM=
+=J63o
+-----END PGP SIGNATURE-----
Added: packages/libmodule-signature-perl/branches/upstream/current/TODO
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/TODO 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/TODO 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,3 @@
+
+- PKI.
+
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/AutoInstall.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/AutoInstall.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/ExtUtils/AutoInstall.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,646 @@
+#line 1 "inc/ExtUtils/AutoInstall.pm - /usr/local/lib/perl5/site_perl/5.8.5/ExtUtils/AutoInstall.pm"
+package ExtUtils::AutoInstall;
+$ExtUtils::AutoInstall::VERSION = '0.61';
+
+use strict;
+use Cwd ();
+use ExtUtils::MakeMaker ();
+
+#line 305
+
+# special map on pre-defined feature sets
+my %FeatureMap = (
+ '' => 'Core Features', # XXX: deprecated
+ '-core' => 'Core Features',
+);
+
+# various lexical flags
+my (@Missing, @Existing, %DisabledTests, $UnderCPAN, $HasCPANPLUS);
+my ($Config, $CheckOnly, $SkipInstall, $AcceptDefault, $TestOnly);
+my ($PostambleActions, $PostambleUsed);
+
+_accept_default(!-t STDIN); # see if it's a non-interactive session
+_init();
+
+sub _accept_default {
+ $AcceptDefault = shift;
+}
+
+sub missing_modules {
+ return @Missing;
+}
+
+sub do_install {
+ __PACKAGE__->install(
+ [ UNIVERSAL::isa($Config, 'HASH') ? %{$Config} : @{$Config}],
+ @Missing,
+ );
+}
+
+# initialize various flags, and/or perform install
+sub _init {
+ foreach my $arg (@ARGV, split(/[\s\t]+/, $ENV{PERL_EXTUTILS_AUTOINSTALL} || '')) {
+ if ($arg =~ /^--config=(.*)$/) {
+ $Config = [ split(',', $1) ];
+ }
+ elsif ($arg =~ /^--installdeps=(.*)$/) {
+ __PACKAGE__->install($Config, @Missing = split(/,/, $1));
+ exit 0;
+ }
+ elsif ($arg =~ /^--default(?:deps)?$/) {
+ $AcceptDefault = 1;
+ }
+ elsif ($arg =~ /^--check(?:deps)?$/) {
+ $CheckOnly = 1;
+ }
+ elsif ($arg =~ /^--skip(?:deps)?$/) {
+ $SkipInstall = 1;
+ }
+ elsif ($arg =~ /^--test(?:only)?$/) {
+ $TestOnly = 1;
+ }
+ }
+}
+
+# overrides MakeMaker's prompt() to automatically accept the default choice
+sub _prompt {
+ goto &ExtUtils::MakeMaker::prompt unless $AcceptDefault;
+
+ my ($prompt, $default) = @_;
+ my $y = ($default =~ /^[Yy]/);
+
+ print $prompt, ' [', ($y ? 'Y' : 'y'), '/', ($y ? 'n' : 'N'), '] ';
+ print "$default\n";
+ return $default;
+}
+
+# the workhorse
+sub import {
+ my $class = shift;
+ my @args = @_ or return;
+ my $core_all;
+
+ print "*** $class version ".$class->VERSION."\n";
+ print "*** Checking for dependencies...\n";
+
+ my $cwd = Cwd::cwd();
+
+ $Config = [];
+
+ my $maxlen = length((sort { length($b) <=> length($a) }
+ grep { /^[^\-]/ }
+ map { ref($_) ? keys %{ref($_) eq 'HASH' ? $_ : +{@{$_}}} : '' }
+ map { +{@args}->{$_} }
+ grep { /^[^\-]/ or /^-core$/i } keys %{+{@args}})[0]);
+
+ while (my ($feature, $modules) = splice(@args, 0, 2)) {
+ my (@required, @tests, @skiptests);
+ my $default = 1;
+ my $conflict = 0;
+
+ if ($feature =~ m/^-(\w+)$/) {
+ my $option = lc($1);
+
+ # check for a newer version of myself
+ _update_to($modules, @_) and return if $option eq 'version';
+
+ # sets CPAN configuration options
+ $Config = $modules if $option eq 'config';
+
+ # promote every features to core status
+ $core_all = ($modules =~ /^all$/i) and next
+ if $option eq 'core';
+
+ next unless $option eq 'core';
+ }
+
+ print "[".($FeatureMap{lc($feature)} || $feature)."]\n";
+
+ $modules = [ %{$modules} ] if UNIVERSAL::isa($modules, 'HASH');
+
+ unshift @$modules, -default => &{shift(@$modules)}
+ if (ref($modules->[0]) eq 'CODE'); # XXX: bugward combatability
+
+ while (my ($mod, $arg) = splice(@$modules, 0, 2)) {
+ if ($mod =~ m/^-(\w+)$/) {
+ my $option = lc($1);
+
+ $default = $arg if ($option eq 'default');
+ $conflict = $arg if ($option eq 'conflict');
+ @tests = @{$arg} if ($option eq 'tests');
+ @skiptests = @{$arg} if ($option eq 'skiptests');
+
+ next;
+ }
+
+ printf("- %-${maxlen}s ...", $mod);
+
+ # XXX: check for conflicts and uninstalls(!) them.
+ if (defined(my $cur = _version_check(_load($mod), $arg ||= 0))) {
+ print "loaded. ($cur".($arg ? " >= $arg" : '').")\n";
+ push @Existing, $mod => $arg;
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+ else {
+ print "missing." . ($arg ? " (would need $arg)" : '') . "\n";
+ push @required, $mod => $arg;
+ }
+ }
+
+ next unless @required;
+
+ my $mandatory = ($feature eq '-core' or $core_all);
+
+ if (!$SkipInstall and ($CheckOnly or _prompt(
+ qq{==> Auto-install the }. (@required / 2).
+ ($mandatory ? ' mandatory' : ' optional').
+ qq{ module(s) from CPAN?}, $default ? 'y' : 'n',
+ ) =~ /^[Yy]/)) {
+ push (@Missing, @required);
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+
+ elsif (!$SkipInstall and $default and $mandatory and _prompt(
+ qq{==> The module(s) are mandatory! Really skip?}, 'n',
+ ) =~ /^[Nn]/) {
+ push (@Missing, @required);
+ $DisabledTests{$_} = 1 for map { glob($_) } @skiptests;
+ }
+
+ else {
+ $DisabledTests{$_} = 1 for map { glob($_) } @tests;
+ }
+ }
+
+ _check_lock(); # check for $UnderCPAN
+
+ if (@Missing and not ($CheckOnly or $UnderCPAN)) {
+ require Config;
+ print "*** Dependencies will be installed the next time you type '$Config::Config{make}'.\n";
+ # make an educated guess of whether we'll need root permission.
+ print " (You may need to do that as the 'root' user.)\n" if eval '$>';
+ }
+ print "*** $class configuration finished.\n";
+
+ chdir $cwd;
+
+ # import to main::
+ no strict 'refs';
+ *{'main::WriteMakefile'} = \&Write if caller(0) eq 'main';
+}
+
+# CPAN.pm is non-reentrant, so check if we're under it and have no CPANPLUS
+sub _check_lock {
+ return unless @Missing;
+ return if _has_cpanplus();
+
+ require CPAN; CPAN::Config->load;
+ my $lock = MM->catfile($CPAN::Config->{cpan_home}, ".lock");
+
+ if (-f $lock and open(LOCK, $lock)
+ and ($^O eq 'MSWin32' ? _under_cpan() : <LOCK> == getppid())
+ and ($CPAN::Config->{prerequisites_policy} || '') ne 'ignore'
+ ) {
+ print << '.';
+
+*** Since we're running under CPAN, I'll just let it take care
+ of the dependency's installation later.
+.
+ $UnderCPAN = 1;
+ }
+
+ close LOCK;
+}
+
+sub install {
+ my $class = shift;
+
+ my $i; # used below to strip leading '-' from config keys
+ my @config = (map { s/^-// if ++$i; $_ } @{+shift});
+
+ my (@modules, @installed);
+ while (my ($pkg, $ver) = splice(@_, 0, 2)) {
+ # grep out those already installed
+ if (defined(_version_check(_load($pkg), $ver))) {
+ push @installed, $pkg;
+ }
+ else {
+ push @modules, $pkg, $ver;
+ }
+ }
+
+ return @installed unless @modules; # nothing to do
+
+ print "*** Installing dependencies...\n";
+
+ return unless _connected_to('cpan.org');
+
+ my %args = @config;
+ my %failed;
+ local *FAILED;
+ if ($args{do_once} and open(FAILED, '.#autoinstall.failed')) {
+ while (<FAILED>) { chomp; $failed{$_}++ }
+ close FAILED;
+
+ my @newmod;
+ while (my ($k, $v) = splice(@modules, 0, 2)) {
+ push @newmod, ($k => $v) unless $failed{$k};
+ }
+ @modules = @newmod;
+ }
+
+ if (_has_cpanplus()) {
+ _install_cpanplus(\@modules, \@config);
+ }
+ else {
+ _install_cpan(\@modules, \@config);
+ }
+
+ print "*** $class installation finished.\n";
+
+ # see if we have successfully installed them
+ while (my ($pkg, $ver) = splice(@modules, 0, 2)) {
+ if (defined(_version_check(_load($pkg), $ver))) {
+ push @installed, $pkg;
+ }
+ elsif ($args{do_once} and open(FAILED, '>> .#autoinstall.failed')) {
+ print FAILED "$pkg\n";
+ }
+ }
+
+ close FAILED if $args{do_once};
+
+ return @installed;
+}
+
+sub _install_cpanplus {
+ my @modules = @{+shift};
+ my @config = @{+shift};
+ my $installed = 0;
+
+ require CPANPLUS::Backend;
+ my $cp = CPANPLUS::Backend->new;
+ my $conf = $cp->configure_object;
+
+ return unless _can_write(
+ $conf->can('conf')
+ ? $conf->get_conf('base') # 0.05x+
+ : $conf->_get_build('base') # 0.04x
+ );
+
+ # if we're root, set UNINST=1 to avoid trouble unless user asked for it.
+ my $makeflags = $conf->get_conf('makeflags') || '';
+ if (UNIVERSAL::isa($makeflags, 'HASH')) {
+ # 0.03+ uses a hashref here
+ $makeflags->{UNINST} = 1 unless exists $makeflags->{UNINST};
+ }
+ else {
+ # 0.02 and below uses a scalar
+ $makeflags = join(' ', split(' ', $makeflags), 'UNINST=1')
+ if ($makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' });
+ }
+ $conf->set_conf(makeflags => $makeflags);
+ $conf->set_conf(prereqs => 1);
+
+ while (my ($key, $val) = splice(@config, 0, 2)) {
+ eval { $conf->set_conf($key, $val) };
+ }
+
+ my $modtree = $cp->module_tree;
+ while (my ($pkg, $ver) = splice(@modules, 0, 2)) {
+ print "*** Installing $pkg...\n";
+
+ MY::preinstall($pkg, $ver) or next if defined &MY::preinstall;
+
+ my $success;
+ my $obj = $modtree->{$pkg};
+
+ if ($obj and defined(_version_check($obj->{version}, $ver))) {
+ my $pathname = $pkg; $pathname =~ s/::/\\W/;
+
+ foreach my $inc (grep { m/$pathname.pm/i } keys(%INC)) {
+ delete $INC{$inc};
+ }
+
+ my $rv = $cp->install( modules => [ $obj->{module} ]);
+
+ if ($rv and ($rv->{$obj->{module}} or $rv->{ok})) {
+ print "*** $pkg successfully installed.\n";
+ $success = 1;
+ }
+ else {
+ print "*** $pkg installation cancelled.\n";
+ $success = 0;
+ }
+
+ $installed += $success;
+ }
+ else {
+ print << ".";
+*** Could not find a version $ver or above for $pkg; skipping.
+.
+ }
+
+ MY::postinstall($pkg, $ver, $success) if defined &MY::postinstall;
+ }
+
+ return $installed;
+}
+
+sub _install_cpan {
+ my @modules = @{+shift};
+ my @config = @{+shift};
+ my $installed = 0;
+ my %args;
+
+ require CPAN; CPAN::Config->load;
+
+ return unless _can_write(MM->catfile($CPAN::Config->{cpan_home}, 'sources'));
+
+ # if we're root, set UNINST=1 to avoid trouble unless user asked for it.
+ my $makeflags = $CPAN::Config->{make_install_arg} || '';
+ $CPAN::Config->{make_install_arg} = join(' ', split(' ', $makeflags), 'UNINST=1')
+ if ($makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' });
+
+ # don't show start-up info
+ $CPAN::Config->{inhibit_startup_message} = 1;
+
+ # set additional options
+ while (my ($opt, $arg) = splice(@config, 0, 2)) {
+ ($args{$opt} = $arg, next)
+ if $opt =~ /^force$/; # pseudo-option
+ $CPAN::Config->{$opt} = $arg;
+ }
+
+ local $CPAN::Config->{prerequisites_policy} = 'follow';
+
+ while (my ($pkg, $ver) = splice(@modules, 0, 2)) {
+ MY::preinstall($pkg, $ver) or next if defined &MY::preinstall;
+
+ print "*** Installing $pkg...\n";
+
+ my $obj = CPAN::Shell->expand(Module => $pkg);
+ my $success = 0;
+
+ if ($obj and defined(_version_check($obj->cpan_version, $ver))) {
+ my $pathname = $pkg; $pathname =~ s/::/\\W/;
+
+ foreach my $inc (grep { m/$pathname.pm/i } keys(%INC)) {
+ delete $INC{$inc};
+ }
+
+ $obj->force('install') if $args{force};
+
+ my $rv = $obj->install || eval {
+ $CPAN::META->instance(
+ 'CPAN::Distribution',
+ $obj->cpan_file,
+ )->{install} if $CPAN::META
+ };
+
+ if ($rv eq 'YES') {
+ print "*** $pkg successfully installed.\n";
+ $success = 1;
+ }
+ else {
+ print "*** $pkg installation failed.\n";
+ $success = 0;
+ }
+
+ $installed += $success;
+ }
+ else {
+ print << ".";
+*** Could not find a version $ver or above for $pkg; skipping.
+.
+ }
+
+ MY::postinstall($pkg, $ver, $success) if defined &MY::postinstall;
+ }
+
+ return $installed;
+}
+
+sub _has_cpanplus {
+ return (
+ $HasCPANPLUS = (
+ $INC{'CPANPLUS/Config.pm'} or
+ _load('CPANPLUS::Shell::Default')
+ )
+ );
+}
+
+# make guesses on whether we're under the CPAN installation directory
+sub _under_cpan {
+ require Cwd;
+ require File::Spec;
+
+ my $cwd = File::Spec->canonpath(Cwd::cwd());
+ my $cpan = File::Spec->canonpath($CPAN::Config->{cpan_home});
+
+ return (index($cwd, $cpan) > -1);
+}
+
+sub _update_to {
+ my $class = __PACKAGE__;
+ my $ver = shift;
+
+ return if defined(_version_check(_load($class), $ver)); # no need to upgrade
+
+ if (_prompt(
+ "==> A newer version of $class ($ver) is required. Install?", 'y'
+ ) =~ /^[Nn]/) {
+ die "*** Please install $class $ver manually.\n";
+ }
+
+ print << ".";
+*** Trying to fetch it from CPAN...
+.
+
+ # install ourselves
+ _load($class) and return $class->import(@_)
+ if $class->install([], $class, $ver);
+
+ print << '.'; exit 1;
+
+*** Cannot bootstrap myself. :-( Installation terminated.
+.
+}
+
+# check if we're connected to some host, using inet_aton
+sub _connected_to {
+ my $site = shift;
+
+ return (
+ ( _load('Socket') and Socket::inet_aton($site) ) or _prompt(qq(
+*** Your host cannot resolve the domain name '$site', which
+ probably means the Internet connections are unavailable.
+==> Should we try to install the required module(s) anyway?), 'n'
+ ) =~ /^[Yy]/
+ );
+}
+
+# check if a directory is writable; may create it on demand
+sub _can_write {
+ my $path = shift;
+ mkdir ($path, 0755) unless -e $path;
+
+ require Config;
+ return 1 if -w $path and -w $Config::Config{sitelib};
+
+ print << ".";
+*** You are not allowed to write to the directory '$path';
+ the installation may fail due to insufficient permissions.
+.
+
+ if (eval '$>' and lc(`sudo -V`) =~ /version/ and _prompt(qq(
+==> Should we try to re-execute the autoinstall process with 'sudo'?), 'y'
+ ) =~ /^[Yy]/) {
+ # try to bootstrap ourselves from sudo
+ print << ".";
+*** Trying to re-execute the autoinstall process with 'sudo'...
+.
+ my $missing = join(',', @Missing);
+ my $config = join(',',
+ UNIVERSAL::isa($Config, 'HASH') ? %{$Config} : @{$Config}
+ ) if $Config;
+
+ return unless system('sudo', $^X, $0, "--config=$config", "--installdeps=$missing");
+
+ print << ".";
+*** The 'sudo' command exited with error! Resuming...
+.
+ }
+
+ return _prompt(qq(
+==> Should we try to install the required module(s) anyway?), 'n'
+ ) =~ /^[Yy]/
+}
+
+# load a module and return the version it reports
+sub _load {
+ my $mod = pop; # class/instance doesn't matter
+ my $file = $mod;
+
+ $file =~ s|::|/|g;
+ $file .= '.pm';
+
+ local $@;
+ return eval { require $file; $mod->VERSION } || ($@ ? undef : 0);
+}
+
+# compare two versions, either use Sort::Versions or plain comparison
+sub _version_check {
+ my ($cur, $min) = @_;
+ return unless defined $cur;
+
+ $cur =~ s/\s+$//;
+
+ # check for version numbers that are not in decimal format
+ if (ref($cur) or ref($min) or $cur =~ /v|\..*\./ or $min =~ /v|\..*\./) {
+ if ($version::VERSION or defined(_load('version'))) {
+ # use version.pm if it is installed.
+ return ((version->new($cur) >= version->new($min)) ? $cur : undef);
+ }
+ elsif ($Sort::Versions::VERSION or defined(_load('Sort::Versions'))) {
+ # use Sort::Versions as the sorting algorithm for a.b.c versions
+ return ((Sort::Versions::versioncmp($cur, $min) != -1) ? $cur : undef);
+ }
+
+ warn "Cannot reliably compare non-decimal formatted versions.\n".
+ "Please install version.pm or Sort::Versions.\n";
+ }
+
+ # plain comparison
+ local $^W = 0; # shuts off 'not numeric' bugs
+ return ($cur >= $min ? $cur : undef);
+}
+
+# nothing; this usage is deprecated.
+sub main::PREREQ_PM { return {}; }
+
+sub _make_args {
+ my %args = @_;
+
+ $args{PREREQ_PM} = { %{$args{PREREQ_PM} || {} }, @Existing, @Missing }
+ if $UnderCPAN or $TestOnly;
+
+ if ($args{EXE_FILES}) {
+ require ExtUtils::Manifest;
+ my $manifest = ExtUtils::Manifest::maniread('MANIFEST');
+
+ $args{EXE_FILES} = [
+ grep { exists $manifest->{$_} } @{$args{EXE_FILES}}
+ ];
+ }
+
+ $args{test}{TESTS} ||= 't/*.t';
+ $args{test}{TESTS} = join(' ', grep {
+ !exists($DisabledTests{$_})
+ } map { glob($_) } split(/\s+/, $args{test}{TESTS}));
+
+ my $missing = join(',', @Missing);
+ my $config = join(',',
+ UNIVERSAL::isa($Config, 'HASH') ? %{$Config} : @{$Config}
+ ) if $Config;
+
+ $PostambleActions = (
+ $missing ? "\$(PERL) $0 --config=$config --installdeps=$missing"
+ : "\@\$(NOOP)"
+ );
+
+ return %args;
+}
+
+# a wrapper to ExtUtils::MakeMaker::WriteMakefile
+sub Write {
+ require Carp;
+ Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+
+ if ($CheckOnly) {
+ print << ".";
+*** Makefile not written in check-only mode.
+.
+ return;
+ }
+
+ my %args = _make_args(@_);
+
+ no strict 'refs';
+
+ $PostambleUsed = 0;
+ local *MY::postamble = \&postamble unless defined &MY::postamble;
+ ExtUtils::MakeMaker::WriteMakefile(%args);
+
+ print << "." unless $PostambleUsed;
+*** WARNING: Makefile written with customized MY::postamble() without
+ including contents from ExtUtils::AutoInstall::postamble() --
+ auto installation features disabled. Please contact the author.
+.
+
+ return 1;
+}
+
+sub postamble {
+ $PostambleUsed = 1;
+
+ return << ".";
+
+config :: installdeps
+\t\@\$(NOOP)
+
+checkdeps ::
+\t\$(PERL) $0 --checkdeps
+
+installdeps ::
+\t$PostambleActions
+
+.
+
+}
+
+1;
+
+__END__
+
+#line 970
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/AutoInstall.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,62 @@
+#line 1 "inc/Module/Install/AutoInstall.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/AutoInstall.pm"
+package Module::Install::AutoInstall;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+sub AutoInstall { $_[0] }
+
+sub run {
+ my $self = shift;
+ $self->auto_install_now(@_);
+}
+
+sub write {
+ my $self = shift;
+ $self->auto_install(@_);
+}
+
+sub auto_install {
+ 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);
+ }
+
+ ExtUtils::AutoInstall->import(
+ (@core ? (-core => \@core) : ()), @_, $self->features
+ );
+
+ $self->makemaker_args( ExtUtils::AutoInstall::_make_args() );
+
+ my $class = ref($self);
+ $self->postamble(
+ "# --- $class section:\n" .
+ ExtUtils::AutoInstall::postamble()
+ );
+}
+
+sub auto_install_now {
+ my $self = shift;
+ $self->auto_install;
+ ExtUtils::AutoInstall::do_install();
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Base.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,54 @@
+#line 1 "inc/Module/Install/Base.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Base.pm"
+package Module::Install::Base;
+
+#line 28
+
+sub new {
+ my ($class, %args) = @_;
+
+ foreach my $method (qw(call load)) {
+ *{"$class\::$method"} = sub {
+ +shift->_top->$method(@_);
+ } unless defined &{"$class\::$method"};
+ }
+
+ bless(\%args, $class);
+}
+
+#line 46
+
+sub AUTOLOAD {
+ my $self = shift;
+ goto &{$self->_top->autoload};
+}
+
+#line 57
+
+sub _top { $_[0]->{_top} }
+
+#line 68
+
+sub admin {
+ my $self = shift;
+ $self->_top->{admin} or Module::Install::Base::FakeAdmin->new;
+}
+
+sub is_admin {
+ my $self = shift;
+ $self->admin->VERSION;
+}
+
+sub DESTROY {}
+
+package Module::Install::Base::FakeAdmin;
+
+my $Fake;
+sub new { $Fake ||= bless(\@_, $_[0]) }
+sub AUTOLOAD {}
+sub DESTROY {}
+
+1;
+
+__END__
+
+#line 112
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Can.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,38 @@
+#line 1 "inc/Module/Install/Can.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Can.pm"
+package Module::Install::Can;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+$VERSION = '0.01';
+
+use strict;
+use Config ();
+use File::Spec ();
+use ExtUtils::MakeMaker ();
+
+# check if we can run some command
+sub can_run {
+ my ($self, $cmd) = @_;
+
+ my $_cmd = $cmd;
+ return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
+
+ for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
+ my $abs = File::Spec->catfile($dir, $_[1]);
+ return $abs if (-x $abs or $abs = MM->maybe_command($abs));
+ }
+
+ return;
+}
+
+sub can_cc {
+ my $self = shift;
+ my @chunks = split(/ /, $Config::Config{cc}) or return;
+
+ # $Config{cc} may contain args; try to find out the program part
+ while (@chunks) {
+ return $self->can_run("@chunks") || (pop(@chunks), next);
+ }
+
+ return;
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Fetch.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,86 @@
+#line 1 "inc/Module/Install/Fetch.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Fetch.pm"
+package Module::Install::Fetch;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+$VERSION = '0.01';
+
+sub get_file {
+ my ($self, %args) = @_;
+ my ($scheme, $host, $path, $file) =
+ $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
+
+ 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) =
+ $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
+ }
+
+ $|++;
+ print "Fetching '$file' from $host... ";
+
+ unless (eval { require Socket; Socket::inet_aton($host) }) {
+ warn "'$host' resolve failed!\n";
+ return;
+ }
+
+ return unless $scheme eq 'ftp' or $scheme eq 'http';
+
+ require Cwd;
+ my $dir = Cwd::getcwd();
+ chdir $args{local_dir} or return if exists $args{local_dir};
+
+ if (eval { require LWP::Simple; 1 }) {
+ LWP::Simple::mirror($args{url}, $file);
+ }
+ elsif (eval { require Net::FTP; 1 }) { eval {
+ # use Net::FTP to get past firewall
+ my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600);
+ $ftp->login("anonymous", 'anonymous at example.com');
+ $ftp->cwd($path);
+ $ftp->binary;
+ $ftp->get($file) or (warn("$!\n"), return);
+ $ftp->quit;
+ } }
+ elsif (my $ftp = $self->can_run('ftp')) { eval {
+ # no Net::FTP, fallback to ftp.exe
+ require FileHandle;
+ my $fh = FileHandle->new;
+
+ local $SIG{CHLD} = 'IGNORE';
+ unless ($fh->open("|$ftp -n")) {
+ warn "Couldn't open ftp: $!\n";
+ chdir $dir; return;
+ }
+
+ my @dialog = split(/\n/, << ".");
+open $host
+user anonymous anonymous\@example.com
+cd $path
+binary
+get $file $file
+quit
+.
+ foreach (@dialog) { $fh->print("$_\n") }
+ $fh->close;
+ } }
+ else {
+ warn "No working 'ftp' program available!\n";
+ chdir $dir; return;
+ }
+
+ unless (-f $file) {
+ warn "Fetching failed: $@\n";
+ chdir $dir; return;
+ }
+
+ return if exists $args{size} and -s $file != $args{size};
+ system($args{run}) if exists $args{run};
+ unlink($file) if $args{remove};
+
+ print(((!exists $args{check_for} or -e $args{check_for})
+ ? "done!" : "failed! ($!)"), "\n");
+ chdir $dir; return !$?;
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Include.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,10 @@
+#line 1 "inc/Module/Install/Include.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Include.pm"
+package Module::Install::Include;
+use Module::Install::Base; @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(@_) };
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Makefile.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,143 @@
+#line 1 "inc/Module/Install/Makefile.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Makefile.pm"
+package Module::Install::Makefile;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+$VERSION = '0.01';
+
+use strict 'vars';
+use vars '$VERSION';
+
+use ExtUtils::MakeMaker ();
+
+sub Makefile { $_[0] }
+
+sub prompt {
+ shift;
+ goto &ExtUtils::MakeMaker::prompt;
+}
+
+sub makemaker_args {
+ my $self = shift;
+ my $args = ($self->{makemaker_args} ||= {});
+ %$args = ( %$args, @_ ) if @_;
+ $args;
+}
+
+sub clean_files {
+ my $self = shift;
+ my $clean = $self->makemaker_args->{clean} ||= {};
+ %$clean = (
+ %$clean,
+ FILES => join(" ", grep length, $clean->{FILES}, @_),
+ );
+}
+
+sub libs {
+ my $self = shift;
+ my $libs = ref $_[0] ? shift : [shift];
+ $self->makemaker_args( LIBS => $libs );
+}
+
+sub inc {
+ my $self = shift;
+ $self->makemaker_args( INC => shift );
+}
+
+sub write {
+ my $self = shift;
+ die "&Makefile->write() takes no arguments\n" if @_;
+
+ my $args = $self->makemaker_args;
+
+ $args->{DISTNAME} = $self->name;
+ $args->{NAME} = $self->module_name || $self->name || $self->determine_NAME($args);
+ $args->{VERSION} = $self->version || $self->determine_VERSION($args);
+ $args->{NAME} =~ s/-/::/g;
+
+ if ($] >= 5.005) {
+ $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;
+ }
+ delete $args->{SIGN} unless $self->is_admin;
+
+ # merge both kinds of requires into prereq_pm
+ my $prereq = ($args->{PREREQ_PM} ||= {});
+ %$prereq = ( %$prereq, map { @$_ } map { @$_ } grep $_,
+ ($self->build_requires, $self->requires) );
+
+ # merge both kinds of requires into prereq_pm
+ my $dir = ($args->{DIR} ||= []);
+ if ($self->bundles) {
+ push @$dir, map "$_->[1]", @{$self->bundles};
+ delete $prereq->{$_->[0]} for @{$self->bundles};
+ }
+
+ if (my $perl_version = $self->perl_version) {
+ eval "use $perl_version; 1"
+ or die "ERROR: perl: Version $] is installed, ".
+ "but we need version >= $perl_version";
+ }
+
+ my %args = map {($_ => $args->{$_})} grep {defined($args->{$_})} keys %$args;
+
+ if ($self->admin->preop) {
+ $args{dist} = $self->admin->preop;
+ }
+
+ ExtUtils::MakeMaker::WriteMakefile(%args);
+
+ $self->fix_up_makefile();
+}
+
+sub fix_up_makefile {
+ my $self = shift;
+ my $top_class = ref($self->_top) || '';
+ my $top_version = $self->_top->VERSION || '';
+
+ my $preamble = $self->preamble
+ ? "# Preamble by $top_class $top_version\n" . $self->preamble
+ : '';
+ my $postamble = "# Postamble by $top_class $top_version\n" .
+ ($self->postamble || '');
+
+ open MAKEFILE, '< Makefile' or die $!;
+ my $makefile = do { local $/; <MAKEFILE> };
+ close MAKEFILE;
+
+ $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /;
+ $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g;
+ $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g;
+
+ $makefile =~ s/^(FULLPERL = .*)/$1 -Iinc/m;
+ $makefile =~ s/^(PERL = .*)/$1 -Iinc/m;
+
+ open MAKEFILE, '> Makefile' or die $!;
+ print MAKEFILE "$preamble$makefile$postamble";
+ close MAKEFILE;
+}
+
+sub preamble {
+ my ($self, $text) = @_;
+ $self->{preamble} = $text . $self->{preamble} if defined $text;
+ $self->{preamble};
+}
+
+sub postamble {
+ my ($self, $text) = @_;
+
+ $self->{postamble} ||= $self->admin->postamble;
+ $self->{postamble} .= $text if defined $text;
+ $self->{postamble}
+}
+
+1;
+
+__END__
+
+#line 273
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Metadata.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,187 @@
+#line 1 "inc/Module/Install/Metadata.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Metadata.pm"
+package Module::Install::Metadata;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+$VERSION = '0.04';
+
+use strict 'vars';
+use vars qw($VERSION);
+
+sub Meta { shift }
+
+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);
+
+foreach my $key (@scalar_keys) {
+ *$key = sub {
+ my $self = shift;
+ return $self->{'values'}{$key} unless @_;
+ $self->{'values'}{$key} = shift;
+ return $self;
+ };
+}
+
+foreach my $key (@tuple_keys) {
+ *$key = sub {
+ my $self = shift;
+ return $self->{'values'}{$key} unless @_;
+ my @rv;
+ while (@_) {
+ my $module = shift or last;
+ my $version = shift || 0;
+ 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;
+ push @rv, $rv;
+ }
+ return @rv;
+ };
+}
+
+sub features {
+ 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'}{'features'}};
+}
+
+sub no_index {
+ my $self = shift;
+ my $type = shift;
+ push @{$self->{'values'}{'no_index'}{$type}}, @_ if $type;
+ return $self->{'values'}{'no_index'};
+}
+
+sub _dump {
+ my $self = shift;
+ my $package = ref($self->_top);
+ my $version = $self->_top->VERSION;
+ my %values = %{$self->{'values'}};
+
+ 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}||[]},
+ ];
+ }
+
+ warn "No license specified, setting license = 'unknown'\n"
+ unless $values{license};
+
+ $values{license} ||= 'unknown';
+ $values{distribution_type} ||= 'module';
+ $values{name} ||= do {
+ my $name = $values{module_name};
+ $name =~ s/::/-/g;
+ $name;
+ } if $values{module_name};
+
+ if ($values{name} =~ /::/) {
+ my $name = $values{name};
+ $name =~ s/::/-/g;
+ die "Error in name(): '$values{name}' should be '$name'!\n";
+ }
+
+ 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";
+ }
+ }
+
+ 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});
+ }
+ else {
+ $dump .= << "META";
+no_index:
+ directory:
+ - inc
+META
+ }
+
+ $dump .= "generated_by: $package version $version\n";
+ return $dump;
+}
+
+sub read {
+ my $self = shift;
+ $self->include_deps( 'YAML', 0 );
+ require YAML;
+ 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 );
+ }
+ }
+ else {
+ $self->$key( $value );
+ }
+ }
+ return $self;
+}
+
+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;
+ return $self;
+}
+
+sub version_from {
+ my ($self, $version_from) = @_;
+ require ExtUtils::MM_Unix;
+ $self->version(ExtUtils::MM_Unix->parse_version($version_from));
+}
+
+sub abstract_from {
+ my ($self, $abstract_from) = @_;
+ require ExtUtils::MM_Unix;
+ $self->abstract(
+ bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix')
+ ->parse_abstract($abstract_from)
+ );
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Scripts.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,43 @@
+#line 1 "inc/Module/Install/Scripts.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Scripts.pm"
+package Module::Install::Scripts;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+$VERSION = '0.02';
+use strict;
+use File::Basename ();
+
+sub prompt_script {
+ my ($self, $script_file) = @_;
+ my ($prompt, $abstract, $default);
+
+ foreach my $line ( $self->_read_script($script_file) ) {
+ last unless $line =~ /^#/;
+ $prompt = $1 if $line =~ /^#\s*prompt:\s+(.*)/;
+ $default = $1 if $line =~ /^#\s*default:\s+(.*)/;
+ $abstract = $1 if $line =~ /^#\s*abstract:\s+(.*)/;
+ }
+ unless (defined $prompt) {
+ my $script_name = File::Basename::basename($script_file);
+ $prompt = "Do you want to install '$script_name'";
+ $prompt .= " ($abstract)" if defined $abstract;
+ $prompt .= '?';
+ }
+ return unless $self->prompt($prompt, ($default || 'n')) =~ /^[Yy]/;
+ $self->install_script($script_file);
+}
+
+sub install_script {
+ my $self = shift;
+ my $args = $self->makemaker_args;
+ my $exe_files = $args->{EXE_FILES} ||= [];
+ push @$exe_files, @_;
+}
+
+sub _read_script {
+ my ($self, $script_file) = @_;
+ local *SCRIPT;
+ open SCRIPT, $script_file
+ or die "Can't open '$script_file' for input: $!\n";
+ return <SCRIPT>;
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/Win32.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,63 @@
+#line 1 "inc/Module/Install/Win32.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/Win32.pm"
+package Module::Install::Win32;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+$VERSION = '0.02';
+
+use strict;
+
+# determine if the user needs nmake, and download it if needed
+sub check_nmake {
+ my $self = shift;
+ $self->load('can_run');
+ $self->load('get_file');
+
+ require Config;
+ return unless (
+ $Config::Config{make} and
+ $Config::Config{make} =~ /^nmake\b/i and
+ $^O eq 'MSWin32' and
+ !$self->can_run('nmake')
+ );
+
+ print "The required 'nmake' executable not found, fetching it...\n";
+
+ require File::Basename;
+ my $rv = $self->get_file(
+ url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe',
+ ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe',
+ local_dir => File::Basename::dirname($^X),
+ size => 51928,
+ run => 'Nmake15.exe /o > nul',
+ check_for => 'Nmake.exe',
+ remove => 1,
+ );
+
+ if (!$rv) {
+ die << '.';
+
+-------------------------------------------------------------------------------
+
+Since you are using Microsoft Windows, you will need the 'nmake' utility
+before installation. It's available at:
+
+ http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe
+ or
+ ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe
+
+Please download the file manually, save it to a directory in %PATH% (e.g.
+C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to
+that directory, and run "Nmake15.exe" from there; that will create the
+'nmake.exe' file needed by this module.
+
+You may then resume the installation process described in README.
+
+-------------------------------------------------------------------------------
+.
+ }
+}
+
+1;
+
+__END__
+
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install/WriteAll.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,36 @@
+#line 1 "inc/Module/Install/WriteAll.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install/WriteAll.pm"
+package Module::Install::WriteAll;
+use Module::Install::Base; @ISA = qw(Module::Install::Base);
+
+sub WriteAll {
+ my $self = shift;
+ my %args = (
+ meta => 1,
+ sign => 0,
+ inline => 0,
+ check_nmake => 1,
+ @_
+ );
+
+ $self->sign(1) if $args{sign};
+ $self->Meta->write if $args{meta};
+ $self->admin->WriteAll(%args) if $self->is_admin;
+
+ if ($0 =~ /Build.PL$/i) {
+ $self->Build->write;
+ }
+ else {
+ $self->check_nmake if $args{check_nmake};
+ $self->makemaker_args( PL_FILES => {} )
+ unless $self->makemaker_args->{'PL_FILES'};
+
+ if ($args{inline}) {
+ $self->Inline->write;
+ }
+ else {
+ $self->Makefile->write;
+ }
+ }
+}
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Module/Install.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,169 @@
+#line 1 "inc/Module/Install.pm - /usr/local/lib/perl5/site_perl/5.8.5/Module/Install.pm"
+package Module::Install;
+$VERSION = '0.36';
+
+die << "." unless $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'};
+Please invoke ${\__PACKAGE__} with:
+
+ use inc::${\__PACKAGE__};
+
+not:
+
+ use ${\__PACKAGE__};
+
+.
+
+use strict 'vars';
+use Cwd ();
+use File::Find ();
+use File::Path ();
+
+ at inc::Module::Install::ISA = 'Module::Install';
+*inc::Module::Install::VERSION = *VERSION;
+
+#line 129
+
+sub import {
+ my $class = shift;
+ my $self = $class->new(@_);
+
+ if (not -f $self->{file}) {
+ require "$self->{path}/$self->{dispatch}.pm";
+ File::Path::mkpath("$self->{prefix}/$self->{author}");
+ $self->{admin} =
+ "$self->{name}::$self->{dispatch}"->new(_top => $self);
+ $self->{admin}->init;
+ @_ = ($class, _self => $self);
+ goto &{"$self->{name}::import"};
+ }
+
+ *{caller(0) . "::AUTOLOAD"} = $self->autoload;
+
+ # Unregister loader and worker packages so subdirs can use them again
+ delete $INC{"$self->{file}"};
+ delete $INC{"$self->{path}.pm"};
+}
+
+#line 156
+
+sub autoload {
+ my $self = shift;
+ my $caller = caller;
+
+ my $cwd = Cwd::cwd();
+ my $sym = "$caller\::AUTOLOAD";
+
+ $sym->{$cwd} = sub {
+ my $pwd = Cwd::cwd();
+ if (my $code = $sym->{$pwd}) {
+ goto &$code unless $cwd eq $pwd; # delegate back to parent dirs
+ }
+ $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller";
+ unshift @_, ($self, $1);
+ goto &{$self->can('call')} unless uc($1) eq $1;
+ };
+}
+
+#line 181
+
+sub new {
+ my ($class, %args) = @_;
+
+ return $args{_self} if $args{_self};
+
+ $args{dispatch} ||= 'Admin';
+ $args{prefix} ||= 'inc';
+ $args{author} ||= '.author';
+ $args{bundle} ||= 'inc/BUNDLES';
+
+ $class =~ s/^\Q$args{prefix}\E:://;
+ $args{name} ||= $class;
+ $args{version} ||= $class->VERSION;
+
+ unless ($args{path}) {
+ $args{path} = $args{name};
+ $args{path} =~ s!::!/!g;
+ }
+ $args{file} ||= "$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;
+
+ unshift @_, $obj;
+ goto &{$obj->can($method)};
+}
+
+#line 225
+
+sub load {
+ my ($self, $method) = @_;
+
+ $self->load_extensions(
+ "$self->{prefix}/$self->{path}", $self
+ ) unless $self->{extensions};
+
+ foreach my $obj (@{$self->{extensions}}) {
+ return $obj if $obj->can($method);
+ }
+
+ my $admin = $self->{admin} or die << "END";
+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
+
+ my $obj = $admin->load($method, 1);
+ push @{$self->{extensions}}, $obj;
+
+ $obj;
+}
+
+#line 255
+
+sub load_extensions {
+ my ($self, $path, $top_obj) = @_;
+
+ unshift @INC, $self->{prefix}
+ unless grep { $_ eq $self->{prefix} } @INC;
+
+ local @INC = ($path, @INC);
+ foreach my $rv ($self->find_extensions($path)) {
+ my ($file, $pkg) = @{$rv};
+ next if $self->{pathnames}{$pkg};
+
+ eval { require $file; 1 } or (warn($@), next);
+ $self->{pathnames}{$pkg} = delete $INC{$file};
+ push @{$self->{extensions}}, $pkg->new( _top => $top_obj );
+ }
+}
+
+#line 279
+
+sub find_extensions {
+ my ($self, $path) = @_;
+ my @found;
+
+ 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;
+
+ @found;
+}
+
+1;
+
+__END__
+
+#line 617
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Test/Builder.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,867 @@
+#line 1 "inc/Test/Builder.pm - /usr/local/lib/perl5/site_perl/5.8.6/Test/Builder.pm"
+package Test::Builder;
+
+use 5.004;
+
+# $^C was only introduced in 5.005-ish. We do this to prevent
+# use of uninitialized value warnings in older perls.
+$^C ||= 0;
+
+use strict;
+use vars qw($VERSION $CLASS);
+$VERSION = '0.17';
+$CLASS = __PACKAGE__;
+
+my $IsVMS = $^O eq 'VMS';
+
+# Make Test::Builder thread-safe for ithreads.
+BEGIN {
+ use Config;
+ if( $] >= 5.008 && $Config{useithreads} ) {
+ require threads;
+ require threads::shared;
+ threads::shared->import;
+ }
+ else {
+ *share = sub { 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 94
+
+my $Test;
+sub new {
+ my($class) = shift;
+ $Test ||= bless ['Move along, nothing to see here'], $class;
+ return $Test;
+}
+
+#line 120
+
+my $Exported_To;
+sub exported_to {
+ my($self, $pack) = @_;
+
+ if( defined $pack ) {
+ $Exported_To = $pack;
+ }
+ return $Exported_To;
+}
+
+#line 143
+
+sub plan {
+ my($self, $cmd, $arg) = @_;
+
+ return unless $cmd;
+
+ if( $Have_Plan ) {
+ die sprintf "You tried to plan twice! Second plan at %s line %d\n",
+ ($self->caller)[1,2];
+ }
+
+ if( $cmd eq 'no_plan' ) {
+ $self->no_plan;
+ }
+ elsif( $cmd eq 'skip_all' ) {
+ return $self->skip_all($arg);
+ }
+ elsif( $cmd eq 'tests' ) {
+ if( $arg ) {
+ return $self->expected_tests($arg);
+ }
+ elsif( !defined $arg ) {
+ die "Got an undefined number of tests. Looks like you tried to ".
+ "say how many tests you plan to run but made a mistake.\n";
+ }
+ elsif( !$arg ) {
+ die "You said to run 0 tests! You've got to run something.\n";
+ }
+ }
+ else {
+ require Carp;
+ my @args = grep { defined } ($cmd, $arg);
+ Carp::croak("plan() doesn't understand @args");
+ }
+
+ return 1;
+}
+
+#line 190
+
+my $Expected_Tests = 0;
+sub expected_tests {
+ my($self, $max) = @_;
+
+ if( defined $max ) {
+ $Expected_Tests = $max;
+ $Have_Plan = 1;
+
+ $self->_print("1..$max\n") unless $self->no_header;
+ }
+ return $Expected_Tests;
+}
+
+
+#line 212
+
+my($No_Plan) = 0;
+sub no_plan {
+ $No_Plan = 1;
+ $Have_Plan = 1;
+}
+
+#line 226
+
+sub has_plan {
+ return($Expected_Tests) if $Expected_Tests;
+ return('no_plan') if $No_Plan;
+ return(undef);
+};
+
+
+#line 242
+
+my $Skip_All = 0;
+sub skip_all {
+ my($self, $reason) = @_;
+
+ my $out = "1..0";
+ $out .= " # Skip $reason" if $reason;
+ $out .= "\n";
+
+ $Skip_All = 1;
+
+ $self->_print($out) unless $self->no_header;
+ exit(0);
+}
+
+#line 276
+
+sub ok {
+ my($self, $test, $name) = @_;
+
+ # $test might contain an object which we don't want to accidentally
+ # store, so we turn it into a boolean.
+ $test = $test ? 1 : 0;
+
+ unless( $Have_Plan ) {
+ require Carp;
+ Carp::croak("You tried to run a test without a plan! Gotta have a plan.");
+ }
+
+ lock $Curr_Test;
+ $Curr_Test++;
+
+ $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.
+ERR
+
+ my($pack, $file, $line) = $self->caller;
+
+ my $todo = $self->todo($pack);
+
+ my $out;
+ my $result = {};
+ share($result);
+
+ unless( $test ) {
+ $out .= "not ";
+ @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
+ }
+ else {
+ @$result{ 'ok', 'actual_ok' } = ( 1, $test );
+ }
+
+ $out .= "ok";
+ $out .= " $Curr_Test" if $self->use_numbers;
+
+ if( defined $name ) {
+ $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness.
+ $out .= " - $name";
+ $result->{name} = $name;
+ }
+ else {
+ $result->{name} = '';
+ }
+
+ if( $todo ) {
+ my $what_todo = $todo;
+ $out .= " # TODO $what_todo";
+ $result->{reason} = $what_todo;
+ $result->{type} = 'todo';
+ }
+ else {
+ $result->{reason} = '';
+ $result->{type} = '';
+ }
+
+ $Test_Results[$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");
+ }
+
+ return $test ? 1 : 0;
+}
+
+#line 364
+
+sub is_eq {
+ my($self, $got, $expect, $name) = @_;
+ local $Level = $Level + 1;
+
+ if( !defined $got || !defined $expect ) {
+ # undef only matches undef and nothing else
+ my $test = !defined $got && !defined $expect;
+
+ $self->ok($test, $name);
+ $self->_is_diag($got, 'eq', $expect) unless $test;
+ return $test;
+ }
+
+ return $self->cmp_ok($got, 'eq', $expect, $name);
+}
+
+sub is_num {
+ my($self, $got, $expect, $name) = @_;
+ local $Level = $Level + 1;
+
+ if( !defined $got || !defined $expect ) {
+ # undef only matches undef and nothing else
+ my $test = !defined $got && !defined $expect;
+
+ $self->ok($test, $name);
+ $self->_is_diag($got, '==', $expect) unless $test;
+ return $test;
+ }
+
+ return $self->cmp_ok($got, '==', $expect, $name);
+}
+
+sub _is_diag {
+ my($self, $got, $type, $expect) = @_;
+
+ foreach my $val (\$got, \$expect) {
+ if( defined $$val ) {
+ if( $type eq 'eq' ) {
+ # quote and force string context
+ $$val = "'$$val'"
+ }
+ else {
+ # force numeric context
+ $$val = $$val+0;
+ }
+ }
+ else {
+ $$val = 'undef';
+ }
+ }
+
+ return $self->diag(sprintf <<DIAGNOSTIC, $got, $expect);
+ got: %s
+ expected: %s
+DIAGNOSTIC
+
+}
+
+#line 438
+
+sub isnt_eq {
+ my($self, $got, $dont_expect, $name) = @_;
+ local $Level = $Level + 1;
+
+ if( !defined $got || !defined $dont_expect ) {
+ # undef only matches undef and nothing else
+ my $test = defined $got || defined $dont_expect;
+
+ $self->ok($test, $name);
+ $self->_cmp_diag('ne', $got, $dont_expect) unless $test;
+ return $test;
+ }
+
+ return $self->cmp_ok($got, 'ne', $dont_expect, $name);
+}
+
+sub isnt_num {
+ my($self, $got, $dont_expect, $name) = @_;
+ local $Level = $Level + 1;
+
+ if( !defined $got || !defined $dont_expect ) {
+ # undef only matches undef and nothing else
+ my $test = defined $got || defined $dont_expect;
+
+ $self->ok($test, $name);
+ $self->_cmp_diag('!=', $got, $dont_expect) unless $test;
+ return $test;
+ }
+
+ return $self->cmp_ok($got, '!=', $dont_expect, $name);
+}
+
+
+#line 490
+
+sub like {
+ my($self, $this, $regex, $name) = @_;
+
+ local $Level = $Level + 1;
+ $self->_regex_ok($this, $regex, '=~', $name);
+}
+
+sub unlike {
+ my($self, $this, $regex, $name) = @_;
+
+ local $Level = $Level + 1;
+ $self->_regex_ok($this, $regex, '!~', $name);
+}
+
+#line 531
+
+
+sub maybe_regex {
+ my ($self, $regex) = @_;
+ my $usable_regex = undef;
+ if( ref $regex eq 'Regexp' ) {
+ $usable_regex = $regex;
+ }
+ # Check if it looks like '/foo/'
+ elsif( my($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx ) {
+ $usable_regex = length $opts ? "(?$opts)$re" : $re;
+ };
+ 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) {
+ $ok = $self->ok( 0, $name );
+ $self->diag(" '$regex' doesn't look much like a regex to me.");
+ return $ok;
+ }
+
+ {
+ local $^W = 0;
+ my $test = $this =~ /$usable_regex/ ? 1 : 0;
+ $test = !$test if $cmp eq '!~';
+ $ok = $self->ok( $test, $name );
+ }
+
+ unless( $ok ) {
+ $this = defined $this ? "'$this'" : 'undef';
+ my $match = $cmp eq '=~' ? "doesn't match" : "matches";
+ $self->diag(sprintf <<DIAGNOSTIC, $this, $match, $regex);
+ %s
+ %13s '%s'
+DIAGNOSTIC
+
+ }
+
+ return $ok;
+}
+
+#line 588
+
+sub cmp_ok {
+ my($self, $got, $type, $expect, $name) = @_;
+
+ my $test;
+ {
+ local $^W = 0;
+ local($@,$!); # don't interfere with $@
+ # eval() sometimes resets $!
+ $test = eval "\$got $type \$expect";
+ }
+ local $Level = $Level + 1;
+ my $ok = $self->ok($test, $name);
+
+ unless( $ok ) {
+ if( $type =~ /^(eq|==)$/ ) {
+ $self->_is_diag($got, $type, $expect);
+ }
+ else {
+ $self->_cmp_diag($got, $type, $expect);
+ }
+ }
+ return $ok;
+}
+
+sub _cmp_diag {
+ my($self, $got, $type, $expect) = @_;
+
+ $got = defined $got ? "'$got'" : 'undef';
+ $expect = defined $expect ? "'$expect'" : 'undef';
+ return $self->diag(sprintf <<DIAGNOSTIC, $got, $type, $expect);
+ %s
+ %s
+ %s
+DIAGNOSTIC
+}
+
+#line 636
+
+sub BAILOUT {
+ my($self, $reason) = @_;
+
+ $self->_print("Bail out! $reason");
+ exit 255;
+}
+
+#line 652
+
+sub skip {
+ my($self, $why) = @_;
+ $why ||= '';
+
+ unless( $Have_Plan ) {
+ require Carp;
+ Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
+ }
+
+ lock($Curr_Test);
+ $Curr_Test++;
+
+ my %result;
+ share(%result);
+ %result = (
+ '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";
+
+ $Test->_print($out);
+
+ return 1;
+}
+
+
+#line 697
+
+sub todo_skip {
+ my($self, $why) = @_;
+ $why ||= '';
+
+ unless( $Have_Plan ) {
+ require Carp;
+ Carp::croak("You tried to run tests without a plan! Gotta have a plan.");
+ }
+
+ lock($Curr_Test);
+ $Curr_Test++;
+
+ my %result;
+ share(%result);
+ %result = (
+ '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 .= " # TODO & SKIP $why\n";
+
+ $Test->_print($out);
+
+ return 1;
+}
+
+
+#line 772
+
+sub level {
+ my($self, $level) = @_;
+
+ if( defined $level ) {
+ $Level = $level;
+ }
+ return $Level;
+}
+
+$CLASS->level(1);
+
+
+#line 809
+
+my $Use_Nums = 1;
+sub use_numbers {
+ my($self, $use_nums) = @_;
+
+ if( defined $use_nums ) {
+ $Use_Nums = $use_nums;
+ }
+ return $Use_Nums;
+}
+
+#line 836
+
+my($No_Header, $No_Ending) = (0,0);
+sub no_header {
+ my($self, $no_header) = @_;
+
+ if( defined $no_header ) {
+ $No_Header = $no_header;
+ }
+ return $No_Header;
+}
+
+sub no_ending {
+ my($self, $no_ending) = @_;
+
+ if( defined $no_ending ) {
+ $No_Ending = $no_ending;
+ }
+ return $No_Ending;
+}
+
+
+#line 891
+
+sub diag {
+ my($self, @msgs) = @_;
+ return unless @msgs;
+
+ # Prevent printing headers when compiling (i.e. -c)
+ return if $^C;
+
+ # Escape each line with a #.
+ foreach (@msgs) {
+ $_ = 'undef' unless defined;
+ s/^/# /gms;
+ }
+
+ push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
+
+ local $Level = $Level + 1;
+ my $fh = $self->todo ? $self->todo_output : $self->failure_output;
+ local($\, $", $,) = (undef, ' ', '');
+ print $fh @msgs;
+
+ return 0;
+}
+
+#line 926
+
+sub _print {
+ my($self, @msgs) = @_;
+
+ # Prevent printing headers when only compiling. Mostly for when
+ # tests are deparsed with B::Deparse
+ return if $^C;
+
+ 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;
+ }
+
+ push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/;
+
+ print $fh @msgs;
+}
+
+
+#line 977
+
+my($Out_FH, $Fail_FH, $Todo_FH);
+sub output {
+ my($self, $fh) = @_;
+
+ if( defined $fh ) {
+ $Out_FH = _new_fh($fh);
+ }
+ return $Out_FH;
+}
+
+sub failure_output {
+ my($self, $fh) = @_;
+
+ if( defined $fh ) {
+ $Fail_FH = _new_fh($fh);
+ }
+ return $Fail_FH;
+}
+
+sub todo_output {
+ my($self, $fh) = @_;
+
+ if( defined $fh ) {
+ $Todo_FH = _new_fh($fh);
+ }
+ return $Todo_FH;
+}
+
+sub _new_fh {
+ my($file_or_fh) = shift;
+
+ my $fh;
+ unless( UNIVERSAL::isa($file_or_fh, 'GLOB') ) {
+ $fh = do { local *FH };
+ open $fh, ">$file_or_fh" or
+ die "Can't open test output log $file_or_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: $!";
+
+ # Set everything to unbuffered else plain prints to STDOUT will
+ # come out in the wrong order from our own prints.
+ _autoflush(\*TESTOUT);
+ _autoflush(\*STDOUT);
+ _autoflush(\*TESTERR);
+ _autoflush(\*STDERR);
+
+ $CLASS->output(\*TESTOUT);
+ $CLASS->failure_output(\*TESTERR);
+ $CLASS->todo_output(\*TESTOUT);
+}
+
+sub _autoflush {
+ my($fh) = shift;
+ my $old_fh = select $fh;
+ $| = 1;
+ select $old_fh;
+}
+
+
+#line 1065
+
+sub current_test {
+ my($self, $num) = @_;
+
+ lock($Curr_Test);
+ if( defined $num ) {
+ unless( $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;
+ 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;
+ }
+ }
+ }
+ return $Curr_Test;
+}
+
+
+#line 1106
+
+sub summary {
+ my($self) = shift;
+
+ return map { $_->{'ok'} } @Test_Results;
+}
+
+#line 1161
+
+sub details {
+ return @Test_Results;
+}
+
+#line 1185
+
+sub todo {
+ my($self, $pack) = @_;
+
+ $pack = $pack || $self->exported_to || $self->caller(1);
+
+ no strict 'refs';
+ return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
+ : 0;
+}
+
+#line 1205
+
+sub caller {
+ my($self, $height) = @_;
+ $height ||= 0;
+
+ my @caller = CORE::caller($self->level + $height + 1);
+ return wantarray ? @caller : $caller[0];
+}
+
+#line 1217
+
+#line 1231
+
+#'#
+sub _sanity_check {
+ _whoa($Curr_Test < 0, 'Says here you ran a negative number of tests!');
+ _whoa(!$Have_Plan and $Curr_Test,
+ 'Somehow your tests ran without a plan!');
+ _whoa($Curr_Test != @Test_Results,
+ 'Somehow you got a different number of results than tests ran!');
+}
+
+#line 1250
+
+sub _whoa {
+ my($check, $desc) = @_;
+ if( $check ) {
+ die <<WHOA;
+WHOA! $desc
+This should never happen! Please contact the author immediately!
+WHOA
+ }
+}
+
+#line 1271
+
+sub _my_exit {
+ $? = $_[0];
+
+ return 1;
+}
+
+
+#line 1284
+
+$SIG{__DIE__} = sub {
+ # We don't want to muck with death in an eval, but $^S isn't
+ # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing
+ # with it. Instead, we use caller. This also means it runs under
+ # 5.004!
+ my $in_eval = 0;
+ for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) {
+ $in_eval = 1 if $sub =~ /^\(eval\)/;
+ }
+ $Test_Died = 1 unless $in_eval;
+};
+
+sub _ending {
+ my $self = shift;
+
+ _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 != $$;
+
+ # 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 ) {
+ # The plan? We have no plan.
+ if( $No_Plan ) {
+ $self->_print("1..$Curr_Test\n") unless $self->no_header;
+ $Expected_Tests = $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];
+ }
+
+ my $num_failed = grep !$_->{'ok'}, @Test_Results[0..$Expected_Tests-1];
+ $num_failed += abs($Expected_Tests - @Test_Results);
+
+ if( $Curr_Test < $Expected_Tests ) {
+ $self->diag(<<"FAIL");
+Looks like you planned $Expected_Tests tests but only ran $Curr_Test.
+FAIL
+ }
+ elsif( $Curr_Test > $Expected_Tests ) {
+ my $num_extra = $Curr_Test - $Expected_Tests;
+ $self->diag(<<"FAIL");
+Looks like you planned $Expected_Tests tests but ran $num_extra extra.
+FAIL
+ }
+ elsif ( $num_failed ) {
+ $self->diag(<<"FAIL");
+Looks like you failed $num_failed tests of $Expected_Tests.
+FAIL
+ }
+
+ if( $Test_Died ) {
+ $self->diag(<<"FAIL");
+Looks like your test died just after $Curr_Test.
+FAIL
+
+ _my_exit( 255 ) && return;
+ }
+
+ _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return;
+ }
+ elsif ( $Skip_All ) {
+ _my_exit( 0 ) && return;
+ }
+ elsif ( $Test_Died ) {
+ $self->diag(<<'FAIL');
+Looks like your test died before it could output anything.
+FAIL
+ }
+ else {
+ $self->diag("No tests run!\n");
+ _my_exit( 255 ) && return;
+ }
+}
+
+END {
+ $Test->_ending if defined $Test and !$Test->no_ending;
+}
+
+#line 1407
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/inc/Test/More.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,500 @@
+#line 1 "inc/Test/More.pm - /usr/local/lib/perl5/site_perl/5.8.6/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
+# even though the module being used forgot to use Carp. Yes, this
+# actually happened.
+sub _carp {
+ my($file, $line) = (caller(1))[1,2];
+ warn @_, " at $file line $line\n";
+}
+
+
+
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO);
+$VERSION = '0.47';
+ at ISA = qw(Exporter);
+ at EXPORT = qw(ok use_ok require_ok
+ is isnt like unlike is_deeply
+ cmp_ok
+ skip todo todo_skip
+ pass fail
+ eq_array eq_hash eq_set
+ $TODO
+ plan
+ can_ok isa_ok
+ diag
+ );
+
+my $Test = Test::Builder->new;
+
+
+# 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, @_);
+}
+
+
+#line 172
+
+sub plan {
+ my(@plan) = @_;
+
+ my $caller = caller;
+
+ $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;
+ }
+ }
+
+ $Test->plan(@plan);
+
+ __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports);
+}
+
+sub import {
+ my($class) = shift;
+ goto &plan;
+}
+
+
+#line 266
+
+sub ok ($;$) {
+ my($test, $name) = @_;
+ $Test->ok($test, $name);
+}
+
+#line 330
+
+sub is ($$;$) {
+ $Test->is_eq(@_);
+}
+
+sub isnt ($$;$) {
+ $Test->isnt_eq(@_);
+}
+
+*isn't = \&isnt;
+
+
+#line 371
+
+sub like ($$;$) {
+ $Test->like(@_);
+}
+
+
+#line 385
+
+sub unlike {
+ $Test->unlike(@_);
+}
+
+
+#line 423
+
+sub cmp_ok($$$;$) {
+ $Test->cmp_ok(@_);
+}
+
+
+#line 457
+
+sub can_ok ($@) {
+ my($proto, @methods) = @_;
+ my $class = ref $proto || $proto;
+
+ unless( @methods ) {
+ my $ok = $Test->ok( 0, "$class->can(...)" );
+ $Test->diag(' can_ok() called with no methods');
+ return $ok;
+ }
+
+ my @nok = ();
+ foreach my $method (@methods) {
+ local($!, $@); # don't interfere with caller's $@
+ # eval sometimes resets $!
+ eval { $proto->can($method) } || push @nok, $method;
+ }
+
+ my $name;
+ $name = @methods == 1 ? "$class->can('$methods[0]')"
+ : "$class->can(...)";
+
+ my $ok = $Test->ok( !@nok, $name );
+
+ $Test->diag(map " $class->can('$_') failed\n", @nok);
+
+ return $ok;
+}
+
+#line 514
+
+sub isa_ok ($$;$) {
+ my($object, $class, $obj_name) = @_;
+
+ my $diag;
+ $obj_name = 'The object' unless defined $obj_name;
+ my $name = "$obj_name isa $class";
+ if( !defined $object ) {
+ $diag = "$obj_name isn't defined";
+ }
+ elsif( !ref $object ) {
+ $diag = "$obj_name isn't a reference";
+ }
+ else {
+ # We can't use UNIVERSAL::isa because we want to honor isa() overrides
+ local($@, $!); # eval sometimes resets $!
+ my $rslt = eval { $object->isa($class) };
+ if( $@ ) {
+ if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) {
+ if( !UNIVERSAL::isa($object, $class) ) {
+ my $ref = ref $object;
+ $diag = "$obj_name isn't a '$class' it's a '$ref'";
+ }
+ } else {
+ die <<WHOA;
+WHOA! I tried to call ->isa on your object and got some weird error.
+This should never happen. Please contact the author immediately.
+Here's the error.
+$@
+WHOA
+ }
+ }
+ elsif( !$rslt ) {
+ my $ref = ref $object;
+ $diag = "$obj_name isn't a '$class' it's a '$ref'";
+ }
+ }
+
+
+
+ my $ok;
+ if( $diag ) {
+ $ok = $Test->ok( 0, $name );
+ $Test->diag(" $diag\n");
+ }
+ else {
+ $ok = $Test->ok( 1, $name );
+ }
+
+ return $ok;
+}
+
+
+#line 583
+
+sub pass (;$) {
+ $Test->ok(1, @_);
+}
+
+sub fail (;$) {
+ $Test->ok(0, @_);
+}
+
+#line 627
+
+sub diag {
+ $Test->diag(@_);
+}
+
+
+#line 677
+
+sub use_ok ($;@) {
+ my($module, @imports) = @_;
+ @imports = () unless @imports;
+
+ my $pack = caller;
+
+ local($@,$!); # eval sometimes interferes with $!
+ eval <<USE;
+package $pack;
+require $module;
+'$module'->import(\@imports);
+USE
+
+ my $ok = $Test->ok( !$@, "use $module;" );
+
+ unless( $ok ) {
+ chomp $@;
+ $Test->diag(<<DIAGNOSTIC);
+ Tried to use '$module'.
+ Error: $@
+DIAGNOSTIC
+
+ }
+
+ return $ok;
+}
+
+#line 712
+
+sub require_ok ($) {
+ my($module) = shift;
+
+ my $pack = caller;
+
+ local($!, $@); # eval sometimes interferes with $!
+ eval <<REQUIRE;
+package $pack;
+require $module;
+REQUIRE
+
+ my $ok = $Test->ok( !$@, "require $module;" );
+
+ unless( $ok ) {
+ chomp $@;
+ $Test->diag(<<DIAGNOSTIC);
+ Tried to require '$module'.
+ Error: $@
+DIAGNOSTIC
+
+ }
+
+ return $ok;
+}
+
+#line 796
+
+#'#
+sub skip {
+ my($why, $how_many) = @_;
+
+ 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;
+}
+
+
+#line 874
+
+sub todo_skip {
+ my($why, $how_many) = @_;
+
+ 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;
+ }
+
+ for( 1..$how_many ) {
+ $Test->todo_skip($why);
+ }
+
+ local $^W = 0;
+ last TODO;
+}
+
+#line 933
+
+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);
+ }
+ else {
+ local @Data_Stack = ();
+ if( _deep_check($this, $that) ) {
+ $ok = $Test->ok(1, $name);
+ }
+ else {
+ $ok = $Test->ok(0, $name);
+ $ok = $Test->diag(_format_stack(@Data_Stack));
+ }
+ }
+
+ return $ok;
+}
+
+sub _format_stack {
+ my(@Stack) = @_;
+
+ my $var = '$FOO';
+ my $did_arrow = 0;
+ foreach my $entry (@Stack) {
+ my $type = $entry->{type} || '';
+ my $idx = $entry->{'idx'};
+ if( $type eq 'HASH' ) {
+ $var .= "->" unless $did_arrow++;
+ $var .= "{$idx}";
+ }
+ elsif( $type eq 'ARRAY' ) {
+ $var .= "->" unless $did_arrow++;
+ $var .= "[$idx]";
+ }
+ elsif( $type eq 'REF' ) {
+ $var = "\${$var}";
+ }
+ }
+
+ my @vals = @{$Stack[-1]{vals}}[0,1];
+ my @vars = ();
+ ($vars[0] = $var) =~ s/\$FOO/ \$got/;
+ ($vars[1] = $var) =~ s/\$FOO/\$expected/;
+
+ 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'";
+ }
+
+ $out .= "$vars[0] = $vals[0]\n";
+ $out .= "$vars[1] = $vals[1]\n";
+
+ $out =~ s/^/ /msg;
+ return $out;
+}
+
+
+#line 1007
+
+#'#
+sub eq_array {
+ my($a1, $a2) = @_;
+ return 1 if $a1 eq $a2;
+
+ my $ok = 1;
+ my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
+ for (0..$max) {
+ my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
+ my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
+
+ push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] };
+ $ok = _deep_check($e1,$e2);
+ pop @Data_Stack if $ok;
+
+ last unless $ok;
+ }
+ return $ok;
+}
+
+sub _deep_check {
+ my($e1, $e2) = @_;
+ my $ok = 0;
+
+ my $eq;
+ {
+ # Quiet uninitialized value warnings when comparing undefs.
+ local $^W = 0;
+
+ if( $e1 eq $e2 ) {
+ $ok = 1;
+ }
+ else {
+ if( UNIVERSAL::isa($e1, 'ARRAY') and
+ UNIVERSAL::isa($e2, 'ARRAY') )
+ {
+ $ok = eq_array($e1, $e2);
+ }
+ elsif( UNIVERSAL::isa($e1, 'HASH') and
+ UNIVERSAL::isa($e2, 'HASH') )
+ {
+ $ok = eq_hash($e1, $e2);
+ }
+ elsif( UNIVERSAL::isa($e1, 'REF') and
+ UNIVERSAL::isa($e2, 'REF') )
+ {
+ push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
+ $ok = _deep_check($$e1, $$e2);
+ pop @Data_Stack if $ok;
+ }
+ elsif( UNIVERSAL::isa($e1, 'SCALAR') and
+ UNIVERSAL::isa($e2, 'SCALAR') )
+ {
+ push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
+ $ok = _deep_check($$e1, $$e2);
+ }
+ else {
+ push @Data_Stack, { vals => [$e1, $e2] };
+ $ok = 0;
+ }
+ }
+ }
+
+ return $ok;
+}
+
+
+#line 1083
+
+sub eq_hash {
+ my($a1, $a2) = @_;
+ return 1 if $a1 eq $a2;
+
+ my $ok = 1;
+ my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
+ foreach my $k (keys %$bigger) {
+ my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
+ my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
+
+ push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] };
+ $ok = _deep_check($e1, $e2);
+ pop @Data_Stack if $ok;
+
+ last unless $ok;
+ }
+
+ return $ok;
+}
+
+#line 1116
+
+# 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] );
+}
+
+#line 1154
+
+sub builder {
+ return Test::Builder->new;
+}
+
+#line 1247
+
+1;
Added: packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/lib/Module/Signature.pm 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,828 @@
+package Module::Signature;
+$Module::Signature::VERSION = '0.44';
+
+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 SIGNATURE_OK => 0;
+use constant SIGNATURE_MISSING => -1;
+use constant SIGNATURE_MALFORMED => -2;
+use constant SIGNATURE_BAD => -3;
+use constant SIGNATURE_MISMATCH => -4;
+use constant MANIFEST_MISMATCH => -5;
+use constant CIPHER_UNKNOWN => -6;
+
+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';
+
+$SIGNATURE = 'SIGNATURE';
+$Timeout = $ENV{MODULE_SIGNATURE_TIMEOUT} || 3;
+$Verbose = $ENV{MODULE_SIGNATURE_VERBOSE} || 0;
+$KeyServer = $ENV{MODULE_SIGNATURE_KEYSERVER} || 'pgp.mit.edu';
+$KeyServerPort = $ENV{MODULE_SIGNATURE_KEYSERVERPORT} || '11371';
+$Cipher = 'SHA1';
+$Preamble = << ".";
+This file contains message digests of all files listed in MANIFEST,
+signed via the Module::Signature module, version $VERSION.
+
+To verify the content in this distribution, first make sure you have
+Module::Signature installed, then type:
+
+ % cpansign -v
+
+It will check each file's integrity, as well as the signature's
+validity. If "==> Signature verified OK! <==" is not displayed,
+the distribution may already have been compromised, and you should
+not run its Makefile.PL or Build.PL.
+
+.
+
+$AutoKeyRetrieve = 1;
+$CanKeyRetrieve = undef;
+
+=head1 NAME
+
+Module::Signature - Module signature file manipulation
+
+=head1 VERSION
+
+This document describes version 0.44 of B<Module::Signature>,
+released December 16, 2004.
+
+=head1 SYNOPSIS
+
+As a shell command:
+
+ % cpansign # verify an existing SIGNATURE, or
+ # make a new one if none exists
+
+ % cpansign sign # make signature; overwrites existing one
+ % cpansign -s # same thing
+
+ % cpansign verify # verify a signature
+ % cpansign -v # same thing
+ % cpansign -v --skip # ignore files in MANIFEST.SKIP
+
+ % cpansign help # display this documentation
+ % cpansign -h # same thing
+
+In programs:
+
+ use Module::Signature qw(sign verify SIGNATURE_OK);
+ sign();
+ sign(overwrite => 1); # overwrites without asking
+
+ # see the CONSTANTS section below
+ (verify() == SIGNATURE_OK) or die "failed!";
+
+=head1 DESCRIPTION
+
+B<Module::Signature> adds cryptographic authentications to CPAN
+distributions, via the special F<SIGNATURE> file.
+
+If you are a module user, all you have to do is to remember to run
+C<cpansign -v> (or just C<cpansign>) before issuing C<perl Makefile.PL>
+or C<perl Build.PL>; that will ensure the distribution has not been
+tampered with.
+
+For module authors, you'd want to add the F<SIGNATURE> file to your
+F<MANIFEST>, then type C<cpansign -s> before making a distribution.
+You may also want to consider adding this code as F<t/0-signature.t>:
+
+ #!/usr/bin/perl
+ use strict;
+ print "1..1\n";
+
+ if (!-s 'SIGNATURE') {
+ print "ok 1 # skip No signature file found\n";
+ }
+ elsif (!eval { require Module::Signature; 1 }) {
+ print "ok 1 # skip ",
+ "Next time around, consider install Module::Signature, ",
+ "so you can verify the integrity of this distribution.\n";
+ }
+ elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
+ print "ok 1 # skip Cannot connect to the keyserver\n";
+ }
+ else {
+ (Module::Signature::verify() == Module::Signature::SIGNATURE_OK())
+ or print "not ";
+ print "ok 1 # Valid signature\n";
+ }
+
+ __END__
+
+Note that you'd want to keep your F<SIGNATURE> file at 0 bytes (or
+missing altogether) during development, so C<make test> would not fail;
+that file should only be generated during the C<make dist> time; see
+L</NOTES> for how to do it automatically.
+
+If you are already using B<Test::More> for testing, a more
+straightforward version of F<t/0-signature.t> can be found in the
+B<Module::Signature> distribution.
+
+Also, if you prefer a more full-fledged testing package, and are
+willing to inflict the dependency of B<Module::Build> on your users,
+Iain Truskett's B<Test::Signature> might be a better choice.
+
+Please also see L</NOTES> about F<MANIFEST.SKIP> issues, especially if
+you are using B<Module::Build> or writing your own F<MANIFEST.SKIP>.
+
+=head1 VARIABLES
+
+No package variables are exported by default.
+
+=over 4
+
+=item $Verbose
+
+If true, Module::Signature will give information during processing including
+gpg output. If false, Module::Signature will be as quiet as possible as
+long as everything is working ok. Defaults to false.
+
+=item $SIGNATURE
+
+The filename for a distribution's signature file. Defaults to
+C<SIGNATURE>.
+
+=item $KeyServer
+
+The OpenPGP key server for fetching the author's public key
+(currently only implemented on C<gpg>, not C<Crypt::OpenPGP>).
+May be set to a false value to prevent this module from
+fetching public keys.
+
+=item $KeyServerPort
+
+The OpenPGP key server port, defaults to C<11371>.
+
+=item $Timeout
+
+Maximum time to wait to try to establish a link to the key server.
+Defaults to C<3>.
+
+=item $AutoKeyRetrieve
+
+Whether to automatically fetch unknown keys from the key server.
+Defaults to C<1>.
+
+=item $Cipher
+
+The default cipher used by the C<Digest> module to make signature
+files. Defaults to C<SHA1>, but may be changed to other ciphers
+if the SHA1 cipher is undesirable for the user.
+
+The cipher specified in the F<SIGNATURE> file's first entry will
+be used to validate its integrity. For C<SHA1>, the user needs
+to have any one of these four modules installed: B<Digest::SHA>,
+B<Digest::SHA1>, B<Digest::SHA::PurePerl>, or (currently nonexistent)
+B<Digest::SHA1::PurePerl>.
+
+=item $Preamble
+
+The explanatory text written to newly generated F<SIGNATURE> files
+before the actual entries.
+
+=back
+
+=head1 ENVIRONMENT
+
+B<Module::Signature> honors these environment variables:
+
+=over 4
+
+=item MODULE_SIGNATURE_VERBOSE
+
+Works like $Verbose.
+
+=item MODULE_SIGNATURE_KEYSERVER
+
+Works like $KeyServer.
+
+=item MODULE_SIGNATURE_KEYSERVERPORT
+
+Works like $KeyServerPort.
+
+=item MODULE_SIGNATURE_TIMEOUT
+
+Works like $Timeout.
+
+=back
+
+=head1 CONSTANTS
+
+These constants are not exported by default.
+
+=over 4
+
+=item CANNOT_VERIFY (C<0E0>)
+
+Cannot verify the OpenPGP signature, maybe due to the lack of a network
+connection to the key server, or if neither gnupg nor Crypt::OpenPGP
+exists on the system.
+
+=item SIGNATURE_OK (C<0>)
+
+Signature successfully verified.
+
+=item SIGNATURE_MISSING (C<-1>)
+
+The F<SIGNATURE> file does not exist.
+
+=item SIGNATURE_MALFORMED (C<-2>)
+
+The signature file does not contains a valid OpenPGP message.
+
+=item SIGNATURE_BAD (C<-3>)
+
+Invalid signature detected -- it might have been tampered with.
+
+=item SIGNATURE_MISMATCH (C<-4>)
+
+The signature is valid, but files in the distribution have changed
+since its creation.
+
+=item MANIFEST_MISMATCH (C<-5>)
+
+There are extra files in the current directory not specified by
+the MANIFEST file.
+
+=item CIPHER_UNKNOWN (C<-6>)
+
+The cipher used by the signature file is not recognized by the
+C<Digest> and C<Digest::*> modules.
+
+=back
+
+=head1 NOTES
+
+=head2 Signing your module as part of C<make dist>
+
+B<Module::Install> users should simply do this:
+
+ WriteAll( sign => 1 );
+
+For B<ExtUtils::MakeMaker> (version 6.18 or above), you may do this:
+
+ WriteMakefile(
+ (MM->can('signature_target') ? (SIGN => 1) : ()),
+ # ... original arguments ...
+ );
+
+Users of B<Module::Build> may do this:
+
+ Module::Build->new(
+ (sign => 1),
+ # ... original arguments ...
+ )->create_build_script;
+
+=head2 F<MANIFEST.SKIP> Considerations
+
+(The following section is lifted from Iain Truskett's B<Test::Signature>
+module, under the Perl license. Thanks, Iain!)
+
+It is B<imperative> that your F<MANIFEST> and F<MANIFEST.SKIP> files be
+accurate and complete. If you are using C<ExtUtils::MakeMaker> and you
+do not have a F<MANIFEST.SKIP> file, then don't worry about the rest of
+this. If you do have a F<MANIFEST.SKIP> file, or you use
+C<Module::Build>, you must read this.
+
+Since the test is run at C<make test> time, the distribution has been
+made. Thus your F<MANIFEST.SKIP> file should have the entries listed
+below.
+
+If you're using C<ExtUtils::MakeMaker>, you should have, at least:
+
+ #defaults
+ ^Makefile$
+ ^blib/
+ ^pm_to_blib
+ ^blibdirs
+
+These entries are part of the default set provided by
+C<ExtUtils::Manifest>, which is ignored if you provide your own
+F<MANIFEST.SKIP> file.
+
+If you are using C<Module::Build>, you should have two extra entries:
+
+ ^Build$
+ ^_build/
+
+If you don't have the correct entries, C<Module::Signature> will
+complain that you have:
+
+ ==> MISMATCHED content between MANIFEST and distribution files! <==
+
+You should note this during normal development testing anyway.
+
+=cut
+
+sub verify {
+ my %args = ( skip => 1, @_ );
+ my $rv;
+
+ (-r $SIGNATURE) or do {
+ warn "==> MISSING Signature file! <==\n";
+ return SIGNATURE_MISSING;
+ };
+
+ (my $sigtext = _read_sigfile($SIGNATURE)) or do {
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
+ };
+
+ (my ($cipher) = ($sigtext =~ /^(\w+) /)) or do {
+ warn "==> MALFORMED Signature file! <==\n";
+ return SIGNATURE_MALFORMED;
+ };
+
+ (defined(my $plaintext = _mkdigest($cipher))) or do {
+ warn "==> UNKNOWN Cipher format! <==\n";
+ return CIPHER_UNKNOWN;
+ };
+
+ $rv = _verify($SIGNATURE, $sigtext, $plaintext);
+
+ if ($rv == SIGNATURE_OK) {
+ 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;
+ }
+ }
+ elsif ($rv == SIGNATURE_BAD) {
+ warn "==> BAD/TAMPERED signature detected! <==\n";
+ }
+ elsif ($rv == SIGNATURE_MISMATCH) {
+ warn "==> MISMATCHED content between SIGNATURE and distribution files! <==\n";
+ }
+
+ return $rv;
+}
+
+sub _verify {
+ my $signature = shift || $SIGNATURE;
+ my $sigtext = shift || '';
+ my $plaintext = shift || '';
+
+ local $SIGNATURE = $signature if $signature ne $SIGNATURE;
+
+ if ($AutoKeyRetrieve and !$CanKeyRetrieve) {
+ 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;
+ }
+
+ if (my $version = _has_gpg()) {
+ return _verify_gpg($sigtext, $plaintext, $version);
+ }
+ elsif (eval {require Crypt::OpenPGP; 1}) {
+ 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);
+ }
+}
+
+sub _has_gpg {
+ `gpg --version` =~ /GnuPG.*?(\S+)$/m or return;
+ return $1;
+}
+
+sub _fullcheck {
+ my $skip = shift;
+ my @extra;
+
+ local $^W;
+ local $ExtUtils::Manifest::Quiet = 1;
+
+ my($mani, $file);
+ if( _legacy_extutils() ) {
+ 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;
+ } };
+
+ ($mani, $file) = ExtUtils::Manifest::fullcheck();
+ }
+ else {
+ ($mani, $file) = ExtUtils::Manifest::fullcheck();
+ }
+
+ foreach my $makefile ('Makefile', 'Build') {
+ warn "==> SKIPPED CHECKING '$_'!" .
+ (-e "$_.PL" && " (run $_.PL to ensure its integrity)") .
+ " <===\n" for grep $_ eq $makefile, @extra;
+ }
+
+ @{$mani} = grep {$_ ne 'SIGNATURE'} @{$mani};
+
+ warn "Not in MANIFEST: $_\n" for @{$file};
+ warn "No such file: $_\n" for @{$mani};
+
+ return ($mani, $file);
+}
+
+sub _legacy_extutils {
+ # ExtUtils::Manifest older than 1.41 does not handle default skips well.
+ return (ExtUtils::Manifest->VERSION < 1.41);
+}
+
+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 /^\.#/;
+}
+
+sub _verify_gpg {
+ my ($sigtext, $plaintext, $version) = @_;
+
+ local $SIGNATURE = Win32::GetShortPathName($SIGNATURE)
+ 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
+ );
+
+ my $output = '';
+ if( $Verbose ) {
+ warn "Executing @cmd\n";
+ system @cmd;
+ }
+ else {
+ my $cmd = join ' ', @cmd;
+ $output = `$cmd`;
+ }
+
+ if( $? ) {
+ print STDERR $output;
+ }
+ elsif ($output =~ /((?: +[\dA-F]{4}){10,})/) {
+ warn "WARNING: This key is not certified with a trusted signature!\n";
+ warn "Primary key fingerprint:$1\n";
+ }
+
+ return SIGNATURE_BAD if ($? and $AutoKeyRetrieve);
+ return _compare($sigtext, $plaintext, (!$?) ? SIGNATURE_OK : CANNOT_VERIFY);
+}
+
+sub _keyserver {
+ my $version = shift;
+ my $scheme = "x-hkp";
+ $scheme = "hkp" if $version ge "1.2.0";
+
+ return "$scheme://$KeyServer:$KeyServerPort";
+}
+
+sub _verify_crypt_openpgp {
+ my ($sigtext, $plaintext) = @_;
+
+ require Crypt::OpenPGP;
+ my $pgp = Crypt::OpenPGP->new(
+ ($KeyServer) ? ( KeyServer => $KeyServer, AutoKeyRetrieve => $AutoKeyRetrieve ) : (),
+ );
+ my $rv = $pgp->handle( Filename => $SIGNATURE )
+ 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;
+ }
+ else {
+ warn "Cannot verify signature; public key not found\n";
+ }
+
+ return _compare($sigtext, $plaintext, $rv->{Validity} ? SIGNATURE_OK : CANNOT_VERIFY);
+}
+
+sub _read_sigfile {
+ my $sigfile = shift;
+ my $signature = '';
+ my $well_formed;
+
+ local *D;
+ open D, $sigfile or die "Could not open $sigfile: $!";
+ while (<D>) {
+ next if (1 .. /^-----BEGIN PGP SIGNED MESSAGE-----/);
+ last if /^-----BEGIN PGP SIGNATURE/;
+
+ $signature .= $_;
+ }
+
+ return ((split(/\n+/, $signature, 2))[1]);
+}
+
+sub _compare {
+ my ($str1, $str2, $ok) = @_;
+
+ # normalize all linebreaks
+ $str1 =~ s/[^\S ]+/\n/; $str2 =~ s/[^\S ]+/\n/;
+
+ 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" } );
+ }
+ 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;
+ }
+
+ return SIGNATURE_MISMATCH;
+}
+
+sub sign {
+ my %args = ( skip => 1, @_ );
+ my $overwrite = $args{overwrite};
+ my $plaintext = _mkdigest();
+
+ 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";
+ }
+
+ if (!$overwrite and -e $SIGNATURE and -t STDIN) {
+ local $/ = "\n";
+ print "$SIGNATURE already exists; overwrite [y/N]? ";
+ return unless <STDIN> =~ /[Yy]/;
+ }
+
+ if (my $version = _has_gpg()) {
+ _sign_gpg($SIGNATURE, $plaintext, $version);
+ }
+ elsif (eval {require Crypt::OpenPGP; 1}) {
+ _sign_crypt_openpgp($SIGNATURE, $plaintext);
+ }
+ else {
+ die "Cannot use GnuPG or Crypt::OpenPGP, please install either one first!";
+ }
+
+ warn "==> SIGNATURE file created successfully. <==\n";
+ return SIGNATURE_OK;
+}
+
+sub _sign_gpg {
+ my ($sigfile, $plaintext, $version) = @_;
+
+ die "Could not write to $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: $!";
+ print D $plaintext;
+ close D;
+
+ (-e "$sigfile.tmp" and -s "$sigfile.tmp") or do {
+ 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: $!";
+ };
+
+ print S $Preamble;
+ print S <D>;
+
+ close S;
+ close D;
+
+ unlink("$sigfile.tmp");
+
+ my $key_id;
+ my $key_name;
+ # This doesn't work because the output from verify goes to STDERR.
+ # If I try to redirect it using "--logger-fd 1" it just hangs.
+ # WTF?
+ my @verify = `gpg --batch --verify $SIGNATURE`;
+ while (@verify) {
+ if (/key ID ([0-9A-F]+)$/) {
+ $key_id = $1;
+ } elsif (/signature from "(.+)"$/) {
+ $key_name = $1;
+ }
+ }
+
+ my $found_name;
+ my $found_key;
+ if (defined $key_id && defined $key_name) {
+ my $keyserver = _keyserver($version);
+ while (`gpg --batch --keyserver=$keyserver --search-keys '$key_name'`) {
+ if (/^\(\d+\)/) {
+ $found_name = 0;
+ } elsif ($found_name) {
+ if (/key \Q$key_id\E/) {
+ $found_key = 1;
+ last;
+ }
+ }
+
+ if (/\Q$key_name\E/) {
+ $found_name = 1;
+ next;
+ }
+ }
+
+ unless ($found_key) {
+ _warn_non_public_signature($key_name);
+ }
+ }
+
+ return 1;
+}
+
+sub _sign_crypt_openpgp {
+ my ($sigfile, $plaintext) = @_;
+
+ require Crypt::OpenPGP;
+ my $pgp = Crypt::OpenPGP->new;
+ my $ring = Crypt::OpenPGP::KeyRing->new(
+ 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);
+
+ 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,
+ ) or die $pgp->errstr;
+
+
+ local *D;
+ open D, ">$sigfile" or die "Could not write to $sigfile: $!";
+ print D $Preamble;
+ print D $signature;
+ close D;
+
+ require Crypt::OpenPGP::KeyServer;
+ my $server = Crypt::OpenPGP::KeyServer->new(Server => $KeyServer);
+
+ unless ($server->find_keyblock_by_keyid($cert->key_id)) {
+ _warn_non_public_signature($uid);
+ }
+
+ return 1;
+}
+
+sub _warn_non_public_signature {
+ my $uid = shift;
+
+ warn <<"EOF"
+You have signed this distribution with a key ($uid) that cannot be
+found on the public key server at $KeyServer.
+
+This will probably cause signature verification to fail if your module
+is distributed on CPAN.
+EOF
+}
+
+sub _mkdigest {
+ my $digest = _mkdigest_files(undef, @_) or return;
+ my $plaintext = '';
+
+ foreach my $file (sort keys %$digest) {
+ next if $file eq $SIGNATURE;
+ $plaintext .= "@{$digest->{$file}} $file\n";
+ }
+
+ return $plaintext;
+}
+
+sub _mkdigest_files {
+ my $p = shift;
+ my $algorithm = shift || $Cipher;
+ my $dosnames = (defined(&Dos::UseLFN) && Dos::UseLFN()==0);
+ my $read = ExtUtils::Manifest::maniread() || {};
+ 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)
+ } || eval {
+ 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)
+ } || eval {
+ 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");
+ } and return } or do {
+ 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;
+ }
+ 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;
+ }
+ }
+
+ return \%digest;
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+L<Digest>, L<Digest::SHA>, L<Digest::SHA1>, L<Digest::SHA::PurePerl>
+
+L<ExtUtils::Manifest>, L<Crypt::OpenPGP>, L<Test::Signature>
+
+=head1 AUTHORS
+
+Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002, 2003, 2004 by Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>.
+
+Parts of the documentation are copyrighted by Iain Truskett, 2002.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
Added: packages/libmodule-signature-perl/branches/upstream/current/script/cpansign
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/script/cpansign 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/script/cpansign 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,95 @@
+#!/usr/bin/perl
+
+$VERSION = '0.06';
+
+=head1 NAME
+
+cpansign - CPAN signature management utility
+
+=head1 SYNOPSIS
+
+ % cpansign # verify an existing SIGNATURE, or
+ # make a new one if none exists
+
+ % cpansign file.par # verify or sign a PAR file
+
+ % 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
+
+=head1 DESCRIPTION
+
+This utility lets you create and verify SIGNATURE files.
+
+=cut
+
+use strict;
+use Module::Signature;
+
+$Module::Signature::Verbose = 1;
+
+my %cmd = (
+ s => 'sign',
+ v => 'verify',
+ h => 'help',
+);
+
+my $op = $ARGV[0]; $op =~ s/^--?// if defined $op;
+my $dwim;
+if (!$op or $op eq 'skip' or -e $op) {
+ $op = (-e 'SIGNATURE' ? 'verify' : 'sign');
+ $dwim = 1;
+}
+
+my $cmd = $cmd{substr($op, 0, 1)};
+(system("perldoc $0"), exit) if $cmd eq 'help';
+my @args;
+push @args, (overwrite => '1') if $cmd eq 'sign';
+push @args, (skip => '0') unless grep /^-?-?skip/, @ARGV;
+
+if (my $sub = Module::Signature->can($cmd)) {
+ if (@ARGV and -e $ARGV[-1]) {
+ require PAR::Dist;
+ PAR::Dist::_verify_or_sign(
+ dist => $ARGV[-1],
+ $dwim ? () : (action => $cmd, @args)
+ );
+ }
+ else {
+ #if ($cmd eq 'sign') {
+ # exit unless Module::Signature::verify();
+ #}
+ exit($sub->(@args));
+ }
+}
+else {
+ die "Unknown command: '$op'.\n".
+ "Available actions: " . (join(', ', sort values %cmd)) . ".\n";
+}
+
+exit;
+
+=head1 SEE ALSO
+
+L<Module::Signature>
+
+=head1 AUTHORS
+
+Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002, 2003 by Autrijus Tang E<lt>autrijus at autrijus.orgE<gt>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
Added: packages/libmodule-signature-perl/branches/upstream/current/t/0-signature.t
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/t/0-signature.t 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/t/0-signature.t 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More;
+
+if (!eval { require Module::Signature; 1 }) {
+ plan skip_all =>
+ "Next time around, consider installing Module::Signature, ".
+ "so you can verify the integrity of this distribution.";
+}
+elsif ( !-e 'SIGNATURE' ) {
+ plan skip_all => "SIGNATURE not found";
+}
+elsif ( -s 'SIGNATURE' == 0 ) {
+ plan skip_all => "SIGNATURE file empty";
+}
+elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
+ plan skip_all => "Cannot connect to the keyserver to check module ".
+ "signature";
+}
+else {
+ plan tests => 1;
+}
+
+my $ret = Module::Signature::verify();
+SKIP: {
+ skip "Module::Signature cannot verify", 1
+ if $ret eq Module::Signature::CANNOT_VERIFY();
+
+ cmp_ok $ret, '==', Module::Signature::SIGNATURE_OK(), "Valid signature";
+}
Added: packages/libmodule-signature-perl/branches/upstream/current/t/1-basic.t
===================================================================
--- packages/libmodule-signature-perl/branches/upstream/current/t/1-basic.t 2006-03-15 14:10:18 UTC (rev 2352)
+++ packages/libmodule-signature-perl/branches/upstream/current/t/1-basic.t 2006-03-15 16:14:26 UTC (rev 2353)
@@ -0,0 +1,10 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 2;
+
+use_ok('Module::Signature');
+Module::Signature->import('SIGNATURE_OK');
+ok(defined(&SIGNATURE_OK), 'constant exported');
+
+__END__
More information about the Pkg-perl-cvs-commits
mailing list