App-cpan2arch
view release on metacpan or search on metacpan
t/01-offline.t view on Meta::CPAN
'return value (success)',
);
}
# Failed comparison
{
my $ret = $c2a->_comp_vers( $v->{ver_b}, $v->{ver_a}, $v->{op} );
is(
$ret, undef,
'return value (undef)',
);
}
};
}
};
subtest 'PKGBUILD generation' => sub {
#skip_all;
my %env = (
packager => $DEFS{packager},
#debug => true,
);
foreach my ( $dist, $data ) ( $expected->%* ) {
subtest $dist => sub {
note( $data->{note} );
my $c2a = App::cpan2arch->new;
# Fake necessary data for generation.
$c2a->set_env(%env);
$c2a->set_meta( $data->{meta}->%* );
$c2a->set_arch_prereqs( $data->{arch_prereqs}->%* );
$c2a->generate_pkgbuild;
my %pkgbuild = $c2a->pkgbuild;
test_diff(
$pkgbuild{output}, $data->{pkgbuild},
'generated PKGBUILD',
);
}
}
};
# Test output behavior from generated PKGBUILD.
subtest 'PKGBUILD output' => sub {
#skip_all;
my $DIST = 'Regexp-Debugger';
my %FILES = (
outfile => 'PKGBUILD',
metadata => '.SRCINFO',
);
my %TESTS_OUT = (
'--update' => {
normal_ver => 'PKGBUILD + version updated',
normal_ver_no_pkger => 'PKGBUILD updated + version updated + co-maintainer not preserved',
normal_bump => 'PKGBUILD updated + pkgrel bumped',
normal_comp => '.SRCINFO != generated metadata',
normal_epoch => 'PKGBUILD updated + preserve epoch',
epoch_add => 'PKGBUILD updated + add epoch',
epoch_bump => 'PKGBUILD updated + bump epoch',
epoch_vercmp => 'no vercmp',
no_files => 'no .SRCINFO or PKGBUILD',
no_vars => 'no pkgbase/pkgver/pkgrel in .SRCINFO',
bogus_pkgbase => '.SRCINFO pkgbase != generated pkgbase',
bogus_pkgver => '.SRCINFO pkgver is newer than generated pkgver',
bogus_pkgrel => '.SRCINFO pkgrel != number',
},
'--write' => {
nothing => 'no PKGBUILD',
normal => '--write',
no_force => '--write + file exists',
force => '--write + --force + file exists',
},
'STDOUT' => 'no opts',
);
foreach my ( $opt, $info ) (%TESTS_OUT) {
subtest $opt => sub {
if ( $opt eq '--update' ) {
my $CONTRIBS = <<~'END';
# Maintainer: Alice <alice@domain.tld>
# Contributor: Bob <bob@domain.tld>
END
my %env = (
packager => $DEFS{packager},
#debug => true,
);
my %SRCINFO = (
default => <<~'END',
pkgbase = perl-regexp-debugger
pkgdesc = Visually debug regexes in-place
pkgver = 0.002007
pkgrel = 1
url = https://metacpan.org/dist/Regexp-Debugger
arch = any
license = unknown
makedepends = perl-extutils-makemaker
depends = perl-test-simple
depends = perl-version
depends = perl>=5.10.1
options = !emptydirs
source = https://cpan.metacpan.org/authors/id/D/DC/DCONWAY/Regexp-Debugger-0.002007.tar.gz
sha256sums = db096cf2e0e1e6127dacc40be6fbd526aa5ad41886a5bae00f4fe6a53a6c6ffb
pkgname = perl-regexp-debugger
END
);
$SRCINFO{normal_ver} = $SRCINFO{normal_ver_no_pkger} =
$SRCINFO{default} =~ s{^\tpkgver = \K[^\n]+$}{0.002006}mr;
$SRCINFO{normal_bump} = $SRCINFO{default};
$SRCINFO{normal_comp} = $SRCINFO{default} =~ s{^\tpkgdesc = \K[^\n]+$}{Bogus abstract}mr;
$SRCINFO{normal_comp} =~ s{^\tpkgrel = \K[^\n]+$}{2}m;
$SRCINFO{normal_comp} =~ s{^\tdepends = perl-test-simple\n}{}m;
$SRCINFO{normal_comp} =~ s{(?=^\tmakedepends = )}{\tcheckdepends = perl-test-simple\n}m;
$SRCINFO{normal_comp}
=~ s{(?=^\tdepends = )}{\tdepends = perl-list-compare\n\tdepends = perl-capture-tiny\n}m;
$SRCINFO{normal_comp}
=~ s{^\tsha256sums = [^\n]+$}{\tmd5sums = 65b0f7984e0c176dcd640973a8fb6581}m;
$SRCINFO{normal_epoch} = $SRCINFO{default} =~ s{^\tpkgrel = [^\n]+\n\K}{\tepoch = 1\n}mr;
$SRCINFO{epoch_add} = $SRCINFO{epoch_bump} = $SRCINFO{epoch_vercmp} =
$SRCINFO{default} =~ s{^\tpkgver = \K[^\n]+$}{0.002006111}mr;
$SRCINFO{epoch_bump} =~ s{^\tpkgrel = [^\n]+\n\K}{\tepoch = 1\n}m;
$SRCINFO{bogus_pkgbase} = $SRCINFO{default} =~ s{\Apkgbase = \K[^\n]+$}{perl-bogus}mr;
$SRCINFO{bogus_pkgver} = $SRCINFO{default} =~ s{^\tpkgver = \K[^\n]+$}{99999}mr;
$SRCINFO{bogus_pkgrel} = $SRCINFO{default} =~ s{^\tpkgrel = \K[^\n]+$}{bogus}mr;
my $PROG = path($0)->basename;
# Expected metadata comparison
my $comparison = <<~"END";
$PROG: .SRCINFO is different than generated metadata
Metadata comparison
+--------------+-------------------+-------------------+-------------------+
| Variable | .SRCINFO | Generated | Status |
+--------------+-------------------+-------------------+-------------------+
| sha256sums | N/A | - | Missing from .SRC |
| | | | INFO |
| | | | |
| checkdepends | - | N/A | Missing from Gene |
| | | | rated |
| | | | |
| md5sums | - | N/A | Missing from Gene |
| | | | rated |
| | | | |
| checkdepends | perl-test-simple | - | Only in .SRCINFO |
| | | | |
| depends | perl-capture-tiny | - | Only in .SRCINFO |
| | , perl-list-compa | | |
| | re | | |
| | | | |
| md5sums | 65b0f7984e0c176dc | - | Only in .SRCINFO |
| | d640973a8fb6581 | | |
| | | | |
| depends | - | perl-test-simple | Only in Generated |
| | | | |
| sha256sums | - | db096cf2e0e1e6127 | Only in Generated |
| | | dacc40be6fbd526aa | |
| | | 5ad41886a5bae00f4 | |
| | | fe6a53a6c6ffb | |
| | | | |
| pkgdesc | Bogus abstract | Visually debug re | Differs |
| | | gexes in-place | |
+--------------+-------------------+-------------------+-------------------+
END
# Expected updated PKGBUILD
my $updated_default;
{
$updated_default = $expected->{$DIST}{pkgbuild} =~ s{
\A
\#\ Maintainer:\ [^\n]+\n
\K
}
{$CONTRIBS}xr;
}
foreach my ( $t, $name ) ( $info->%* ) {
subtest "$t ($name)" => sub {
my $TODO;
$TODO = todo 'This test fails when vercmp is not installed'
if ( ( $t =~ /\Anormal_ver_?/ || $t =~ /\Aepoch_/ ) && !can_run('vercmp') );
my $c2a = App::cpan2arch->new;
$c2a->_process_opts( [ qw< --update >, $FAKE{mod} ] );
# Fake necessary data for generation.
$c2a->set_env(%env);
$c2a->set_meta( $expected->{$DIST}{meta}->%* );
$c2a->set_arch_prereqs( $expected->{$DIST}{arch_prereqs}->%* );
$c2a->generate_pkgbuild;
my %pkgbuild = $c2a->pkgbuild;
# Emulate current dir behavior.
my $cwd = Path::Tiny->cwd;
my $temp = Path::Tiny->tempdir;
chdir $temp or die $!;
if ( $t eq 'normal_ver_no_pkger' ) {
# Exclude PACKAGER from top/current maintainer.
$pkgbuild{output} =~ s{\A}{$CONTRIBS\n};
}
else {
$pkgbuild{output} =~ s{\A}{# Maintainer: $DEFS{packager}\n$CONTRIBS\n};
}
if ( $t ne 'no_files' ) {
$temp->child( $FILES{outfile} )->spew_utf8( $pkgbuild{output} );
if ( $t eq 'no_vars' ) {
$temp->child( $FILES{metadata} )->touch;
}
else {
$temp->child( $FILES{metadata} )->spew_utf8( $SRCINFO{$t} );
}
}
local $ENV{PATH} = '' if $t eq 'epoch_vercmp';
my ( $stderr, @ret ) = capture_stderr {
return $c2a->write_pkgbuild;
};
if ( $t =~ /\A(?> no | bogus)_/x || $t eq 'epoch_vercmp' ) {
is(
$ret[0], number(1),
'return value (error)',
);
}
else {
if ( $t eq 'normal_comp' ) {
$TODO = todo 'This test fails when TTY width is not 80';
test_diff(
$stderr, $comparison,
'STDERR',
);
}
my $outfile = path( $FILES{outfile} )->slurp_utf8;
my $updated = $t eq 'normal_ver_no_pkger'
? (
# Replace Maintainer with Contributor since co-maintainers
# are not preserved when PACKAGER is not the current
# PKGBUILD maintainer.
$updated_default
=~ s{^# Maintainer:(?= Alice <alice\@domain.tld>$)}{# Contributor:}mr
)
: $updated_default;
# Bump pkgrel
{
my $pkgrel =
$t eq 'normal_bump' || $t eq 'normal_epoch' ? 2
: $t eq 'normal_comp' ? 3
: ();
$updated =~ s{^pkgrel=\K[^\n]+$}{$pkgrel}m
if $t =~ /\Anormal_(?> bump | comp | epoch)\z/x;
}
# Add/bump epoch
{
my $epoch =
$t eq 'epoch_add' || $t eq 'normal_epoch' ? 1
: $t eq 'epoch_bump' ? 2
: ();
$updated =~ s{^pkgrel=[^\n]+\n\K}{epoch=$epoch\n}m
if $t eq 'normal_epoch' || $t =~ /\Aepoch_/;
}
test_diff(
$outfile, $updated,
"$FILES{outfile} file",
);
is(
$ret[0], number(0),
'return value (success)',
);
}
chdir $cwd or die $!; # tempdir cleanup
};
}
}
elsif ( $opt eq '--write' ) {
#skip_all;
foreach my ( $t, $name ) ( $info->%* ) {
subtest "$t ($name)" => sub {
my @argv;
@argv = ( qw< --write >, $FAKE{mod} );
push @argv, '--force' if $t eq 'force';
my $c2a = App::cpan2arch->new;
$c2a->_process_opts( $t eq 'nothing' ? undef : \@argv );
# Generate PKGBUILD to compare against file.
my %pkgbuild = ( output => $expected->{$DIST}{pkgbuild} );
$c2a->set_pkgbuild(%pkgbuild) if $t ne 'nothing';
# Emulate current dir behavior.
my $cwd = Path::Tiny->cwd;
my $temp = Path::Tiny->tempdir;
chdir $temp or die $!;
# Create existing PKGBUILD to trigger file check.
$temp->child( $FILES{outfile} )->touch if $t =~ /force/;
my ( $stderr, @ret ) = capture_stderr {
return $c2a->write_pkgbuild;
};
if ( $t eq 'no_force' ) {
is(
$ret[0], number(1),
'return value (error)',
);
}
else {
if ( $t ne 'nothing' ) {
my $outfile = path( $FILES{outfile} )->slurp_utf8;
test_diff(
$outfile, $pkgbuild{output},
"$FILES{outfile} file",
);
}
is(
$ret[0], number(0),
'return value (success)',
( run in 0.325 second using v1.01-cache-2.11-cpan-bbe5e583499 )