Imported Upstream version 1.27 upstream/1.27
authorTizenOpenSource <tizenopensrc@samsung.com>
Wed, 14 Feb 2024 02:16:59 +0000 (11:16 +0900)
committerTizenOpenSource <tizenopensrc@samsung.com>
Wed, 14 Feb 2024 02:16:59 +0000 (11:16 +0900)
36 files changed:
Changes [new file with mode: 0644]
INSTALL [new file with mode: 0644]
LICENSE [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
META.json [new file with mode: 0644]
META.yml [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
README [new file with mode: 0644]
author.yml [new file with mode: 0644]
corpus/test-bin-unix/0 [new file with mode: 0755]
corpus/test-bin-unix/README.txt [new file with mode: 0644]
corpus/test-bin-unix/all [new file with mode: 0755]
corpus/test-bin-unix/test3 [new file with mode: 0755]
corpus/test-bin-unix/test4/foo.txt [new file with mode: 0644]
corpus/test-bin-win/0.exe [new file with mode: 0755]
corpus/test-bin-win/all.bat [new file with mode: 0755]
corpus/test-bin-win/all.exe [new file with mode: 0755]
corpus/test-bin-win/test1.exe [new file with mode: 0755]
corpus/test-bin-win/test2.bat [new file with mode: 0755]
dist.ini [new file with mode: 0644]
lib/File/Which.pm [new file with mode: 0644]
perlcriticrc [new file with mode: 0644]
t/00_diag.t [new file with mode: 0644]
t/01_use.t [new file with mode: 0644]
t/file_which.t [new file with mode: 0644]
xt/author/critic.t [new file with mode: 0644]
xt/author/eol.t [new file with mode: 0644]
xt/author/filename.t [new file with mode: 0644]
xt/author/no_tabs.t [new file with mode: 0644]
xt/author/pod.t [new file with mode: 0644]
xt/author/pod_coverage.t [new file with mode: 0644]
xt/author/pod_spelling_common.t [new file with mode: 0644]
xt/author/pod_spelling_system.t [new file with mode: 0644]
xt/author/strict.t [new file with mode: 0644]
xt/author/version.t [new file with mode: 0644]
xt/release/fixme.t [new file with mode: 0644]

diff --git a/Changes b/Changes
new file mode 100644 (file)
index 0000000..151235a
--- /dev/null
+++ b/Changes
@@ -0,0 +1,146 @@
+Revision history for File-Which
+
+1.27      2021-05-07 04:54:31 -0600
+  - Production release identical to 1.26_01
+
+1.26_01   2021-04-27 05:15:20 -0600
+  - Fix bug in test where test files sometimes didn't have
+    execute permissions (gh#31)
+  - Add Env as an explicit test prereq (gh#13, gh#32)
+
+1.25_01   2021-04-25 07:35:41 -0600
+  - Tests should now work when Perl isn't in the PATH (gh#29, gh#30)
+
+1.24      2021-03-19 05:50:14 -0600
+  - Documentation improvements
+  - Moved repository to new github org
+
+1.23      2018-12-31 14:28:16 -0500
+  - Internally use IS_WIN instead of IS_DOS for DOS/Windows style
+    operating systems.  This is 2018 (almost 2019) after all.
+    IS_DOS is now an alias for IS_WIN, although these are not public
+    interfaces so you shouldn't be using them anyway.
+
+1.22      2017-09-08 14:08:59 -0400
+  - Support for MSYS2 ($^O eq 'msys')
+
+1.21      2016-03-02 14:20:43 -0500
+  - Workaround for nutty cygwin filesystem rules
+
+1.20      2016-03-01 15:06:54 -0500
+  - Fix bug where executable named "0" would not be found (gh#7)
+
+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 (file)
index 0000000..5f751bb
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,72 @@
+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 it does not have permission to install modules to the current perl, cpanm
+will automatically set up and install to a local::lib in your home directory.
+See the local::lib documentation (https://metacpan.org/pod/local::lib) for
+details on enabling it in your environment.
+
+## 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,
+install configure prerequisites (see below), then build it:
+
+    % perl Makefile.PL
+    % make && make test
+
+Then install it:
+
+    % make install
+
+On Windows platforms, you should use `dmake` or `nmake`, instead of `make`.
+
+If your perl is system-managed, you can create a local::lib in your home
+directory to install modules to. For details, see the local::lib documentation:
+https://metacpan.org/pod/local::lib
+
+The prerequisites of this distribution will also have to be installed manually. The
+prerequisites are listed in one of the files: `MYMETA.yml` or `MYMETA.json` generated
+by running the manual build process described above.
+
+## Configure Prerequisites
+
+This distribution requires other modules to be installed before this
+distribution's installer can be run.  They can be found under the
+"configure_requires" key of META.yml or the
+"{prereqs}{configure}{requires}" key of META.json.
+
+## Other Prerequisites
+
+This distribution may require additional modules to be installed after running
+Makefile.PL.
+Look for prerequisites in the following phases:
+
+* to run make, PHASE = build
+* to use the module code itself, PHASE = runtime
+* to run tests, PHASE = test
+
+They can all be found in the "PHASE_requires" key of MYMETA.yml or the
+"{prereqs}{PHASE}{requires}" key of MYMETA.json.
+
+## Documentation
+
+File-Which documentation is available as POD.
+You can run `perldoc` from a shell to read the documentation:
+
+    % perldoc File::Which
+
+For more information on installing Perl modules via CPAN, please see:
+https://www.cpan.org/modules/INSTALL.html
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
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 (file)
index 0000000..67e32e8
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,37 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.017.
+Changes
+INSTALL
+LICENSE
+MANIFEST
+META.json
+META.yml
+Makefile.PL
+README
+author.yml
+corpus/test-bin-unix/0
+corpus/test-bin-unix/README.txt
+corpus/test-bin-unix/all
+corpus/test-bin-unix/test3
+corpus/test-bin-unix/test4/foo.txt
+corpus/test-bin-win/0.exe
+corpus/test-bin-win/all.bat
+corpus/test-bin-win/all.exe
+corpus/test-bin-win/test1.exe
+corpus/test-bin-win/test2.bat
+dist.ini
+lib/File/Which.pm
+perlcriticrc
+t/00_diag.t
+t/01_use.t
+t/file_which.t
+xt/author/critic.t
+xt/author/eol.t
+xt/author/filename.t
+xt/author/no_tabs.t
+xt/author/pod.t
+xt/author/pod_coverage.t
+xt/author/pod_spelling_common.t
+xt/author/pod_spelling_system.t
+xt/author/strict.t
+xt/author/version.t
+xt/release/fixme.t
diff --git a/META.json b/META.json
new file mode 100644 (file)
index 0000000..06303bb
--- /dev/null
+++ b/META.json
@@ -0,0 +1,79 @@
+{
+   "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 6.017, CPAN::Meta::Converter version 2.150010",
+   "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"
+         }
+      },
+      "develop" : {
+         "requires" : {
+            "File::Basename" : "0",
+            "File::Find" : "0",
+            "File::chdir" : "0",
+            "FindBin" : "0",
+            "Perl::Critic" : "0",
+            "Test2::Require::Module" : "0.000060",
+            "Test2::Tools::PerlCritic" : "0",
+            "Test2::V0" : "0.000060",
+            "Test::EOL" : "0",
+            "Test::Fixme" : "0.07",
+            "Test::More" : "0.47",
+            "Test::NoTabs" : "0",
+            "Test::Pod" : "0",
+            "Test::Pod::Coverage" : "0",
+            "Test::Pod::Spelling::CommonMistakes" : "0",
+            "Test::Spelling" : "0",
+            "Test::Strict" : "0",
+            "YAML" : "0"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "base" : "0",
+            "perl" : "5.006"
+         }
+      },
+      "test" : {
+         "requires" : {
+            "Env" : "0",
+            "Test::More" : "0.47",
+            "perl" : "5.006"
+         }
+      }
+   },
+   "release_status" : "stable",
+   "resources" : {
+      "bugtracker" : {
+         "web" : "https://github.com/uperl/File-Which/issues"
+      },
+      "homepage" : "https://metacpan.org/pod/File::Which",
+      "repository" : {
+         "type" : "git",
+         "url" : "git://github.com/uperl/File-Which.git",
+         "web" : "https://github.com/uperl/File-Which"
+      }
+   },
+   "version" : "1.27",
+   "x_generated_by_perl" : "v5.33.9",
+   "x_serialization_backend" : "Cpanel::JSON::XS version 4.26",
+   "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later",
+   "x_use_unsafe_inc" : 0
+}
+
diff --git a/META.yml b/META.yml
new file mode 100644 (file)
index 0000000..24e4cf6
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,32 @@
+---
+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:
+  Env: '0'
+  Test::More: '0.47'
+  perl: '5.006'
+configure_requires:
+  ExtUtils::MakeMaker: '0'
+  perl: '5.006'
+dynamic_config: 0
+generated_by: 'Dist::Zilla version 6.017, CPAN::Meta::Converter version 2.150010'
+license: perl
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: '1.4'
+name: File-Which
+requires:
+  base: '0'
+  perl: '5.006'
+resources:
+  bugtracker: https://github.com/uperl/File-Which/issues
+  homepage: https://metacpan.org/pod/File::Which
+  repository: git://github.com/uperl/File-Which.git
+version: '1.27'
+x_generated_by_perl: v5.33.9
+x_serialization_backend: 'YAML::Tiny version 1.73'
+x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'
+x_use_unsafe_inc: 0
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644 (file)
index 0000000..44589d0
--- /dev/null
@@ -0,0 +1,56 @@
+BEGIN {
+  use strict; use warnings;
+  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 v6.017.
+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",
+  "LICENSE" => "perl",
+  "MIN_PERL_VERSION" => "5.006",
+  "NAME" => "File::Which",
+  "PREREQ_PM" => {
+    "base" => 0
+  },
+  "TEST_REQUIRES" => {
+    "Env" => 0,
+    "Test::More" => "0.47"
+  },
+  "VERSION" => "1.27",
+  "test" => {
+    "TESTS" => "t/*.t"
+  }
+);
+
+
+my %FallbackPrereqs = (
+  "Env" => 0,
+  "Test::More" => "0.47",
+  "base" => 0
+);
+
+
+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 (file)
index 0000000..8bc61e4
--- /dev/null
+++ b/README
@@ -0,0 +1,229 @@
+NAME
+
+    File::Which - Perl implementation of the which utility as an API
+
+VERSION
+
+    version 1.27
+
+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 ME, 98, 95, 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. Similar to the where csh built-in
+    command or which -a command for platforms that support the -a option.
+    Will return an array containing all the path names matching
+    $short_exe_name.
+
+GLOBALS
+
+ $IMPLICIT_CURRENT_DIR
+
+    True if the current directory is included in the search implicitly on
+    whatever platform you are using. Normally the default is reasonable,
+    but on Windows the current directory is included implicitly for older
+    shells like cmd.exe and command.com, but not for newer shells like
+    PowerShell. If you overrule this default, you should ALWAYS localize
+    the variable to the tightest scope possible, since setting this
+    variable from a module can affect other modules. Thus on Windows you
+    can get the correct result if the user is running either cmd.exe or
+    PowerShell on Windows you can do this:
+
+     use File::Which qw( which );
+     use Shell::Guess;
+     
+     my $path = do {
+       my $is_power = Shell::Guess->running_shell->is_power;
+       local $File::Which::IMPLICIT_CURRENT_DIR = !$is_power;
+       which 'foo';
+     };
+
+    For a variety of reasons it is difficult to accurately compute the
+    shell that a user is using, but Shell::Guess makes a reasonable effort.
+
+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/uperl/File-Which/issues
+
+    For other issues, contact the maintainer.
+
+SEE ALSO
+
+    pwhich, App::pwhich
+
+      Command line interface to this module.
+
+    IPC::Cmd
+
+      Requires Perl 5.8.3. Included as part of the Perl core as of 5.9.5.
+
+      This module provides (among other things) a can_run function, which
+      is similar to which. It is a much heavier module since it does a lot
+      more, and if you use can_run it pulls in ExtUtils::MakeMaker. This
+      combination may be overkill for applications which do not need
+      IPC::Cmd's complicated interface for running programs, or do not need
+      the memory overhead required for installing Perl modules.
+
+      At least some older versions will find executables in the current
+      directory, even if the current directory is not in the search path
+      (which is the default on modern Unix).
+
+      can_run converts directory path name to the 8.3 version on Windows
+      using Win32::GetShortPathName in some cases. This is frequently
+      useful for tools that just need to run something using system in
+      scalar mode, but may be inconvenient for tools like App::pwhich where
+      user readability is a premium. Relying on Win32::GetShortPathName to
+      produce filenames without spaces is problematic, as 8.3 filenames can
+      be turned off with tweaks to the registry (see
+      https://technet.microsoft.com/en-us/library/cc959352.aspx).
+
+    Devel::CheckBin
+
+      Requires Perl 5.8.1.
+
+      This module purports to "check that a command is available", but does
+      not provide any documentation on how you might use it.
+
+      This module also relies on ExtUtils::MakeMaker so has the same
+      overhead burdens as IPC::Cmd.
+
+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/author.yml b/author.yml
new file mode 100644 (file)
index 0000000..aa1c86e
--- /dev/null
@@ -0,0 +1,23 @@
+---
+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
+    - PowerShell
+
+pod_coverage:
+  skip: 0
+  # format is "Class#method" or "Class", regex allowed
+  # for either Class or method.
+  private: []
+
diff --git a/corpus/test-bin-unix/0 b/corpus/test-bin-unix/0
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/corpus/test-bin-unix/README.txt b/corpus/test-bin-unix/README.txt
new file mode 100644 (file)
index 0000000..f7b062a
--- /dev/null
@@ -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/corpus/test-bin-unix/all b/corpus/test-bin-unix/all
new file mode 100755 (executable)
index 0000000..b76df2e
--- /dev/null
@@ -0,0 +1,2 @@
+#!bash
+# above shebang needed so Cygwin treats it as -x
\ No newline at end of file
diff --git a/corpus/test-bin-unix/test3 b/corpus/test-bin-unix/test3
new file mode 100755 (executable)
index 0000000..ef252be
--- /dev/null
@@ -0,0 +1,5 @@
+#!sh
+
+# ^ above shebang is needed for Cygwin
+echo "Just testing File::Which"
+echo "Nothing interesting here"
diff --git a/corpus/test-bin-unix/test4/foo.txt b/corpus/test-bin-unix/test4/foo.txt
new file mode 100644 (file)
index 0000000..7e34287
--- /dev/null
@@ -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/corpus/test-bin-win/0.exe b/corpus/test-bin-win/0.exe
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/corpus/test-bin-win/all.bat b/corpus/test-bin-win/all.bat
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/corpus/test-bin-win/all.exe b/corpus/test-bin-win/all.exe
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/corpus/test-bin-win/test1.exe b/corpus/test-bin-win/test1.exe
new file mode 100755 (executable)
index 0000000..3cb13a5
--- /dev/null
@@ -0,0 +1,2 @@
+DO NOT RUN THIS PROGRAM
+IT IS ONLY TO TEST File::Which
diff --git a/corpus/test-bin-win/test2.bat b/corpus/test-bin-win/test2.bat
new file mode 100755 (executable)
index 0000000..fdaae7c
--- /dev/null
@@ -0,0 +1,3 @@
+@echo off\r
+echo This is for testing File::Which\r
+echo Nothing interesting here!
\ No newline at end of file
diff --git a/dist.ini b/dist.ini
new file mode 100644 (file)
index 0000000..807dd28
--- /dev/null
+++ b/dist.ini
@@ -0,0 +1,37 @@
+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.27
+
+[@Author::Plicease]
+:version           = 2.44
+release_tests      = 1
+installer          = MakeMaker
+release_tests_skip = changes\.t
+upgrade            = Test::More = 0.47
+github_user        = uperl
+workflow           = linux
+workflow           = windows
+workflow           = macos
+workflow           = msys2-mingw
+workflow           = cygwin
+
+[RemovePrereqs]
+remove = strict
+remove = warnings
+remove = constant
+remove = Exporter
+remove = File::Spec
+
+[Author::Plicease::Upload]
+cpan = 1
+
+[OnlyCorePrereqs]
+starting_version = 5.006002
+
+[PruneFiles]
+filename = xt/release/changes.t
diff --git a/lib/File/Which.pm b/lib/File/Which.pm
new file mode 100644 (file)
index 0000000..c2f6a8e
--- /dev/null
@@ -0,0 +1,398 @@
+package File::Which;
+
+use strict;
+use warnings;
+use base qw( Exporter );
+use File::Spec ();
+
+# ABSTRACT: Perl implementation of the which utility as an API
+our $VERSION = '1.27'; # VERSION
+
+
+our @EXPORT    = 'which';
+our @EXPORT_OK = 'where';
+
+use constant IS_VMS => ($^O eq 'VMS');
+use constant IS_MAC => ($^O eq 'MacOS');
+use constant IS_WIN => ($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'os2');
+use constant IS_DOS => IS_WIN();
+use constant IS_CYG => ($^O eq 'cygwin' || $^O eq 'msys');
+
+our $IMPLICIT_CURRENT_DIR = IS_WIN || IS_VMS || IS_MAC;
+
+# 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_WIN ) {
+  # 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 defined $exec;
+  return undef if $exec eq '';
+
+  my $all = wantarray;  ## no critic (Freenode::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  ## no critic (ValuesAndExpressions::ProhibitMixedBooleanOperators)
+          if !IS_VMS and !IS_MAC and !IS_WIN and $exec =~ /\// and -f $exec and -x $exec;
+
+  my @path;
+  if($^O eq 'MSWin32') {
+    # File::Spec (at least recent versions)
+    # add the implicit . for you on MSWin32,
+    # but we may or may not want to include
+    # that.
+    @path = split /;/, $ENV{PATH};
+    s/"//g for @path;
+    @path = grep length, @path;
+  } else {
+    @path = File::Spec->path;
+  }
+  if ( $IMPLICIT_CURRENT_DIR ) {
+    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  ## no critic (ValuesAndExpressions::ProhibitMixedBooleanOperators)
+          ||
+          (
+            ( IS_WIN or IS_CYG )
+            and
+            grep {   ## no critic (BuiltinFunctions::ProhibitBooleanGrep)
+              $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.27
+
+=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 ME, 98, 95, 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.  Similar to the C<where> csh
+built-in command or C<which -a> command for platforms that support the
+C<-a> option. Will return an array containing all the path names
+matching C<$short_exe_name>.
+
+=head1 GLOBALS
+
+=head2 $IMPLICIT_CURRENT_DIR
+
+True if the current directory is included in the search implicitly on
+whatever platform you are using.  Normally the default is reasonable,
+but on Windows the current directory is included implicitly for older
+shells like C<cmd.exe> and C<command.com>, but not for newer shells
+like PowerShell.  If you overrule this default, you should ALWAYS
+localize the variable to the tightest scope possible, since setting
+this variable from a module can affect other modules.  Thus on Windows
+you can get the correct result if the user is running either C<cmd.exe>
+or PowerShell on Windows you can do this:
+
+ use File::Which qw( which );
+ use Shell::Guess;
+ my $path = do {
+   my $is_power = Shell::Guess->running_shell->is_power;
+   local $File::Which::IMPLICIT_CURRENT_DIR = !$is_power;
+   which 'foo';
+ };
+
+For a variety of reasons it is difficult to accurately compute the
+shell that a user is using, but L<Shell::Guess> makes a reasonable
+effort.
+
+=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/uperl/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>
+
+Requires Perl 5.8.3.  Included as part of the Perl core as of 5.9.5.
+
+This module provides (among other things) a C<can_run> function, which is
+similar to C<which>.  It is a much heavier module since it does a lot more,
+and if you use C<can_run> it pulls in L<ExtUtils::MakeMaker>.  This combination
+may be overkill for applications which do not need L<IPC::Cmd>'s complicated
+interface for running programs, or do not need the memory overhead required
+for installing Perl modules.
+
+At least some older versions will find executables in the current directory,
+even if the current directory is not in the search path (which is the default
+on modern Unix).
+
+C<can_run> converts directory path name to the 8.3 version on Windows using
+C<Win32::GetShortPathName> in some cases.  This is frequently useful for tools
+that just need to run something using C<system> in scalar mode, but may be
+inconvenient for tools like L<App::pwhich> where user readability is a premium.
+Relying on C<Win32::GetShortPathName> to produce filenames without spaces
+is problematic, as 8.3 filenames can be turned off with tweaks to the
+registry (see L<https://technet.microsoft.com/en-us/library/cc959352.aspx>).
+
+=item L<Devel::CheckBin>
+
+Requires Perl 5.8.1.
+
+This module purports to "check that a command is available", but does not
+provide any documentation on how you might use it.
+
+This module also relies on L<ExtUtils::MakeMaker> so has the same overhead
+burdens as L<IPC::Cmd>.
+
+=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/perlcriticrc b/perlcriticrc
new file mode 100644 (file)
index 0000000..c6805fd
--- /dev/null
@@ -0,0 +1,59 @@
+severity = 1
+only = 1
+
+[Freenode::ArrayAssignAref]
+[Freenode::BarewordFilehandles]
+[Freenode::ConditionalDeclarations]
+[Freenode::ConditionalImplicitReturn]
+[Freenode::DeprecatedFeatures]
+[Freenode::DiscouragedModules]
+[Freenode::DollarAB]
+[Freenode::Each]
+[Freenode::EmptyReturn]
+[Freenode::IndirectObjectNotation]
+[Freenode::LexicalForeachIterator]
+[Freenode::LoopOnHash]
+[Freenode::ModPerl]
+[Freenode::OpenArgs]
+[Freenode::OverloadOptions]
+[Freenode::POSIXImports]
+[Freenode::PackageMatchesFilename]
+[Freenode::PreferredAlternatives]
+[Freenode::StrictWarnings]
+extra_importers = Test2::V0
+[Freenode::Threads]
+[Freenode::Wantarray]
+[Freenode::WarningsSwitch]
+[Freenode::WhileDiamondDefaultAssignment]
+
+[BuiltinFunctions::ProhibitBooleanGrep]
+[BuiltinFunctions::ProhibitStringyEval]
+[BuiltinFunctions::ProhibitStringySplit]
+[BuiltinFunctions::ProhibitVoidGrep]
+[BuiltinFunctions::ProhibitVoidMap]
+[ClassHierarchies::ProhibitExplicitISA]
+[ClassHierarchies::ProhibitOneArgBless]
+[CodeLayout::ProhibitHardTabs]
+allow_leading_tabs = 0
+[CodeLayout::ProhibitTrailingWhitespace]
+[CodeLayout::RequireConsistentNewlines]
+[ControlStructures::ProhibitLabelsWithSpecialBlockNames]
+[ControlStructures::ProhibitMutatingListFunctions]
+[ControlStructures::ProhibitUnreachableCode]
+[InputOutput::ProhibitBarewordFileHandles]
+[InputOutput::ProhibitJoinedReadline]
+[InputOutput::ProhibitTwoArgOpen]
+[Miscellanea::ProhibitFormats]
+[Miscellanea::ProhibitUselessNoCritic]
+[Modules::ProhibitConditionalUseStatements]
+;[Modules::RequireEndWithOne]
+[Modules::RequireNoMatchVarsWithUseEnglish]
+[Objects::ProhibitIndirectSyntax]
+[RegularExpressions::ProhibitUselessTopic]
+[Subroutines::ProhibitNestedSubs]
+[ValuesAndExpressions::ProhibitLeadingZeros]
+[ValuesAndExpressions::ProhibitMixedBooleanOperators]
+[ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator]
+[ValuesAndExpressions::RequireUpperCaseHeredocTerminator]
+[Variables::ProhibitPerl4PackageNames]
+[Variables::ProhibitUnusedVariables]
diff --git a/t/00_diag.t b/t/00_diag.t
new file mode 100644 (file)
index 0000000..6c08919
--- /dev/null
@@ -0,0 +1,85 @@
+use strict;
+use warnings;
+use Config;
+use Test::More tests => 1;
+
+# This .t file is generated.
+# make changes instead to dist.ini
+
+my %modules;
+my $post_diag;
+
+$modules{$_} = $_ for qw(
+  Env
+  ExtUtils::MakeMaker
+  Test::More
+);
+
+
+
+my @modules = sort keys %modules;
+
+sub spacer ()
+{
+  diag '';
+  diag '';
+  diag '';
+}
+
+pass 'okay';
+
+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', "$] $^O $Config{archname}";
+
+foreach my $module (@modules)
+{
+  my $pm = "$module.pm";
+  $pm =~ s{::}{/}g;
+  if(eval { require $pm; 1 })
+  {
+    my $ver = eval { $module->VERSION };
+    $ver = 'undef' unless defined $ver;
+    diag sprintf $format, $module, $ver;
+  }
+  else
+  {
+    diag sprintf $format, $module, '-';
+  }
+}
+
+if($post_diag)
+{
+  spacer;
+  $post_diag->();
+}
+
+spacer;
+
diff --git a/t/01_use.t b/t/01_use.t
new file mode 100644 (file)
index 0000000..342ab47
--- /dev/null
@@ -0,0 +1,5 @@
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+use_ok( 'File::Which' );
diff --git a/t/file_which.t b/t/file_which.t
new file mode 100644 (file)
index 0000000..d398249
--- /dev/null
@@ -0,0 +1,161 @@
+use strict;
+use warnings;
+use Env qw( @PATH );
+use Test::More tests => 19;
+use File::Spec ();
+use File::Which qw(which where);
+
+unless (File::Which::IS_VMS or File::Which::IS_MAC or File::Which::IS_WIN ) {
+  foreach my $path (qw(
+                    corpus/test-bin-unix/test3
+                    corpus/test-bin-unix/all
+                    corpus/test-bin-unix/0
+                    corpus/test-bin-win/0.exe
+                    corpus/test-bin-win/all.bat
+                    corpus/test-bin-win/all.exe
+                    corpus/test-bin-win/test1.exe
+                    corpus/test-bin-win/test2.bat
+  )) {
+    chmod 0755, $path;
+  }
+}
+
+{
+
+  local $ENV{PATH} = $ENV{PATH};
+
+  # 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( 'corpus', File::Which::IS_WIN ? 'test-bin-win' : 'test-bin-unix' );
+  ok( -d $test_bin, 'Found test-bin' );
+
+  # Set up for running the test application
+  @PATH = $test_bin;
+  push @PATH, File::Spec->catdir( 'corpus', 'test-bin-win' ) if File::Which::IS_CYG;
+
+  SKIP: {
+    skip("Not on DOS-like filesystem", 3) unless File::Which::IS_WIN;
+    is( lc scalar which('test1'), 'corpus\test-bin-win\test1.exe', 'Looking for test1.exe' );
+    is( lc scalar which('test2'), 'corpus\test-bin-win\test2.bat', 'Looking for test2.bat' );
+    is( scalar which('test3'), undef, 'test3 returns undef' );
+  }
+
+  SKIP: {
+    skip("Not on a UNIX filesystem", 1) if File::Which::IS_WIN;
+    skip("Not on a UNIX filesystem", 1) if File::Which::IS_MAC;
+    skip("Not on a UNIX filesystem", 1) if File::Which::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 File::Which::IS_CYG;
+
+    # Cygwin: should make test1.exe transparent
+    is(
+      scalar(which('test1')),
+      File::Spec->catfile( 'corpus', 'test-bin-win', '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 ( File::Which::IS_WIN or File::Which::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',
+    );
+    chdir File::Spec->updir;
+    chdir File::Spec->updir;
+  }
+
+}
+
+{
+
+  local $ENV{PATH} = $ENV{PATH};
+
+  # Where is the test application
+  my $test_bin = File::Spec->catdir( 'corpus', $^O =~ /^(MSWin32|dos|os2)$/ ? 'test-bin-win' : 'test-bin-unix' );
+  ok( -d $test_bin, 'Found test-bin' );
+
+  # Set up for running the test application
+  @PATH = ($test_bin);
+  push @PATH, File::Spec->catdir( 'corpus', 'test-bin-win' ) if $^O =~ /^(cygwin|msys)$/;
+
+  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',
+  );
+
+  my $zero = which '0';
+
+  ok(
+    $zero,
+    "zero = $zero"
+  );
+
+  my $empty_string = which '';
+
+  is(
+    $empty_string,
+    undef,
+    "empty string"
+  );
+
+}
+
+# Look for Perl itself
+SKIP: {
+  local $ENV{PATH} = $ENV{PATH};
+  my $tool;
+
+  {
+    my ($volume,$directories,$file) = File::Spec->splitpath($^X);
+    $tool = $file;
+    my $dir = File::Spec->catpath($volume, $directories);
+    if(defined $dir && length $dir)
+    {
+      #diag "temporarily adding $dir to PATH";
+      push @PATH, $dir;
+    }
+  }
+
+  skip("Not able to find the name of Perl", 3) unless defined $tool;
+
+  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/xt/author/critic.t b/xt/author/critic.t
new file mode 100644 (file)
index 0000000..0c03a4f
--- /dev/null
@@ -0,0 +1,14 @@
+use Test2::Require::Module 'Test2::Tools::PerlCritic';
+use Test2::Require::Module 'Perl::Critic';
+use Test2::Require::Module 'Perl::Critic::Freenode';
+use Test2::V0;
+use Perl::Critic;
+use Test2::Tools::PerlCritic;
+
+my $critic = Perl::Critic->new(
+  -profile => 'perlcriticrc',
+);
+
+perl_critic_ok ['lib','t'], $critic;
+
+done_testing;
diff --git a/xt/author/eol.t b/xt/author/eol.t
new file mode 100644 (file)
index 0000000..801ee44
--- /dev/null
@@ -0,0 +1,16 @@
+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/author/filename.t b/xt/author/filename.t
new file mode 100644 (file)
index 0000000..1643eb8
--- /dev/null
@@ -0,0 +1,22 @@
+use Test2::V0 -no_srand => 1;
+use File::chdir;
+use File::Find qw( find );
+use File::Basename qw( basename );
+
+my $basename = basename $CWD;
+
+my $dev = $basename =~ /^([A-Z]+)(-[A-Z]+)*$/i;
+
+local $CWD = '..';
+
+find(sub {
+  my $path = $File::Find::name;
+  return if $path =~ /^$basename\/\./;
+  return if $dev && $path =~ /^$basename\/$basename-/;
+  my $length = length($path);
+  cmp_ok $length, '<', 100, "$path";
+}, $basename);
+
+note "dev = $dev";
+
+done_testing;
diff --git a/xt/author/no_tabs.t b/xt/author/no_tabs.t
new file mode 100644 (file)
index 0000000..e990e72
--- /dev/null
@@ -0,0 +1,16 @@
+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/author/pod.t b/xt/author/pod.t
new file mode 100644 (file)
index 0000000..186707f
--- /dev/null
@@ -0,0 +1,16 @@
+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/author/pod_coverage.t b/xt/author/pod_coverage.t
new file mode 100644 (file)
index 0000000..2dc4e1c
--- /dev/null
@@ -0,0 +1,77 @@
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+  plan skip_all => 'test requires 5.010 or better'
+    unless $] >= 5.010;
+  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; };
+  plan skip_all => 'test does not always work in cip check'
+    if defined $ENV{CIPSTATIC} && $ENV{CIPSTATIC} eq 'true';
+};
+use Test::Pod::Coverage;
+use YAML qw( LoadFile );
+use FindBin;
+use File::Spec;
+
+my $config_filename = File::Spec->catfile(
+  $FindBin::Bin, File::Spec->updir, File::Spec->updir, 'author.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/author/pod_spelling_common.t b/xt/author/pod_spelling_common.t
new file mode 100644 (file)
index 0000000..2bd36be
--- /dev/null
@@ -0,0 +1,29 @@
+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, File::Spec->updir, File::Spec->updir, 'author.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));
+
+# TODO: test files in bin too.
+all_pod_files_ok;
+
+
diff --git a/xt/author/pod_spelling_system.t b/xt/author/pod_spelling_system.t
new file mode 100644 (file)
index 0000000..52d2857
--- /dev/null
@@ -0,0 +1,102 @@
+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, File::Spec->updir, File::Spec->updir, 'author.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(qw(
+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
+));
+all_pod_files_spelling_ok;
+
+
diff --git a/xt/author/strict.t b/xt/author/strict.t
new file mode 100644 (file)
index 0000000..d5146f0
--- /dev/null
@@ -0,0 +1,23 @@
+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));
+
+unshift @Test::Strict::MODULES_ENABLING_STRICT,
+  'ozo',
+  'Test2::Bundle::SIPS',
+  'Test2::V0',
+  'Test2::Bundle::Extended';
+note "enabling strict = $_" for @Test::Strict::MODULES_ENABLING_STRICT;
+
+all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));
+
+
diff --git a/xt/author/version.t b/xt/author/version.t
new file mode 100644 (file)
index 0000000..7638e80
--- /dev/null
@@ -0,0 +1,39 @@
+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 YAML'
+    unless eval q{ use YAML; 1; };
+}
+
+use YAML qw( LoadFile );
+use FindBin;
+use File::Spec;
+
+my $config_filename = File::Spec->catfile(
+  $FindBin::Bin, File::Spec->updir, File::Spec->updir, 'author.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;
+
diff --git a/xt/release/fixme.t b/xt/release/fixme.t
new file mode 100644 (file)
index 0000000..f1f17de
--- /dev/null
@@ -0,0 +1,20 @@
+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 Build.PL )],
+  warn  => 1,
+);
+
+