apkbuild-cpan.in: improve dealing with old APKBUILD perl module names

remove trailing pkgver from some module names
attempt to use additional variable content to determine perl package name
this now appears to support all but 10 or 11 non metacpan api retrievable
 module information and add a package mapping for perl-ldap
This commit is contained in:
Timothy Legge 2020-03-03 20:41:10 +00:00
parent 28bf6f71f0
commit 0387b8014a

View File

@ -22,6 +22,7 @@ my $license_mappings = {
my $package_mappings = {
"LWP" => "perl-libwww",
"TermReadKey" => "perl-term-readkey",
"perl-ldap" => "perl-ldap",
};
our $packager = "";
my $template = <<'EOF';
@ -79,6 +80,8 @@ sub read_assignments_from_file {
my $authors = join("\n", $text =~ /^# Contributor: .*$/mg, $text =~ /^# Maintainer: .*$/mg);
$hash{'authors'} = $authors if length($authors) > 1;
my $tmplver = $text =~ m/^# Automatically generated by apkbuild-cpan, template (.*)/;
$hash{'tmplver'} = $1 if length($tmplver) >= 1;
return \%hash;
}
@ -226,7 +229,31 @@ EOF
sub do_depends {
my $apkbuild = read_apkbuild;
my $metaprefix = "src/" . $apkbuild->{'_pkgreal'} . "-" . $apkbuild->{'pkgver'} . "/";
my $metaprefix = '';
if ( exists $apkbuild->{'_realname'} ) {
$metaprefix = "src/" . $apkbuild->{'_realname'} . "-" . $apkbuild->{'pkgver'} . "/";
}
elsif ( exists $apkbuild->{'_pkgreal'} ) {
$metaprefix = "src/" . $apkbuild->{'_pkgreal'} . "-" . $apkbuild->{'pkgver'} . "/";
}
elsif ( exists $apkbuild->{'_pkgname'} ) {
$metaprefix = "src/" . $apkbuild->{'_pkgname'} . "-" . $apkbuild->{'pkgver'} . "/";
}
elsif ( exists $apkbuild->{'_name'} ) {
$metaprefix = "src/" . $apkbuild->{'_name'} . "-" . $apkbuild->{'pkgver'} . "/";
}
elsif ( exists $apkbuild->{'_realpkgname'} ) {
$metaprefix = "src/" . $apkbuild->{'_realpkgname'} . "-" . $apkbuild->{'pkgver'} . "/";
}
elsif ( exists $apkbuild->{'_pkg_real'} ) {
$metaprefix = "src/" . $apkbuild->{'_pkg_real'} . "-" . $apkbuild->{'pkgver'} . "/";
}
else {
die "Unable to find meta file directory - check APKBUILD Perl Module Name";
}
$metaprefix =~ s/-\$pkgver//g;
my $meta;
foreach my $metafile ("MYMETA.json", "META.json", "MYMETA.yml", "META.yml") {
@ -288,11 +315,71 @@ sub do_depends {
sub get_data {
my $apkbuild = read_apkbuild;
$apkbuild->{_pkgreal} or die "Not apkbuild-cpan generated APKBUILD";
my $response = $ua->get("https://fastapi.metacpan.org/release/$apkbuild->{_pkgreal}");
$response->is_success or die $response->status_line;
my $pkgreal = '';
if (exists $apkbuild->{_realname}) {
$pkgreal = $apkbuild->{_realname};
} elsif (exists $apkbuild->{_pkgreal}) {
$pkgreal = $apkbuild->{_pkgreal};
} elsif (exists $apkbuild->{_pkgname}) {
$pkgreal = $apkbuild->{_pkgname};
} elsif (exists $apkbuild->{_name}) {
$pkgreal = $apkbuild->{_name};
} elsif (exists $apkbuild->{_realpkgname}) {
$pkgreal = $apkbuild->{_realpkgname};
} elsif (exists $apkbuild->{_pkg_real}) {
$pkgreal = $apkbuild->{_pkg_real};
} else {
my $module = '';
my $distribution = '';
while ((my $key, my $value ) = each (%$apkbuild)) {
# Do not parse any depends lines to not find incorrect module
if ($key =~ m/.*depends.*/) {
next;
}
# Try to find a perl module name in APKBUILD
if ($value=~m/((\w+::)+\w+)/g) {
# Match Perl Module names containing ::
$module .= "$1 " unless $module =~ m/$1/;
}
elsif ($value =~ m/(([A-Z]\w+-)+\w+)/) {
# Match possible distribution names with -
$distribution .= "$1 " unless $distribution =~ m/ *$1 /;
}
elsif ( $value =~ m/.*release\/([A-Z]\w+).*/ ) {
# Match Single Word Perl Module Name after release in URL?
$distribution .= "$1 " unless $distribution =~ m/ *$1 /;
}
}
# Want to try the traditional Module::Name first
my $list = $module . $distribution;
foreach (split / /, $list) {
my $type = '';
if( $_ =~ m/::/ ) {
$type = 'module';
} else {
$type = 'release';
}
my $response = $ua->get("https://fastapi.metacpan.org/$type/$_");
$response->is_success or next;;
my $moddata = $json->decode($response->decoded_content);
$moddata->{error} and next;
$pkgreal = $moddata->{distribution};
last;
}
}
$pkgreal =~ s/-\$pkgver//g;
my $response = $ua->get("https://fastapi.metacpan.org/release/$pkgreal");
$response->is_success or
die $response->status_line . " unable to find $pkgreal verify Perl Module name in APKBUILD\n";
my $distdata = $json->decode($response->decoded_content);
$distdata->{error} and die "Error trying to locate $apkbuild->{_pkgreal}: $distdata->{error}\n";
$distdata->{error} and die "Error trying to locate $pkgreal: $distdata->{error}\n";
$response = $ua->get("https://fastapi.metacpan.org/module/$distdata->{main_module}");
$response->is_success or die $response->status_line;
@ -311,10 +398,9 @@ $packager = $user_abuild_conf->{PACKAGER} if $user_abuild_conf->{PACKAGER};
given ( $ARGV[0] ) {
when ("create") {
my $module = $ARGV[1];
my $response;
$module or die "Module name is a mandatory argument";
$response = $ua->get("https://fastapi.metacpan.org/module/$module");
my $response = $ua->get("https://fastapi.metacpan.org/module/$module");
$response->is_success or die $response->status_line;
my $moddata = $json->decode($response->decoded_content);
$moddata->{error} and die "Error trying to locate $module: $moddata->{error}\n";
@ -333,6 +419,7 @@ given ( $ARGV[0] ) {
do_depends;
}
when ("recreate") {
#TODO: likely should keep pkgrel the same on recreate
my ($apkbuild, $distdata, $moddata) = get_data;
write_apkbuild($distdata, $apkbuild->{authors}, $moddata);
prepare_tree;
@ -343,7 +430,7 @@ given ( $ARGV[0] ) {
my ($apkbuild, $distdata, $moddata) = get_data;
my $pkgver = $moddata->{version} =~ s/^[^0-9]+//r;
if ($pkgver != $apkbuild->{pkgver}) {
if ($pkgver ne $apkbuild->{pkgver}) {
say "Upgrading CPAN module from $apkbuild->{pkgver} to $pkgver";
my $text = read_file "APKBUILD";