#!/usr/bin/env perl use 5.014; use strict; use warnings; use YAML::XS; my %arches = ( # https://github.com/docker-library/official-images/blob/master/library/debian bullseye => 'amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x', buster => 'amd64, arm32v5, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x', ); print <<"END_HEADER"; Maintainers: Peter Martini (\@PeterMartini), Zak B. Elep (\@zakame) GitRepo: https://github.com/perl/docker-perl.git GitCommit: @{[ qx{ git log -1 --format=format:%H } ]} Architectures: $arches{buster} END_HEADER sub suffix { my $suffix = shift; map { $_ eq 'latest' ? $suffix : $_ . '-' . $suffix } @_; } sub entry { my $version = shift; my $build = shift; my $debian = shift; my $eol = shift // 0; my @versionAliases = (); my @version = split /[.]/, $version; for my $i (reverse 0 .. @version - 1) { push @versionAliases, join '.', @version[0 .. $i]; } push @versionAliases, 'latest'; (my $buildSuffix = $build) =~ s/^main,//; $buildSuffix =~ s/,/-/g; my @buildAliases = ($build eq 'main' ? @versionAliases : suffix $buildSuffix, @versionAliases); my @debianAliases = suffix $debian, @buildAliases; my @aliases = (($eol ? () : @buildAliases), @debianAliases); state %latest = (); @aliases = grep { !defined $latest{$_} } @aliases; @latest{@aliases} = (1) x @aliases; print <<~"END_ENTRY"; Tags: @{[ join ', ', @aliases ]}@{[ defined $arches{$debian} ? "\nArchitectures: $arches{$debian}" : '' ]} Directory: @{[ ($eol ? 'eol/' : '') . sprintf '%i.%03i.%03i-%s-%s', @version, $build, $debian ]} END_ENTRY } sub release { my $release = shift; my $builds = shift; my $eol = shift // 0; my @builds = (@$builds, map {"$_,threaded"} @$builds); for my $build (@builds) { for my $debian (reverse @{$release->{debian_release}}) { entry $release->{version}, $build, $debian, $eol; } } } my $config = do { open my $fh, '<', 'config.yml' or die "Couldn't open config"; local $/; Load <$fh>; }; release $_, $config->{builds} for reverse @{$config->{releases}}; exit unless @ARGV == 1 && $ARGV[0] eq '--eol'; print <; }; release $_, $config->{builds}, 1 for reverse @{$config->{releases}}; =pod =head1 NAME library.pl - generate YAML for library/perl manifest on docker-library =head1 SYNOPSIS cd /path/to/docker-perl ./library.pl [--eol] =head1 DESCRIPTION library.pl is a helper script to generate a suitable manifest for updating C on L, which is the reference for producing the L. This script optionally takes an C<--eol> option, for including entries corresponding to unsupported Perl versions that require a rebuild on the Docker Hub as needed (e.g. for updating base image dependencies.) =cut