summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-07-21 13:23:57 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-07-21 13:23:57 +0000
commita276db189a656a4cc5881a2ebc4cad3113685030 (patch)
tree27aeb24e5ddbd94b313aa661a8de133ff9c751f2
downloadFile-Which-tarball-a276db189a656a4cc5881a2ebc4cad3113685030.tar.gz
-rw-r--r--Changes116
-rw-r--r--INSTALL43
-rw-r--r--LICENSE379
-rw-r--r--MANIFEST36
-rw-r--r--META.json51
-rw-r--r--META.yml26
-rw-r--r--Makefile.PL52
-rw-r--r--README179
-rw-r--r--cpanfile11
-rw-r--r--dist.ini29
-rw-r--r--lib/File/Which.pm335
-rw-r--r--t/00_diag.t91
-rw-r--r--t/00_diag.txt2
-rw-r--r--t/01_compile.t5
-rw-r--r--t/02_all.t34
-rw-r--r--t/03_simple.t85
-rw-r--r--t/04_pwhich.t13
-rw-r--r--t/test-bin/README.txt5
-rwxr-xr-xt/test-bin/all2
-rwxr-xr-xt/test-bin/all.bat0
-rwxr-xr-xt/test-bin/all.exe0
-rwxr-xr-xt/test-bin/test1.exe2
-rwxr-xr-xt/test-bin/test2.bat3
-rwxr-xr-xt/test-bin/test35
-rw-r--r--t/test-bin/test4/foo.txt1
-rw-r--r--xt/release/eol.t14
-rw-r--r--xt/release/fixme.t19
-rw-r--r--xt/release/no_tabs.t15
-rw-r--r--xt/release/pod.t15
-rw-r--r--xt/release/pod_coverage.t72
-rw-r--r--xt/release/pod_spelling_common.t27
-rw-r--r--xt/release/pod_spelling_system.t101
-rw-r--r--xt/release/release.yml22
-rw-r--r--xt/release/strict.t15
-rw-r--r--xt/release/version.t44
35 files changed, 1849 insertions, 0 deletions
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..a5fb3da
--- /dev/null
+++ b/Changes
@@ -0,0 +1,116 @@
+Revision history for File-Which
+
+1.19 2015-07-21 09:23:54 -0400
+ - Relax required Perl back to 5.6.x as this module is upriver to
+ a large number of modules
+ - No non-core requirements back to 5.6.2
+
+1.18 2015-05-04 15:35:40 -0400
+ - Remove prototypes (gh#6)
+
+1.17 2015-05-01 07:06:00 -0400
+ - Removed pwhich as forwarned in 1.10
+ - Migrated to Dist::Zilla (relevant only for development)
+ - Minimum supported Perl is 5.8.1
+
+1.16 Sun 29 Mar 2015
+ - Remove use Test::Script from tests that escaped when this requirement
+ became optional.
+
+1.15 Sun 29 Mar 2015
+ - Fixed small but important POD error
+
+1.14 Sun 29 Mar 2015
+ - App::pwhich is no longer bundled with File::Which and included
+ in its own distribution.
+ - pwhich that comes with this distribution is deprecated, and will
+ report a warning if you try to use it, you should insted install
+ App::pwhich.
+ - pwhich that comes with this distribution will not be installed if
+ App::pwhich 1.14 or better is already installed.
+ - pwhich will be removed from this distribution, but not before
+ 30 April 2015.
+ - Make Test::Script an optional dependency
+
+1.12 Thu 26 Mar 2015
+ - Fixed bug in pwhich introduced in version 1.10 where only the
+ first file was searched for
+
+1.11 Thu 26 Mar 2015
+ - Support for relative and fully qualified paths in Unix (gh#2)
+
+1.10 Thu 26 Mar 2015
+ - Test::Script is now a test instead of runtime requirement
+ It will be entirely removed as a prerequisite in a subsequent
+ release
+ - Will now find .exe and .com files (as it should) on cygwin (rt83146)
+ - Declared required Perl version is now 5.005003
+ - Updated repository and maintainer information. Source for this
+ dist now lives on GitHub
+ - New module App::pwhich contains the guts of pwhich. It will be moved
+ into a separate dist in the near future. pwhich will be deprecated
+ and removed from this dist in the near future.
+
+1.09 Sun 27 Sep 2009
+ - Set svn:executable for the exe files so cygwin tests work
+
+1.08 Tue 15 Sep 2009
+ - Fixing pwhich
+ - Adding a proper test for it
+ - Adds a dependency on Test::Script 1.08
+
+1.07 Tue 28 Jul 2009
+ - CPAN Testers looks good for 1.06_01, moving to production release
+
+1.06_01 Sat 25 Jul 2009
+ - Taking over this hugely old and very popular module to clean it
+ up a bit.
+ - Moved from Test.pm to Test::More.
+ - Updated Changes
+ - Cleaned up some code a bit to make it more readable.
+ - Added an explicit minimum Perl version
+ - Changed platform detection code to constants for less code size
+ and compile-time if () optimisation.
+ - Removed non-leading tabs and other whitespace nigglies.
+
+0.05 Mon 24 Jun 2002
+ - Made sure the file wasn't a directory, as directories usually
+ have x set.
+ - made pwhich say so if it didn't find a file.
+ - improve file searching: file doesn't have to be -x on MacOS,
+ only -e. Same thing on DOSish, but only if the file extension is
+ in PATHEXT (so we don't look for non-executable files that
+ happen to be in PATH).
+ - For DOSish, VMS and Mac, add current directory in front of path,
+ as (on Win32) this one is searched first. (could someone tell me
+ if this assumption is true on VMS and MacOS too?)
+ - large updates to test suite: we now emulate executable files
+ inside t/test-bin/. Like this we have more control. I hope
+ this test suite will be better, but it is probably still
+ shaky. Any reports would do me a lot of good.
+
+0.04 Thu 20 Jun 2002
+ - Re-wrote some parts for more platform-specific code (Mac and VMS
+ primarily). Thanks to Abigail and the PPT `which':
+ http://www.perl.com/language/ppt/src/which/index.html
+ - Removed the '~' handling: was probably broken anyway.
+ - fixed a bug with pwhich -a where it would return the number of
+ results instead of the results
+
+0.03 Wed 24 Apr 2002
+ - Changed the '~' handling: last version was buggy, it needs to
+ only replace it on Unix and if $ENV{HOME} exists, replacing it
+ then with $ENV{HOME} (removes File::HomeDir dependency).
+ - Added documentation to pwhich (you can run perldoc on it now)
+
+0.02 Fri 19 Apr 2002
+ - Some documentation changes
+ - Added where($short_exec_name) as an alias for
+ which($short_exec_name, { all => 1 }).
+ [Request from Jerrad Pierce <belg4mit (at) mit.edu>]
+ - Added the which option --all. Other options just bloat everything.
+ - Added `pwhich', perl-only replacement for `which'.
+
+0.01 Sun 14 Apr 2002
+ - original version; extracted from DocSet. Only plain which() with
+ docs and tests.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..9a112a0
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,43 @@
+This is the Perl distribution File-Which.
+
+Installing File-Which is straightforward.
+
+## Installation with cpanm
+
+If you have cpanm, you only need one line:
+
+ % cpanm File::Which
+
+If you are installing into a system-wide directory, you may need to pass the
+"-S" flag to cpanm, which uses sudo to install the module:
+
+ % cpanm -S File::Which
+
+## Installing with the CPAN shell
+
+Alternatively, if your CPAN shell is set up, you should just be able to do:
+
+ % cpan File::Which
+
+## Manual installation
+
+As a last resort, you can manually install it. Download the tarball, untar it,
+then build it:
+
+ % perl Makefile.PL
+ % make && make test
+
+Then install it:
+
+ % make install
+
+If you are installing into a system-wide directory, you may need to run:
+
+ % sudo make install
+
+## Documentation
+
+File-Which documentation is available as POD.
+You can run perldoc from a shell to read the documentation:
+
+ % perldoc File::Which
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..15dc9d9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,379 @@
+This software is copyright (c) 2002 by Per Einar Ellefsen <pereinar@cpan.org>.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+Terms of the Perl programming language system itself
+
+a) the GNU General Public License as published by the Free
+ Software Foundation; either version 1, or (at your option) any
+ later version, or
+b) the "Artistic License"
+
+--- The GNU General Public License, Version 1, February 1989 ---
+
+This software is Copyright (c) 2002 by Per Einar Ellefsen <pereinar@cpan.org>.
+
+This is free software, licensed under:
+
+ The GNU General Public License, Version 1, February 1989
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The license agreements of most software companies try to keep users
+at the mercy of those companies. By contrast, our General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, that you receive source code or can get it if you want it,
+that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of a such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must tell them their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any program or other work which
+contains a notice placed by the copyright holder saying it may be
+distributed under the terms of this General Public License. The
+"Program", below, refers to any such program or work, and a "work based
+on the Program" means either the Program or any work containing the
+Program or a portion of it, either verbatim or with modifications. Each
+licensee is addressed as "you".
+
+ 1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program. You may charge a fee for the physical act of
+transferring a copy.
+
+ 2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+ a) cause the modified files to carry prominent notices stating that
+ you changed the files and the date of any change; and
+
+ b) cause the whole of any work that you distribute or publish, that
+ in whole or in part contains the Program or any part thereof, either
+ with or without modifications, to be licensed at no charge to all
+ third parties under the terms of this General Public License (except
+ that you may choose to grant warranty protection to some or all
+ third parties, at your option).
+
+ c) If the modified program normally reads commands interactively when
+ run, you must cause it, when started running for such interactive use
+ in the simplest and most usual way, to print or display an
+ announcement including an appropriate copyright notice and a notice
+ that there is no warranty (or else, saying that you provide a
+ warranty) and that users may redistribute the program under these
+ conditions, and telling the user how to view a copy of this General
+ Public License.
+
+ d) You may charge a fee for the physical act of transferring a
+ copy, and you may at your option offer warranty protection in
+ exchange for a fee.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+ 3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 1 and 2 above provided that you also do one of the following:
+
+ a) accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ b) accompany it with a written offer, valid for at least three
+ years, to give any third party free (except for a nominal charge
+ for the cost of distribution) a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ c) accompany it with the information you received as to where the
+ corresponding source code may be obtained. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it. For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+ 4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License. However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+ 5. By copying, distributing or modifying the Program (or any work based
+on the Program) you indicate your acceptance of this license to do so,
+and all its terms and conditions.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these
+terms and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein.
+
+ 7. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of the license which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+ 8. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to humanity, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 1, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19xx name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ program `Gnomovision' (a program to direct compilers to make passes
+ at assemblers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+--- The Artistic License 1.0 ---
+
+This software is Copyright (c) 2002 by Per Einar Ellefsen <pereinar@cpan.org>.
+
+This is free software, licensed under:
+
+ The Artistic License 1.0
+
+The Artistic License
+
+Preamble
+
+The intent of this document is to state the conditions under which a Package
+may be copied, such that the Copyright Holder maintains some semblance of
+artistic control over the development of the package, while giving the users of
+the package the right to use and distribute the Package in a more-or-less
+customary fashion, plus the right to make reasonable modifications.
+
+Definitions:
+
+ - "Package" refers to the collection of files distributed by the Copyright
+ Holder, and derivatives of that collection of files created through
+ textual modification.
+ - "Standard Version" refers to such a Package if it has not been modified,
+ or has been modified in accordance with the wishes of the Copyright
+ Holder.
+ - "Copyright Holder" is whoever is named in the copyright or copyrights for
+ the package.
+ - "You" is you, if you're thinking about copying or distributing this Package.
+ - "Reasonable copying fee" is whatever you can justify on the basis of media
+ cost, duplication charges, time of people involved, and so on. (You will
+ not be required to justify it to the Copyright Holder, but only to the
+ computing community at large as a market that must bear the fee.)
+ - "Freely Available" means that no fee is charged for the item itself, though
+ there may be fees involved in handling the item. It also means that
+ recipients of the item may redistribute it under the same conditions they
+ received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications derived
+from the Public Domain or from the Copyright Holder. A Package modified in such
+a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided that
+you insert a prominent notice in each changed file stating how and when you
+changed that file, and provided that you do at least ONE of the following:
+
+ a) place your modifications in the Public Domain or otherwise make them
+ Freely Available, such as by posting said modifications to Usenet or an
+ equivalent medium, or placing the modifications on a major archive site
+ such as ftp.uu.net, or by allowing the Copyright Holder to include your
+ modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation or organization.
+
+ c) rename any non-standard executables so the names do not conflict with
+ standard executables, which must also be provided, and provide a separate
+ manual page for each non-standard executable that clearly documents how it
+ differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or executable
+form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and library files,
+ together with instructions (in the manual page or equivalent) on where to
+ get the Standard Version.
+
+ b) accompany the distribution with the machine-readable source of the Package
+ with your modifications.
+
+ c) accompany any non-standard executables with their corresponding Standard
+ Version executables, giving the non-standard executables non-standard
+ names, and clearly documenting the differences in manual pages (or
+ equivalent), together with instructions on where to get the Standard
+ Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this Package. You
+may not charge a fee for this Package itself. However, you may distribute this
+Package in aggregate with other (possibly commercial) programs as part of a
+larger (possibly commercial) software distribution provided that you do not
+advertise this Package as a product of your own.
+
+6. The scripts and library files supplied as input to or produced as output
+from the programs of this Package do not automatically fall under the copyright
+of this Package, but belong to whomever generated them, and may be sold
+commercially, and may be aggregated with this Package.
+
+7. C or perl subroutines supplied by you and linked into this Package shall not
+be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The End
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..ceca30e
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,36 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.036.
+Changes
+INSTALL
+LICENSE
+MANIFEST
+META.json
+META.yml
+Makefile.PL
+README
+cpanfile
+dist.ini
+lib/File/Which.pm
+t/00_diag.t
+t/00_diag.txt
+t/01_compile.t
+t/02_all.t
+t/03_simple.t
+t/04_pwhich.t
+t/test-bin/README.txt
+t/test-bin/all
+t/test-bin/all.bat
+t/test-bin/all.exe
+t/test-bin/test1.exe
+t/test-bin/test2.bat
+t/test-bin/test3
+t/test-bin/test4/foo.txt
+xt/release/eol.t
+xt/release/fixme.t
+xt/release/no_tabs.t
+xt/release/pod.t
+xt/release/pod_coverage.t
+xt/release/pod_spelling_common.t
+xt/release/pod_spelling_system.t
+xt/release/release.yml
+xt/release/strict.t
+xt/release/version.t
diff --git a/META.json b/META.json
new file mode 100644
index 0000000..7a79c41
--- /dev/null
+++ b/META.json
@@ -0,0 +1,51 @@
+{
+ "abstract" : "Perl implementation of the which utility as an API",
+ "author" : [
+ "Per Einar Ellefsen <pereinar@cpan.org>",
+ "Adam Kennedy <adamk@cpan.org>",
+ "Graham Ollis <plicease@cpan.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "Dist::Zilla version 5.036, CPAN::Meta::Converter version 2.150001",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "File-Which",
+ "prereqs" : {
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "0",
+ "perl" : "5.006"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "perl" : "5.006"
+ }
+ },
+ "test" : {
+ "requires" : {
+ "Test::More" : "0.47",
+ "perl" : "5.006"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "https://github.com/plicease/File-Which/issues"
+ },
+ "homepage" : "http://perl.wdlabs.com/File-Which",
+ "repository" : {
+ "type" : "git",
+ "url" : "git://github.com/plicease/File-Which.git",
+ "web" : "https://github.com/plicease/File-Which"
+ }
+ },
+ "version" : "1.19"
+}
+
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..5b1dd53
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,26 @@
+---
+abstract: 'Perl implementation of the which utility as an API'
+author:
+ - 'Per Einar Ellefsen <pereinar@cpan.org>'
+ - 'Adam Kennedy <adamk@cpan.org>'
+ - 'Graham Ollis <plicease@cpan.org>'
+build_requires:
+ Test::More: '0.47'
+ perl: '5.006'
+configure_requires:
+ ExtUtils::MakeMaker: '0'
+ perl: '5.006'
+dynamic_config: 0
+generated_by: 'Dist::Zilla version 5.036, CPAN::Meta::Converter version 2.150001'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: '1.4'
+name: File-Which
+requires:
+ perl: '5.006'
+resources:
+ bugtracker: https://github.com/plicease/File-Which/issues
+ homepage: http://perl.wdlabs.com/File-Which
+ repository: git://github.com/plicease/File-Which.git
+version: '1.19'
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..0e26c0a
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,52 @@
+BEGIN {
+ unless(eval q{ use 5.006; 1}) {
+ print "Perl 5.006 or better required\n";
+ exit;
+ }
+}
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.036.
+use strict;
+use warnings;
+
+use 5.006;
+
+use ExtUtils::MakeMaker;
+
+my %WriteMakefileArgs = (
+ "ABSTRACT" => "Perl implementation of the which utility as an API",
+ "AUTHOR" => "Per Einar Ellefsen <pereinar\@cpan.org>, Adam Kennedy <adamk\@cpan.org>, Graham Ollis <plicease\@cpan.org>",
+ "CONFIGURE_REQUIRES" => {
+ "ExtUtils::MakeMaker" => 0
+ },
+ "DISTNAME" => "File-Which",
+ "EXE_FILES" => [],
+ "LICENSE" => "perl",
+ "MIN_PERL_VERSION" => "5.006",
+ "NAME" => "File::Which",
+ "PREREQ_PM" => {},
+ "TEST_REQUIRES" => {
+ "Test::More" => "0.47"
+ },
+ "VERSION" => "1.19",
+ "test" => {
+ "TESTS" => "t/*.t"
+ }
+);
+
+
+my %FallbackPrereqs = (
+ "ExtUtils::MakeMaker" => 0,
+ "Test::More" => "0.47"
+);
+
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+ delete $WriteMakefileArgs{TEST_REQUIRES};
+ delete $WriteMakefileArgs{BUILD_REQUIRES};
+ $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
+}
+
+delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
+ unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
+
+WriteMakefile(%WriteMakefileArgs);
diff --git a/README b/README
new file mode 100644
index 0000000..99a904e
--- /dev/null
+++ b/README
@@ -0,0 +1,179 @@
+NAME
+
+ File::Which - Perl implementation of the which utility as an API
+
+VERSION
+
+ version 1.19
+
+SYNOPSIS
+
+ use File::Which; # exports which()
+ use File::Which qw(which where); # exports which() and where()
+
+ my $exe_path = which 'perldoc';
+
+ my @paths = where 'perl';
+ # Or
+ my @paths = which 'perl'; # an array forces search for all of them
+
+DESCRIPTION
+
+ File::Which finds the full or relative paths to executable programs on
+ the system. This is normally the function of which utility. which is
+ typically implemented as either a program or a built in shell command.
+ On some platforms, such as Microsoft Windows it is not provided as part
+ of the core operating system. This module provides a consistent API to
+ this functionality regardless of the underlying platform.
+
+ The focus of this module is correctness and portability. As a
+ consequence platforms where the current directory is implicitly part of
+ the search path such as Microsoft Windows will find executables in the
+ current directory, whereas on platforms such as UNIX where this is not
+ the case executables in the current directory will only be found if the
+ current directory is explicitly added to the path.
+
+ If you need a portable which on the command line in an environment that
+ does not provide it, install App::pwhich which provides a command line
+ interface to this API.
+
+ Implementations
+
+ File::Which searches the directories of the user's PATH (the current
+ implementation uses File::Spec#path to determine the correct PATH),
+ looking for executable files having the name specified as a parameter
+ to "which". Under Win32 systems, which do not have a notion of directly
+ executable files, but uses special extensions such as .exe and .bat to
+ identify them, File::Which takes extra steps to assure that you will
+ find the correct file (so for example, you might be searching for perl,
+ it'll try perl.exe, perl.bat, etc.)
+
+ Linux, *BSD and other UNIXes
+
+ There should not be any surprises here. The current directory will not
+ be searched unless it is explicitly added to the path.
+
+ Modern Windows (including NT, XP, Vista, 7, 8, 10 etc)
+
+ Windows NT has a special environment variable called PATHEXT, which is
+ used by the shell to look for executable files. Usually, it will
+ contain a list in the form .EXE;.BAT;.COM;.JS;.VBS etc. If File::Which
+ finds such an environment variable, it parses the list and uses it as
+ the different extensions.
+
+ Cygwin
+
+ Cygwin provides a Unix-like environment for Microsoft Windows users. In
+ most ways it works like other Unix and Unix-like environments, but in a
+ few key aspects it works like Windows. As with other Unix environments,
+ the current directory is not included in the search unless it is
+ explicitly included in the search path. Like on Windows, files with
+ .EXE or <.BAT> extensions will be discovered even if they are not part
+ of the query. .COM or extensions specified using the PATHEXT
+ environment variable will NOT be discovered without the fully qualified
+ name, however.
+
+ Windows 95, 98, ME, MS-DOS, OS/2
+
+ This set of operating systems don't have the PATHEXT variable, and
+ usually you will find executable files there with the extensions .exe,
+ .bat and (less likely) .com. File::Which uses this hardcoded list if
+ it's running under Win32 but does not find a PATHEXT variable.
+
+ As of 2015 none of these platforms are tested frequently (or perhaps
+ ever), but the current maintainer is determined not to intentionally
+ remove support for older operating systems.
+
+ VMS
+
+ Same case as Windows 9x: uses .exe and .com (in that order).
+
+ As of 2015 the current maintainer does not test on VMS, and is in fact
+ not certain it has ever been tested on VMS. If this platform is
+ important to you and you can help me verify and or support it on that
+ platform please contact me.
+
+FUNCTIONS
+
+ which
+
+ my $path = which $short_exe_name;
+ my @paths = which $short_exe_name;
+
+ Exported by default.
+
+ $short_exe_name is the name used in the shell to call the program (for
+ example, perl).
+
+ If it finds an executable with the name you specified, which() will
+ return the absolute path leading to this executable (for example,
+ /usr/bin/perl or C:\Perl\Bin\perl.exe).
+
+ If it does not find the executable, it returns undef.
+
+ If which() is called in list context, it will return all the matches.
+
+ where
+
+ my @paths = where $short_exe_name;
+
+ Not exported by default.
+
+ Same as "which" in array context. Same as the where utility, will
+ return an array containing all the path names matching $short_exe_name.
+
+CAVEATS
+
+ This module has no non-core requirements for Perl 5.6.2 and better.
+
+ This module is fully supported back to Perl 5.8.1. It may work on
+ 5.8.0. It should work on Perl 5.6.x and I may even test on 5.6.2. I
+ will accept patches to maintain compatibility for such older Perls, but
+ you may need to fix it on 5.6.x / 5.8.0 and send me a patch.
+
+ Not tested on VMS although there is platform specific code for those.
+ Anyone who haves a second would be very kind to send me a report of how
+ it went.
+
+SUPPORT
+
+ Bugs should be reported via the GitHub issue tracker
+
+ https://github.com/plicease/File-Which/issues
+
+ For other issues, contact the maintainer.
+
+SEE ALSO
+
+ pwhich, App::pwhich
+
+ Command line interface to this module.
+
+ IPC::Cmd
+
+ Comes with a can_run function with slightly different semantics that
+ the traditional UNIX where. It will find executables in the current
+ directory, even though the current directory is not searched for by
+ default on Unix.
+
+ Devel::CheckBin
+
+ This module purports to "check that a command is available", but does
+ not provide any documentation on how you might use it.
+
+AUTHORS
+
+ * Per Einar Ellefsen <pereinar@cpan.org>
+
+ * Adam Kennedy <adamk@cpan.org>
+
+ * Graham Ollis <plicease@cpan.org>
+
+COPYRIGHT AND LICENSE
+
+ This software is copyright (c) 2002 by Per Einar Ellefsen
+ <pereinar@cpan.org>.
+
+ This is free software; you can redistribute it and/or modify it under
+ the same terms as the Perl 5 programming language system itself.
+
diff --git a/cpanfile b/cpanfile
new file mode 100644
index 0000000..0bfe1d9
--- /dev/null
+++ b/cpanfile
@@ -0,0 +1,11 @@
+requires "perl" => "5.006";
+
+on 'test' => sub {
+ requires "Test::More" => "0.47";
+ requires "perl" => "5.006";
+};
+
+on 'configure' => sub {
+ requires "ExtUtils::MakeMaker" => "0";
+ requires "perl" => "5.006";
+};
diff --git a/dist.ini b/dist.ini
new file mode 100644
index 0000000..a593b22
--- /dev/null
+++ b/dist.ini
@@ -0,0 +1,29 @@
+name = File-Which
+author = Per Einar Ellefsen <pereinar@cpan.org>
+author = Adam Kennedy <adamk@cpan.org>
+author = Graham Ollis <plicease@cpan.org>
+license = Perl_5
+copyright_holder = Per Einar Ellefsen <pereinar@cpan.org>
+copyright_year = 2002
+version = 1.19
+
+[@Author::Plicease]
+:version = 1.83
+release_tests = 1
+installer = MakeMaker
+release_tests_skip = changes\.t
+upgrade = Test::More = 0.47
+
+[RemovePrereqs]
+remove = strict
+remove = warnings
+remove = constant
+remove = Exporter
+remove = Getopt::Std
+remove = File::Spec
+
+[Author::Plicease::Upload]
+cpan = 1
+
+[OnlyCorePrereqs]
+starting_version = 5.006002
diff --git a/lib/File/Which.pm b/lib/File/Which.pm
new file mode 100644
index 0000000..d9edb7c
--- /dev/null
+++ b/lib/File/Which.pm
@@ -0,0 +1,335 @@
+package File::Which;
+
+use strict;
+use warnings;
+use Exporter ();
+use File::Spec ();
+
+# ABSTRACT: Perl implementation of the which utility as an API
+our $VERSION = '1.19'; # VERSION
+
+
+our @ISA = 'Exporter';
+our @EXPORT = 'which';
+our @EXPORT_OK = 'where';
+
+use constant IS_VMS => ($^O eq 'VMS');
+use constant IS_MAC => ($^O eq 'MacOS');
+use constant IS_DOS => ($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'os2');
+use constant IS_CYG => ($^O eq 'cygwin');
+
+# For Win32 systems, stores the extensions used for
+# executable files
+# For others, the empty string is used
+# because 'perl' . '' eq 'perl' => easier
+my @PATHEXT = ('');
+if ( IS_DOS ) {
+ # WinNT. PATHEXT might be set on Cygwin, but not used.
+ if ( $ENV{PATHEXT} ) {
+ push @PATHEXT, split ';', $ENV{PATHEXT};
+ } else {
+ # Win9X or other: doesn't have PATHEXT, so needs hardcoded.
+ push @PATHEXT, qw{.com .exe .bat};
+ }
+} elsif ( IS_VMS ) {
+ push @PATHEXT, qw{.exe .com};
+} elsif ( IS_CYG ) {
+ # See this for more info
+ # http://cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-exe
+ push @PATHEXT, qw{.exe .com};
+}
+
+
+sub which {
+ my ($exec) = @_;
+
+ return undef unless $exec;
+
+ my $all = wantarray;
+ my @results = ();
+
+ # check for aliases first
+ if ( IS_VMS ) {
+ my $symbol = `SHOW SYMBOL $exec`;
+ chomp($symbol);
+ unless ( $? ) {
+ return $symbol unless $all;
+ push @results, $symbol;
+ }
+ }
+ if ( IS_MAC ) {
+ my @aliases = split /\,/, $ENV{Aliases};
+ foreach my $alias ( @aliases ) {
+ # This has not been tested!!
+ # PPT which says MPW-Perl cannot resolve `Alias $alias`,
+ # let's just hope it's fixed
+ if ( lc($alias) eq lc($exec) ) {
+ chomp(my $file = `Alias $alias`);
+ last unless $file; # if it failed, just go on the normal way
+ return $file unless $all;
+ push @results, $file;
+ # we can stop this loop as if it finds more aliases matching,
+ # it'll just be the same result anyway
+ last;
+ }
+ }
+ }
+
+ return $exec
+ if !IS_VMS and !IS_MAC and !IS_DOS and $exec =~ /\// and -f $exec and -x $exec;
+
+ my @path = File::Spec->path;
+ if ( IS_DOS or IS_VMS or IS_MAC ) {
+ unshift @path, File::Spec->curdir;
+ }
+
+ foreach my $base ( map { File::Spec->catfile($_, $exec) } @path ) {
+ for my $ext ( @PATHEXT ) {
+ my $file = $base.$ext;
+
+ # We don't want dirs (as they are -x)
+ next if -d $file;
+
+ if (
+ # Executable, normal case
+ -x _
+ or (
+ # MacOS doesn't mark as executable so we check -e
+ IS_MAC
+ ||
+ (
+ ( IS_DOS or IS_CYG )
+ and
+ grep {
+ $file =~ /$_\z/i
+ } @PATHEXT[1..$#PATHEXT]
+ )
+ # DOSish systems don't pass -x on
+ # non-exe/bat/com files. so we check -e.
+ # However, we don't want to pass -e on files
+ # that aren't in PATHEXT, like README.
+ and -e _
+ )
+ ) {
+ return $file unless $all;
+ push @results, $file;
+ }
+ }
+ }
+
+ if ( $all ) {
+ return @results;
+ } else {
+ return undef;
+ }
+}
+
+
+sub where {
+ # force wantarray
+ my @res = which($_[0]);
+ return @res;
+}
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+File::Which - Perl implementation of the which utility as an API
+
+=head1 VERSION
+
+version 1.19
+
+=head1 SYNOPSIS
+
+ use File::Which; # exports which()
+ use File::Which qw(which where); # exports which() and where()
+
+ my $exe_path = which 'perldoc';
+
+ my @paths = where 'perl';
+ # Or
+ my @paths = which 'perl'; # an array forces search for all of them
+
+=head1 DESCRIPTION
+
+L<File::Which> finds the full or relative paths to executable programs on
+the system. This is normally the function of C<which> utility. C<which> is
+typically implemented as either a program or a built in shell command. On
+some platforms, such as Microsoft Windows it is not provided as part of the
+core operating system. This module provides a consistent API to this
+functionality regardless of the underlying platform.
+
+The focus of this module is correctness and portability. As a consequence
+platforms where the current directory is implicitly part of the search path
+such as Microsoft Windows will find executables in the current directory,
+whereas on platforms such as UNIX where this is not the case executables
+in the current directory will only be found if the current directory is
+explicitly added to the path.
+
+If you need a portable C<which> on the command line in an environment that
+does not provide it, install L<App::pwhich> which provides a command line
+interface to this API.
+
+=head2 Implementations
+
+L<File::Which> searches the directories of the user's C<PATH> (the current
+implementation uses L<File::Spec#path> to determine the correct C<PATH>),
+looking for executable files having the name specified as a parameter to
+L</which>. Under Win32 systems, which do not have a notion of directly
+executable files, but uses special extensions such as C<.exe> and C<.bat>
+to identify them, C<File::Which> takes extra steps to assure that
+you will find the correct file (so for example, you might be searching for
+C<perl>, it'll try F<perl.exe>, F<perl.bat>, etc.)
+
+=head3 Linux, *BSD and other UNIXes
+
+There should not be any surprises here. The current directory will not be
+searched unless it is explicitly added to the path.
+
+=head3 Modern Windows (including NT, XP, Vista, 7, 8, 10 etc)
+
+Windows NT has a special environment variable called C<PATHEXT>, which is used
+by the shell to look for executable files. Usually, it will contain a list in
+the form C<.EXE;.BAT;.COM;.JS;.VBS> etc. If C<File::Which> finds such an
+environment variable, it parses the list and uses it as the different
+extensions.
+
+=head3 Cygwin
+
+Cygwin provides a Unix-like environment for Microsoft Windows users. In most
+ways it works like other Unix and Unix-like environments, but in a few key
+aspects it works like Windows. As with other Unix environments, the current
+directory is not included in the search unless it is explicitly included in
+the search path. Like on Windows, files with C<.EXE> or <.BAT> extensions will
+be discovered even if they are not part of the query. C<.COM> or extensions
+specified using the C<PATHEXT> environment variable will NOT be discovered
+without the fully qualified name, however.
+
+=head3 Windows 95, 98, ME, MS-DOS, OS/2
+
+This set of operating systems don't have the C<PATHEXT> variable, and usually
+you will find executable files there with the extensions C<.exe>, C<.bat> and
+(less likely) C<.com>. C<File::Which> uses this hardcoded list if it's running
+under Win32 but does not find a C<PATHEXT> variable.
+
+As of 2015 none of these platforms are tested frequently (or perhaps ever),
+but the current maintainer is determined not to intentionally remove support
+for older operating systems.
+
+=head3 VMS
+
+Same case as Windows 9x: uses C<.exe> and C<.com> (in that order).
+
+As of 2015 the current maintainer does not test on VMS, and is in fact not
+certain it has ever been tested on VMS. If this platform is important to you
+and you can help me verify and or support it on that platform please contact
+me.
+
+=head1 FUNCTIONS
+
+=head2 which
+
+ my $path = which $short_exe_name;
+ my @paths = which $short_exe_name;
+
+Exported by default.
+
+C<$short_exe_name> is the name used in the shell to call the program (for
+example, C<perl>).
+
+If it finds an executable with the name you specified, C<which()> will return
+the absolute path leading to this executable (for example, F</usr/bin/perl> or
+F<C:\Perl\Bin\perl.exe>).
+
+If it does I<not> find the executable, it returns C<undef>.
+
+If C<which()> is called in list context, it will return I<all> the
+matches.
+
+=head2 where
+
+ my @paths = where $short_exe_name;
+
+Not exported by default.
+
+Same as L</which> in array context. Same as the
+C<where> utility, will return an array containing all the path names
+matching C<$short_exe_name>.
+
+=head1 CAVEATS
+
+This module has no non-core requirements for Perl 5.6.2 and better.
+
+This module is fully supported back to Perl 5.8.1. It may work on 5.8.0.
+It should work on Perl 5.6.x and I may even test on 5.6.2. I will accept
+patches to maintain compatibility for such older Perls, but you may
+need to fix it on 5.6.x / 5.8.0 and send me a patch.
+
+Not tested on VMS although there is platform specific code
+for those. Anyone who haves a second would be very kind to send me a
+report of how it went.
+
+=head1 SUPPORT
+
+Bugs should be reported via the GitHub issue tracker
+
+L<https://github.com/plicease/File-Which/issues>
+
+For other issues, contact the maintainer.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<pwhich>, L<App::pwhich>
+
+Command line interface to this module.
+
+=item L<IPC::Cmd>
+
+Comes with a C<can_run> function with slightly different semantics that
+the traditional UNIX where. It will find executables in the current
+directory, even though the current directory is not searched for by
+default on Unix.
+
+=item L<Devel::CheckBin>
+
+This module purports to "check that a command is available", but does not
+provide any documentation on how you might use it.
+
+=back
+
+=head1 AUTHORS
+
+=over 4
+
+=item *
+
+Per Einar Ellefsen <pereinar@cpan.org>
+
+=item *
+
+Adam Kennedy <adamk@cpan.org>
+
+=item *
+
+Graham Ollis <plicease@cpan.org>
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2002 by Per Einar Ellefsen <pereinar@cpan.org>.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
diff --git a/t/00_diag.t b/t/00_diag.t
new file mode 100644
index 0000000..f913073
--- /dev/null
+++ b/t/00_diag.t
@@ -0,0 +1,91 @@
+use strict;
+use warnings;
+use Config;
+use Test::More tests => 1;
+BEGIN {
+ my @modules;
+ eval q{
+ require FindBin;
+ require File::Spec;
+ 1;
+ } || die $@;
+ do {
+ my $fh;
+ if(open($fh, '<', File::Spec->catfile($FindBin::Bin, '00_diag.pre.txt')))
+ {
+ @modules = <$fh>;
+ close $fh;
+ chomp @modules;
+ }
+ };
+ eval qq{ require $_ } for @modules;
+};
+
+sub spacer ()
+{
+ diag '';
+ diag '';
+ diag '';
+}
+
+pass 'okay';
+
+my @modules;
+do {
+ my $fh;
+ open($fh, '<', File::Spec->catfile($FindBin::Bin, '00_diag.txt'));
+ @modules = <$fh>;
+ close $fh;
+ chomp @modules;
+};
+
+my $max = 1;
+$max = $_ > $max ? $_ : $max for map { length $_ } @modules;
+our $format = "%-${max}s %s";
+
+spacer;
+
+my @keys = sort grep /(MOJO|PERL|\A(LC|HARNESS)_|\A(SHELL|LANG)\Z)/i, keys %ENV;
+
+if(@keys > 0)
+{
+ diag "$_=$ENV{$_}" for @keys;
+
+ if($ENV{PERL5LIB})
+ {
+ spacer;
+ diag "PERL5LIB path";
+ diag $_ for split $Config{path_sep}, $ENV{PERL5LIB};
+
+ }
+ elsif($ENV{PERLLIB})
+ {
+ spacer;
+ diag "PERLLIB path";
+ diag $_ for split $Config{path_sep}, $ENV{PERLLIB};
+ }
+
+ spacer;
+}
+
+diag sprintf $format, 'perl ', $^V;
+
+require(File::Spec->catfile($FindBin::Bin, '00_diag.pl'))
+ if -e File::Spec->catfile($FindBin::Bin, '00_diag.pl');
+
+foreach my $module (@modules)
+{
+ if(eval qq{ require $module; 1 })
+ {
+ my $ver = eval qq{ \$$module\::VERSION };
+ $ver = 'undef' unless defined $ver;
+ diag sprintf $format, $module, $ver;
+ }
+ else
+ {
+ diag sprintf $format, $module, '-';
+ }
+}
+
+spacer;
+
diff --git a/t/00_diag.txt b/t/00_diag.txt
new file mode 100644
index 0000000..187dd73
--- /dev/null
+++ b/t/00_diag.txt
@@ -0,0 +1,2 @@
+ExtUtils::MakeMaker
+Test::More
diff --git a/t/01_compile.t b/t/01_compile.t
new file mode 100644
index 0000000..342ab47
--- /dev/null
+++ b/t/01_compile.t
@@ -0,0 +1,5 @@
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+use_ok( 'File::Which' );
diff --git a/t/02_all.t b/t/02_all.t
new file mode 100644
index 0000000..379df36
--- /dev/null
+++ b/t/02_all.t
@@ -0,0 +1,34 @@
+use strict;
+use warnings;
+
+use Test::More tests => 4;
+use File::Spec ();
+use File::Which qw(which where);
+
+# Where is the test application
+my $test_bin = File::Spec->catdir( 't', 'test-bin' );
+ok( -d $test_bin, 'Found test-bin' );
+
+# Set up for running the test application
+local $ENV{PATH} = $test_bin;
+unless (
+ File::Which::IS_VMS
+ or
+ File::Which::IS_MAC
+ or
+ File::Which::IS_DOS
+) {
+ my $all = File::Spec->catfile( $test_bin, 'all' );
+ chmod 0755, $all;
+}
+
+my @result = which('all');
+like( $result[0], qr/all/i, 'Found all' );
+ok( scalar(@result), 'Found at least one result' );
+
+# Should have as many elements.
+is(
+ scalar(@result),
+ scalar(where('all')),
+ 'Scalar which result matches where result',
+);
diff --git a/t/03_simple.t b/t/03_simple.t
new file mode 100644
index 0000000..efea5ea
--- /dev/null
+++ b/t/03_simple.t
@@ -0,0 +1,85 @@
+use strict;
+use warnings;
+use Test::More tests => 10;
+use File::Spec ();
+use File::Which qw{which where};
+
+use constant IS_VMS => ($^O eq 'VMS');
+use constant IS_MAC => ($^O eq 'MacOS');
+use constant IS_DOS => ($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'os2');
+use constant IS_CYGWIN => ($^O eq 'cygwin');
+
+# Check that it returns undef if no file is passed
+is(
+ scalar(which('')), undef,
+ 'Null-length false result',
+);
+is(
+ scalar(which('non_existent_very_unlinkely_thingy_executable')), undef,
+ 'Positive length false result',
+);
+
+# Where is the test application
+my $test_bin = File::Spec->catdir( 't', 'test-bin' );
+ok( -d $test_bin, 'Found test-bin' );
+
+# Set up for running the test application
+local $ENV{PATH} = $test_bin;
+unless (
+ File::Which::IS_VMS
+ or
+ File::Which::IS_MAC
+ or
+ File::Which::IS_DOS
+) {
+ my $test3 = File::Spec->catfile( $test_bin, 'test3' );
+ chmod 0755, $test3;
+}
+
+SKIP: {
+ skip("Not on DOS-like filesystem", 3) unless IS_DOS;
+ is( lc scalar which('test1'), 't\test-bin\test1.exe', 'Looking for test1.exe' );
+ is( lc scalar which('test2'), 't\test-bin\test2.bat', 'Looking for test2.bat' );
+ is( scalar which('test3'), undef, 'test3 returns undef' );
+}
+
+SKIP: {
+ skip("Not on a UNIX filesystem", 1) if IS_DOS;
+ skip("Not on a UNIX filesystem", 1) if IS_MAC;
+ skip("Not on a UNIX filesystem", 1) if IS_VMS;
+ is(
+ scalar(which('test3')),
+ File::Spec->catfile( $test_bin, 'test3'),
+ 'Check test3 for Unix',
+ );
+}
+
+SKIP: {
+ skip("Not on a cygwin filesystem", 2) unless IS_CYGWIN;
+
+ # Cygwin: should make test1.exe transparent
+ is(
+ scalar(which('test1')),
+ File::Spec->catfile( $test_bin, 'test1' ),
+ 'Looking for test1 on Cygwin: transparent to test1.exe',
+ );
+ is(
+ scalar(which('test4')),
+ undef,
+ 'Make sure that which() doesn\'t return a directory',
+ );
+}
+
+# Make sure that .\ stuff works on DOSish, VMS, MacOS (. is in PATH implicitly).
+SKIP: {
+ unless ( IS_DOS or IS_VMS ) {
+ skip("Not on a DOS or VMS filesystem", 1);
+ }
+
+ chdir( $test_bin );
+ is(
+ lc scalar which('test1'),
+ File::Spec->catfile(File::Spec->curdir(), 'test1.exe'),
+ 'Looking for test1.exe in curdir',
+ );
+}
diff --git a/t/04_pwhich.t b/t/04_pwhich.t
new file mode 100644
index 0000000..c73fd3f
--- /dev/null
+++ b/t/04_pwhich.t
@@ -0,0 +1,13 @@
+use strict;
+use warnings;
+
+use Test::More tests => 3;
+use File::Which;
+
+# Look for a very common program
+my $tool = 'perl';
+my $path = which($tool);
+ok( defined $path, "Found path to $tool" );
+ok( $path, "Found path to $tool" );
+ok( -f $path, "$tool exists" );
+
diff --git a/t/test-bin/README.txt b/t/test-bin/README.txt
new file mode 100644
index 0000000..f7b062a
--- /dev/null
+++ b/t/test-bin/README.txt
@@ -0,0 +1,5 @@
+The files included in this directory are only used for testing: they
+should not be executed: especially the *.exe files which aren't really
+compiled programs, only empty files with special filenames (as
+File::Which only cares about special attributes). Do NOT try to run
+them.
diff --git a/t/test-bin/all b/t/test-bin/all
new file mode 100755
index 0000000..b76df2e
--- /dev/null
+++ b/t/test-bin/all
@@ -0,0 +1,2 @@
+#!bash
+# above shebang needed so Cygwin treats it as -x \ No newline at end of file
diff --git a/t/test-bin/all.bat b/t/test-bin/all.bat
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/t/test-bin/all.bat
diff --git a/t/test-bin/all.exe b/t/test-bin/all.exe
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/t/test-bin/all.exe
diff --git a/t/test-bin/test1.exe b/t/test-bin/test1.exe
new file mode 100755
index 0000000..3cb13a5
--- /dev/null
+++ b/t/test-bin/test1.exe
@@ -0,0 +1,2 @@
+DO NOT RUN THIS PROGRAM
+IT IS ONLY TO TEST File::Which
diff --git a/t/test-bin/test2.bat b/t/test-bin/test2.bat
new file mode 100755
index 0000000..fdaae7c
--- /dev/null
+++ b/t/test-bin/test2.bat
@@ -0,0 +1,3 @@
+@echo off
+echo This is for testing File::Which
+echo Nothing interesting here! \ No newline at end of file
diff --git a/t/test-bin/test3 b/t/test-bin/test3
new file mode 100755
index 0000000..ef252be
--- /dev/null
+++ b/t/test-bin/test3
@@ -0,0 +1,5 @@
+#!sh
+
+# ^ above shebang is needed for Cygwin
+echo "Just testing File::Which"
+echo "Nothing interesting here"
diff --git a/t/test-bin/test4/foo.txt b/t/test-bin/test4/foo.txt
new file mode 100644
index 0000000..7e34287
--- /dev/null
+++ b/t/test-bin/test4/foo.txt
@@ -0,0 +1 @@
+This file only needs to be here to test4 dir is copied over. \ No newline at end of file
diff --git a/xt/release/eol.t b/xt/release/eol.t
new file mode 100644
index 0000000..3f2e816
--- /dev/null
+++ b/xt/release/eol.t
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::EOL'
+ unless eval q{ use Test::EOL; 1 };
+};
+use Test::EOL;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+all_perl_files_ok(grep { -e $_ } qw( bin lib t Makefile.PL ));
diff --git a/xt/release/fixme.t b/xt/release/fixme.t
new file mode 100644
index 0000000..9dac4c6
--- /dev/null
+++ b/xt/release/fixme.t
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Fixme'
+ unless eval q{ use Test::Fixme 0.14; 1 };
+};
+use Test::Fixme 0.07;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+run_tests(
+ match => qr/FIXME/,
+ where => [ grep { -e $_ } qw( bin lib t Makefile.PL )],
+ warn => 1,
+);
+
diff --git a/xt/release/no_tabs.t b/xt/release/no_tabs.t
new file mode 100644
index 0000000..0a6d2b6
--- /dev/null
+++ b/xt/release/no_tabs.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::NoTabs'
+ unless eval q{ use Test::NoTabs; 1 };
+};
+use Test::NoTabs;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));
+
diff --git a/xt/release/pod.t b/xt/release/pod.t
new file mode 100644
index 0000000..2603675
--- /dev/null
+++ b/xt/release/pod.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Pod'
+ unless eval q{ use Test::Pod; 1 };
+};
+use Test::Pod;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+all_pod_files_ok( grep { -e $_ } qw( bin lib ));
+
diff --git a/xt/release/pod_coverage.t b/xt/release/pod_coverage.t
new file mode 100644
index 0000000..49eff90
--- /dev/null
+++ b/xt/release/pod_coverage.t
@@ -0,0 +1,72 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Pod::Coverage'
+ unless eval q{ use Test::Pod::Coverage; 1 };
+ plan skip_all => 'test requires YAML'
+ unless eval q{ use YAML; 1; };
+};
+use Test::Pod::Coverage;
+use YAML qw( LoadFile );
+use FindBin;
+use File::Spec;
+
+my $config_filename = File::Spec->catfile(
+ $FindBin::Bin, 'release.yml'
+);
+
+my $config;
+$config = LoadFile($config_filename)
+ if -r $config_filename;
+
+plan skip_all => 'disabled' if $config->{pod_coverage}->{skip};
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+my @private_classes;
+my %private_methods;
+
+push @{ $config->{pod_coverage}->{private} },
+ 'Alien::.*::Install::Files#Inline';
+
+foreach my $private (@{ $config->{pod_coverage}->{private} })
+{
+ my($class,$method) = split /#/, $private;
+ if(defined $class && $class ne '')
+ {
+ my $regex = eval 'qr{^' . $class . '$}';
+ if(defined $method && $method ne '')
+ {
+ push @private_classes, { regex => $regex, method => $method };
+ }
+ else
+ {
+ push @private_classes, { regex => $regex, all => 1 };
+ }
+ }
+ elsif(defined $method && $method ne '')
+ {
+ $private_methods{$_} = 1 for split /,/, $method;
+ }
+}
+
+my @classes = all_modules;
+
+plan tests => scalar @classes;
+
+foreach my $class (@classes)
+{
+ SKIP: {
+ my($is_private_class) = map { 1 } grep { $class =~ $_->{regex} && $_->{all} } @private_classes;
+ skip "private class: $class", 1 if $is_private_class;
+
+ my %methods = map {; $_ => 1 } map { split /,/, $_->{method} } grep { $class =~ $_->{regex} } @private_classes;
+ $methods{$_} = 1 for keys %private_methods;
+
+ my $also_private = eval 'qr{^' . join('|', keys %methods ) . '$}';
+
+ pod_coverage_ok $class, { also_private => [$also_private] };
+ };
+}
+
diff --git a/xt/release/pod_spelling_common.t b/xt/release/pod_spelling_common.t
new file mode 100644
index 0000000..ad8dffd
--- /dev/null
+++ b/xt/release/pod_spelling_common.t
@@ -0,0 +1,27 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Pod::Spelling::CommonMistakes'
+ unless eval q{ use Test::Pod::Spelling::CommonMistakes; 1 };
+ plan skip_all => 'test requires YAML'
+ unless eval q{ use YAML qw( LoadFile ); 1 };
+};
+use Test::Pod::Spelling::CommonMistakes;
+use FindBin;
+use File::Spec;
+
+my $config_filename = File::Spec->catfile(
+ $FindBin::Bin, 'release.yml'
+);
+
+my $config;
+$config = LoadFile($config_filename)
+ if -r $config_filename;
+
+plan skip_all => 'disabled' if $config->{pod_spelling_common}->{skip};
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+# FIXME test files in bin too.
+all_pod_files_ok;
diff --git a/xt/release/pod_spelling_system.t b/xt/release/pod_spelling_system.t
new file mode 100644
index 0000000..3773353
--- /dev/null
+++ b/xt/release/pod_spelling_system.t
@@ -0,0 +1,101 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Spelling'
+ unless eval q{ use Test::Spelling; 1 };
+ plan skip_all => 'test requires YAML'
+ unless eval q{ use YAML; 1; };
+};
+use Test::Spelling;
+use YAML qw( LoadFile );
+use FindBin;
+use File::Spec;
+
+my $config_filename = File::Spec->catfile(
+ $FindBin::Bin, 'release.yml'
+);
+
+my $config;
+$config = LoadFile($config_filename)
+ if -r $config_filename;
+
+plan skip_all => 'disabled' if $config->{pod_spelling_system}->{skip};
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+add_stopwords(@{ $config->{pod_spelling_system}->{stopwords} });
+add_stopwords(<DATA>);
+all_pod_files_spelling_ok;
+
+__DATA__
+Plicease
+stdout
+stderr
+stdin
+subref
+loopback
+username
+os
+Ollis
+Mojolicious
+plicease
+CPAN
+reinstall
+TODO
+filename
+filenames
+login
+callback
+callbacks
+standalone
+VMS
+hostname
+hostnames
+TCP
+UDP
+IP
+API
+MSWin32
+OpenBSD
+FreeBSD
+NetBSD
+unencrypted
+WebSocket
+WebSockets
+timestamp
+timestamps
+poney
+BackPAN
+portably
+RedHat
+AIX
+BSD
+XS
+FFI
+perlish
+optimizations
+subdirectory
+RESTful
+SQLite
+JavaScript
+dir
+plugins
+munge
+jQuery
+namespace
+PDF
+PDFs
+usernames
+DBI
+pluggable
+APIs
+SSL
+JSON
+YAML
+uncommented
+Solaris
+OpenVMS
+URI
+URL
+CGI
diff --git a/xt/release/release.yml b/xt/release/release.yml
new file mode 100644
index 0000000..9b3ffaf
--- /dev/null
+++ b/xt/release/release.yml
@@ -0,0 +1,22 @@
+---
+pod_spelling_system:
+ skip: 0
+ # list of words that are spelled correctly
+ # (regardless of what spell check thinks)
+ stopwords:
+ - 9x
+ - Bekman
+ - DocSet
+ - Einar
+ - Ellefsen
+ - OS2
+ - Stas
+ - Win32
+ - XP
+
+pod_coverage:
+ skip: 0
+ # format is "Class#method" or "Class", regex allowed
+ # for either Class or method.
+ private: []
+
diff --git a/xt/release/strict.t b/xt/release/strict.t
new file mode 100644
index 0000000..2dbad08
--- /dev/null
+++ b/xt/release/strict.t
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ plan skip_all => 'test requires Test::Strict'
+ unless eval q{ use Test::Strict; 1 };
+};
+use Test::Strict;
+use FindBin;
+use File::Spec;
+
+chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
+
+all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));
+
diff --git a/xt/release/version.t b/xt/release/version.t
new file mode 100644
index 0000000..c3d96c4
--- /dev/null
+++ b/xt/release/version.t
@@ -0,0 +1,44 @@
+use strict;
+use warnings;
+use Test::More;
+use FindBin ();
+BEGIN {
+
+ plan skip_all => "test requires Test::Version 2.00"
+ unless eval q{
+ use Test::Version 2.00 qw( version_all_ok ), {
+ has_version => 1,
+ filename_match => sub { $_[0] !~ m{/(ConfigData|Install/Files)\.pm$} },
+ };
+ 1
+ };
+
+ plan skip_all => "test requires Path::Class"
+ unless eval q{ use Path::Class qw( file dir ); 1 };
+ plan skip_all => 'test requires YAML'
+ unless eval q{ use YAML; 1; };
+}
+
+use YAML qw( LoadFile );
+use FindBin;
+use File::Spec;
+
+plan skip_all => "test not built yet (run dzil test)"
+ unless -e dir( $FindBin::Bin)->parent->parent->file('Makefile.PL')
+ || -e dir( $FindBin::Bin)->parent->parent->file('Build.PL');
+
+my $config_filename = File::Spec->catfile(
+ $FindBin::Bin, 'release.yml'
+);
+
+my $config;
+$config = LoadFile($config_filename)
+ if -r $config_filename;
+
+if($config->{version}->{dir})
+{
+ note "using dir " . $config->{version}->{dir}
+}
+
+version_all_ok($config->{version}->{dir} ? ($config->{version}->{dir}) : ());
+done_testing;