File Coverage

script/envdot
Criterion Covered Total %
statement 70 71 98.5
branch 16 26 61.5
condition 1 2 50.0
subroutine 12 12 100.0
pod n/a
total 99 111 89.1


line stmt bran cond sub pod time code
1             #!/usr/bin/env perl
2             ## no critic (ControlStructures::ProhibitPostfixControls)
3             ## no critic (ValuesAndExpressions::ProhibitConstantPragma)
4 8     8   34654 use strict;
  8         13  
  8         279  
5 8     8   33 use warnings;
  8         11  
  8         520  
6 8     8   3075 use open ':std', IO => ':encoding(UTF-8)';
  8         10416  
  8         44  
7              
8             # ABSTRACT: Read .env file and turn its content into environment variables for different shells.
9              
10             # PODNAME: envdot
11              
12 8         538546 our $VERSION = '0.017_002'; # TRIAL VERSION: generated by DZP::OurPkgVersion
13              
14 8     8   171937 use English qw( -no_match_vars ); # Avoids regex performance penalty in perl 5.18 and earlier
  8         26713  
  8         52  
15 8     8   8738 use Getopt::Long qw( :config auto_version auto_help );
  8         128935  
  8         66  
16 8     8   1816 use Carp;
  8         15  
  8         527  
17 8     8   45 use Errno;
  8         13  
  8         297  
18 8     8   4313 use Pod::Usage;
  8         369294  
  8         1056  
19              
20 8     8   4250 use Env::Dot::Functions qw(:all);
  8         28  
  8         1226  
21 8     8   3640 use Env::Dot::ScriptFunctions qw( convert_variables_into_commands );
  8         31  
  8         876  
22              
23 8         59 local $OUTPUT_AUTOFLUSH = 1;
24              
25             use constant {
26 8 50       525805 DEFAULT_OPTION_DOTENV_FILENAME => '.env',
    50          
27             DEFAULT_OPTION_SHELL => q{sh},
28             DEFAULT_OPTION_READ_FROM_STDIN => 0,
29             EXIT_SUCCESS => 0,
30             EXIT_ERROR_NO_FILE => ( exists &Errno::ENOENT ? Errno::ENOENT : 255 ),
31             EXIT_ERROR_OTHER_ERROR => ( exists &Errno::EINVAL ? Errno::EINVAL : 255 ),
32 8     8   62 };
  8         13  
33              
34 8         69 my %SHELL_ALTERNATIVES = (
35             sh => 'sh',
36             bash => 'sh',
37             dash => 'sh',
38             ksh => 'sh',
39             csh => 'csh',
40             tcsh => 'csh',
41             fish => 'fish',
42             );
43              
44 8         15 my $man = 0;
45 8         12 my $export = 1;
46 8   50     799 my $shell = $SHELL_ALTERNATIVES{ $ENV{SHELL} } // DEFAULT_OPTION_SHELL;
47 8         23 my $dotenv_filepath = DEFAULT_OPTION_DOTENV_FILENAME;
48 8         11 my $read_from_stdin = DEFAULT_OPTION_READ_FROM_STDIN;
49 8 50       56 GetOptions(
50             'man' => \$man,
51             'export!' => \$export,
52             'shell|s=s' => \$shell,
53             'dotenv|e=s' => \$dotenv_filepath,
54             '' => \$read_from_stdin, ## no critic (ValuesAndExpressions::ProhibitEmptyQuotes)
55             ) or pod2usage(2);
56 6 50       4627 pod2usage( -exitval => 0, -verbose => 2 ) if $man;
57              
58             sub main {
59 6     6   32 my $var_name = get_envdot_filepaths_var_name();
60 6         7 my @dotenv_filepaths;
61 6 100       24 if ( exists $ENV{$var_name} ) {
    50          
62 2         9 @dotenv_filepaths = interpret_dotenv_filepath_var( $ENV{$var_name} );
63             }
64             elsif ($read_from_stdin) {
65 0         0 croak 'Error: Option not implemented';
66             }
67             else {
68 4 100       128 if ( !-f $dotenv_filepath ) {
69 1 50       1 print {*STDERR} "Error: File not found: '$dotenv_filepath'\n"
  1         7  
70             or croak 'Cannot print error message';
71 1         0 return EXIT_ERROR_NO_FILE;
72             }
73 3         7 @dotenv_filepaths = ($dotenv_filepath); # The CLI parameter
74             }
75              
76 5         7 my @vars;
77 5         11 foreach my $dotenv_filepath ( reverse @dotenv_filepaths ) {
78 5         8 local $EVAL_ERROR = undef;
79 5         6 my @these_vars;
80 5 100       8 eval { @these_vars = get_dotenv_vars($dotenv_filepath); 1; } or do {
  5         18  
  4         11  
81 1         2 my $e = $EVAL_ERROR;
82 1         8 my ( $err, $l, $fp ) = extract_error_msg($e);
83 1 50       2 print {*STDERR} 'Error: ' . $err . ( $l ? qq{ line $l} : q{} ) . ( $fp ? qq{ file '$fp'} : q{} ) . "\n"
  1 50       10  
    50          
84             or croak 'Cannot print error message';
85 1         0 return EXIT_ERROR_OTHER_ERROR;
86             };
87 4         10 push @vars, @these_vars;
88             }
89 4         14 $_->{'opts'}->{'export'} = $export foreach (@vars);
90              
91 4 50       4 print {*STDOUT} convert_variables_into_commands( $shell, @vars )
  4         24  
92             or croak 'Cannot print variables to STDOUT';
93              
94 4           return EXIT_SUCCESS;
95             }
96              
97 6         26 exit main(@ARGV);
98              
99             __END__