On Wed, Nov 22, 2017 at 09:05:41AM +0000, Alex Bennée wrote: > My hacky guess about GIT's perl use calls is: > > find . -iname "*.perl" -or -iname "*.pm" -or -iname "*.pl" | xargs grep -h "use .*::" | sort | uniq | wc -l > 88 So let us concentrate just on git-send-email.perl for now. In the Module::Extract::Use module (which happens to be what corelist uses), there's an example script called 'extract_modules' which will statically analyse a perl file and tell you the following information: % perl extract_modules ./git-send-email.perl Modules required by ./git-send-email.perl: - Authen::SASL - Cwd (first released with Perl 5) - Email::Valid - Error - File::Spec::Functions (first released with Perl 5.00504) - File::Temp (first released with Perl 5.006001) - Getopt::Long (first released with Perl 5) - Git - Git::I18N - IO::Socket::SSL - MIME::Base64 (first released with Perl 5.007003) - MIME::QuotedPrint (first released with Perl 5.007003) - Net::Domain (first released with Perl 5.007003) - Net::SMTP (first released with Perl 5.007003) - Net::SMTP::SSL - POSIX (first released with Perl 5) - Sys::Hostname (first released with Perl 5) - Term::ANSIColor (first released with Perl 5.006) - Term::ReadLine (first released with Perl 5.002) - Text::ParseWords (first released with Perl 5) - strict (first released with Perl 5) - warnings (first released with Perl 5.006) Therefore, we have the following modules which are not standard: - Email::Valid - Error - Git - Git::I18N - IO::Socket::SSL - NET::SMTP::SSL Looking at the code for git-send-email.perl, it seems most of those are eval()d at the point they're needed, which seems in many cases to be fallback responses to something we've written, or a means of ensuring we don't need to explicitly handle the case of it not being present at run-time. > Should the solution be to just make Mail::Address a hard dependency and > not have the fallback? This seems like a slight on ensuring a running script which may or may not have additional functionality depending on which modules are installed. Given the pretty good state of packaging across those platforms which Git runs on, I would argue we're now in a much better position to explicitly check for non-core modules at BEGIN{} time, and moan loudly if they're not installed. -- Thomas Adam