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:
parent
ebc895a540
commit
feb885fda6
1 changed files with 32 additions and 10 deletions
42
bin/stow.in
42
bin/stow.in
|
@ -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) = @_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue