Factor out parsing of options

Why:

* Want to be able to selectively apply filepath expansion to:
    1. Only options in a stowrc file.
    2. Only options that take a file path.

* Because of need 1, any expansion must be performed on stowrc options
  before merging with cli options.

* Because of need 2, stowrc options need to be parsed before expansion
  in order to know which options need expanding.

This change addresses the need by:

* Create parse_options()
    * Implements option parsing logic previously in process_options()
    * Takes an array as parameter instead of assuming ARGV
* Edit process_options() to still work as expected.
    * Only change was to call parse_options() instead of directly
      parsing ARGV

* By factoring out the option parsing code, we can reuse the existing
  parsing code for stowrc options.
    * Allows expansion of only the option itself, i.e expansion on
      "$HOME/target" rather than "--target=$HOME/target"
    * Allows easy determination of which options need expansion.
This commit is contained in:
Charles LeDoux 2016-06-24 16:34:13 -05:00 committed by Adam Spiers
parent ebc895a540
commit feb885fda6

View file

@ -432,7 +432,7 @@ use warnings;
require 5.006_001; require 5.006_001;
use POSIX qw(getcwd); use POSIX qw(getcwd);
use Getopt::Long; use Getopt::Long qw(GetOptionsFromArray);
@USE_LIB_PMDIR@ @USE_LIB_PMDIR@
use Stow; use Stow;
@ -481,23 +481,49 @@ sub main {
#===== SUBROUTINE =========================================================== #===== SUBROUTINE ===========================================================
# Name : process_options() # Name : process_options()
# Purpose : parse command line options # Purpose : Parse and process command line and .stowrc file options
# Parameters: none # Parameters: none
# Returns : (\%options, \@pkgs_to_unstow, \@pkgs_to_stow) # Returns : (\%options, \@pkgs_to_unstow, \@pkgs_to_stow)
# Throws : a fatal error if a bad command line option is given # Throws : a fatal error if a bad option is given
# Comments : checks @ARGV for valid package names # Comments : checks @ARGV for valid package names
#============================================================================ #============================================================================
sub process_options { sub process_options {
unshift @ARGV, get_config_file_options();
#$,="\n"; print @ARGV,"\n"; # for debugging rc file
my ($options,
$pkgs_to_unstow,
$pkgs_to_stow) = parse_options(@ARGV);
sanitize_path_options($options);
check_packages($pkgs_to_unstow, $pkgs_to_stow);
return ($options, $pkgs_to_unstow, $pkgs_to_stow);
}
#===== SUBROUTINE ===========================================================
# Name : parse_options()
# Purpose : parse command line options
# Parameters: @arg_array => array of options to parse
# Example: parse_options(@ARGV)
# Returns : (\%options, \@pkgs_to_unstow, \@pkgs_to_stow)
# Throws : a fatal error if a bad command line option is given
# Comments : Used for parsing both command line options and rc file. Used
# for parsing only. Sanity checks and post-processing belong in
# process_options().
#============================================================================
sub parse_options {
my %options = (); my %options = ();
my @pkgs_to_unstow = (); my @pkgs_to_unstow = ();
my @pkgs_to_stow = (); my @pkgs_to_stow = ();
my $action = 'stow'; my $action = 'stow';
unshift @ARGV, get_config_file_options(); #$,="\n"; print @_,"\n"; # for debugging rc file
#$,="\n"; print @ARGV,"\n"; # for debugging rc file
Getopt::Long::config('no_ignore_case', 'bundling', 'permute'); Getopt::Long::config('no_ignore_case', 'bundling', 'permute');
GetOptions( GetOptionsFromArray(
\@_,
\%options, \%options,
'verbose|v:+', 'help|h', 'simulate|n|no', 'verbose|v:+', 'help|h', 'simulate|n|no',
'version|V', 'compat|p', 'dir|d=s', 'target|t=s', 'version|V', 'compat|p', 'dir|d=s', 'target|t=s',
@ -548,12 +574,8 @@ sub process_options {
usage() if $options{help}; usage() if $options{help};
version() if $options{version}; version() if $options{version};
sanitize_path_options(\%options);
check_packages(\@pkgs_to_unstow, \@pkgs_to_stow);
return (\%options, \@pkgs_to_unstow, \@pkgs_to_stow); return (\%options, \@pkgs_to_unstow, \@pkgs_to_stow);
} }
sub sanitize_path_options { sub sanitize_path_options {
my ($options) = @_; my ($options) = @_;