App-Codeowners
view release on metacpan or search on metacpan
lib/App/Codeowners/Util.pm view on Meta::CPAN
use Exporter qw(import);
use File::Codeowners::Util;
use Path::Tiny;
our @EXPORT_OK = qw(
colorstrip
find_codeowners_in_directory
find_nearest_codeowners
git_ls_files
git_toplevel
run_command
run_git
stringf
stringify
unbackslash
zip
);
our $VERSION = '0.51'; # VERSION
sub find_nearest_codeowners { goto &File::Codeowners::Util::find_nearest_codeowners }
sub find_codeowners_in_directory { goto &File::Codeowners::Util::find_codeowners_in_directory }
sub run_command { goto &File::Codeowners::Util::run_command }
sub run_git { goto &File::Codeowners::Util::run_git }
sub git_ls_files { goto &File::Codeowners::Util::git_ls_files }
sub git_toplevel { goto &File::Codeowners::Util::git_toplevel }
sub colorstrip {
my $str = shift || '';
$str =~ s/\e\[[\d;]*m//g;
return $str;
}
sub stringify {
my $item = shift;
return ref($item) eq 'ARRAY' ? join(',', @$item) : $item;
}
# The stringf code is from String::Format (thanks SREZIC), with changes:
# - Use Unicode::GCString for better Unicode character padding,
# - Strip ANSI color sequences,
# - Prevent 'Negative repeat count does nothing' warnings
sub _replace {
my ($args, $orig, $alignment, $min_width,
$max_width, $passme, $formchar) = @_;
# For unknown escapes, return the orignial
return $orig unless defined $args->{$formchar};
$alignment = '+' unless defined $alignment;
my $replacement = $args->{$formchar};
if (ref $replacement eq 'CODE') {
# $passme gets passed to subrefs.
$passme ||= "";
$passme =~ tr/{}//d;
$replacement = $replacement->($passme);
}
my $replength;
if (eval { require Unicode::GCString }) {
my $gcstring = Unicode::GCString->new(colorstrip($replacement));
$replength = $gcstring->columns;
}
else {
$replength = length colorstrip($replacement);
}
$min_width ||= $replength;
$max_width ||= $replength;
# length of replacement is between min and max
if (($replength > $min_width) && ($replength < $max_width)) {
return $replacement;
}
# length of replacement is longer than max; truncate
if ($replength > $max_width) {
return substr($replacement, 0, $max_width);
}
my $padding = $min_width - $replength;
$padding = 0 if $padding < 0;
# length of replacement is less than min: pad
if ($alignment eq '-') {
# left align; pad in front
return $replacement . ' ' x $padding;
}
# right align, pad at end
return ' ' x $padding . $replacement;
}
my $regex = qr/
(% # leading '%'
(-)? # left-align, rather than right
(\d*)? # (optional) minimum field width
(?:\.(\d*))? # (optional) maximum field width
(\{.*?\})? # (optional) stuff inside
(\S) # actual format character
)/x;
sub stringf {
my $format = shift || return;
my $args = UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ };
$args->{'n'} = "\n" unless exists $args->{'n'};
$args->{'t'} = "\t" unless exists $args->{'t'};
$args->{'%'} = "%" unless exists $args->{'%'};
( run in 0.797 second using v1.01-cache-2.11-cpan-39bf76dae61 )