|
Packit Service |
4a2782 |
package MakeUtil ;
|
|
Packit Service |
4a2782 |
package main ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
use strict ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
use Config qw(%Config);
|
|
Packit Service |
4a2782 |
use File::Copy;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my $VERSION = '1.0';
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
BEGIN
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
|
|
Packit Service |
4a2782 |
if ($@)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
*catfile = sub { return "$_[0]/$_[1]" }
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
require VMS::Filespec if $^O eq 'VMS';
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
unless($ENV{PERL_CORE}) {
|
|
Packit Service |
4a2782 |
$ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub MY::libscan
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $self = shift;
|
|
Packit Service |
4a2782 |
my $path = shift;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return undef
|
|
Packit Service |
4a2782 |
if $path =~ /(~|\.bak|_bak)$/ ||
|
|
Packit Service |
4a2782 |
$path =~ /\..*\.sw(o|p)$/ ||
|
|
Packit Service |
4a2782 |
$path =~ /\B\.svn\b/;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return $path;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub MY::postamble
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
return ''
|
|
Packit Service |
4a2782 |
if $ENV{PERL_CORE} ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @files = getPerlFiles('MANIFEST');
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# Note: Once you remove all the layers of shell/makefile escaping
|
|
Packit Service |
4a2782 |
# the regular expression below reads
|
|
Packit Service |
4a2782 |
#
|
|
Packit Service |
4a2782 |
# /^\s*local\s*\(\s*\$^W\s*\)/
|
|
Packit Service |
4a2782 |
#
|
|
Packit Service |
4a2782 |
my $postamble = '
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
MyTrebleCheck:
|
|
Packit Service |
4a2782 |
@echo Checking for $$^W in files: '. "@files" . '
|
|
Packit Service |
4a2782 |
perl -ne \' \
|
|
Packit Service |
4a2782 |
exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \' \
|
|
Packit Service |
4a2782 |
' . " @files || " . ' \
|
|
Packit Service |
4a2782 |
(echo found unexpected $$^W ; exit 1)
|
|
Packit Service |
4a2782 |
@echo All is ok.
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
';
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return $postamble;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub getPerlFiles
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my @manifests = @_ ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @files = ();
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
for my $manifest (@manifests)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $prefix = './';
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
$prefix = $1
|
|
Packit Service |
4a2782 |
if $manifest =~ m#^(.*/)#;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
open M, "<$manifest"
|
|
Packit Service |
4a2782 |
or die "Cannot open '$manifest': $!\n";
|
|
Packit Service |
4a2782 |
while (<M>)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
chomp ;
|
|
Packit Service |
4a2782 |
next if /^\s*#/ || /^\s*$/ ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
s/^\s+//;
|
|
Packit Service |
4a2782 |
s/\s+$//;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
#next if m#t/Test/More\.pm$# or m#t/Test/Builder\.pm$#;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
/^(\S+)\s*(.*)$/;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my ($file, $rest) = ($1, $2);
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
push @files, "$prefix$file";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
elsif ($rest =~ /perl/i)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
push @files, "$prefix$file";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
close M;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return @files;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub UpDowngrade
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
return if defined $ENV{TipTop};
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @files = @_ ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# our and use bytes/utf8 is stable from 5.6.0 onward
|
|
Packit Service |
4a2782 |
# warnings is stable from 5.6.1 onward
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# Note: this code assumes that each statement it modifies is not
|
|
Packit Service |
4a2782 |
# split across multiple lines.
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my $warn_sub = '';
|
|
Packit Service |
4a2782 |
my $our_sub = '' ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my $upgrade ;
|
|
Packit Service |
4a2782 |
my $downgrade ;
|
|
Packit Service |
4a2782 |
my $do_downgrade ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my $caller = (caller(1))[3] || '';
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($caller =~ /downgrade/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
$downgrade = 1;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
elsif ($caller =~ /upgrade/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
$upgrade = 1;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
else
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
$do_downgrade = 1
|
|
Packit Service |
4a2782 |
if $] < 5.006001 ;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# else
|
|
Packit Service |
4a2782 |
# {
|
|
Packit Service |
4a2782 |
# my $opt = shift @ARGV || '' ;
|
|
Packit Service |
4a2782 |
# $upgrade = ($opt =~ /^-upgrade/i);
|
|
Packit Service |
4a2782 |
# $downgrade = ($opt =~ /^-downgrade/i);
|
|
Packit Service |
4a2782 |
# push @ARGV, $opt unless $downgrade || $upgrade;
|
|
Packit Service |
4a2782 |
# }
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($downgrade || $do_downgrade) {
|
|
Packit Service |
4a2782 |
# From: use|no warnings "blah"
|
|
Packit Service |
4a2782 |
# To: local ($^W) = 1; # use|no warnings "blah"
|
|
Packit Service |
4a2782 |
$warn_sub = sub {
|
|
Packit Service |
4a2782 |
s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ;
|
|
Packit Service |
4a2782 |
s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ;
|
|
Packit Service |
4a2782 |
};
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
#elsif ($] >= 5.006001 || $upgrade) {
|
|
Packit Service |
4a2782 |
elsif ($upgrade) {
|
|
Packit Service |
4a2782 |
# From: local ($^W) = 1; # use|no warnings "blah"
|
|
Packit Service |
4a2782 |
# To: use|no warnings "blah"
|
|
Packit Service |
4a2782 |
$warn_sub = sub {
|
|
Packit Service |
4a2782 |
s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ;
|
|
Packit Service |
4a2782 |
};
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($downgrade || $do_downgrade) {
|
|
Packit Service |
4a2782 |
$our_sub = sub {
|
|
Packit Service |
4a2782 |
if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) {
|
|
Packit Service |
4a2782 |
my $indent = $1;
|
|
Packit Service |
4a2782 |
my $vars = join ' ', split /\s*,\s*/, $2;
|
|
Packit Service |
4a2782 |
$_ = "${indent}use vars qw($vars);\n";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
$_ = "$1# $2\n";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
};
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
#elsif ($] >= 5.006000 || $upgrade) {
|
|
Packit Service |
4a2782 |
elsif ($upgrade) {
|
|
Packit Service |
4a2782 |
$our_sub = sub {
|
|
Packit Service |
4a2782 |
if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) {
|
|
Packit Service |
4a2782 |
my $indent = $1;
|
|
Packit Service |
4a2782 |
my $vars = join ', ', split ' ', $2;
|
|
Packit Service |
4a2782 |
$_ = "${indent}our ($vars);\n";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
$_ = "$1$2\n";
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
};
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if (! $our_sub && ! $warn_sub) {
|
|
Packit Service |
4a2782 |
warn "Up/Downgrade not needed.\n";
|
|
Packit Service |
4a2782 |
if ($upgrade || $downgrade)
|
|
Packit Service |
4a2782 |
{ exit 0 }
|
|
Packit Service |
4a2782 |
else
|
|
Packit Service |
4a2782 |
{ return }
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
foreach (@files) {
|
|
Packit Service |
4a2782 |
#if (-l $_ )
|
|
Packit Service |
4a2782 |
{ doUpDown($our_sub, $warn_sub, $_) }
|
|
Packit Service |
4a2782 |
#else
|
|
Packit Service |
4a2782 |
#{ doUpDownViaCopy($our_sub, $warn_sub, $_) }
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
warn "Up/Downgrade complete.\n" ;
|
|
Packit Service |
4a2782 |
exit 0 if $upgrade || $downgrade;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub doUpDown
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $our_sub = shift;
|
|
Packit Service |
4a2782 |
my $warn_sub = shift;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return if -d $_[0];
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak";
|
|
Packit Service |
4a2782 |
local (@ARGV) = shift;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
while (<>)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
print, last if /^__(END|DATA)__/ ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
&{ $our_sub }() if $our_sub ;
|
|
Packit Service |
4a2782 |
&{ $warn_sub }() if $warn_sub ;
|
|
Packit Service |
4a2782 |
print ;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return if eof ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
while (<>)
|
|
Packit Service |
4a2782 |
{ print }
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub doUpDownViaCopy
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $our_sub = shift;
|
|
Packit Service |
4a2782 |
my $warn_sub = shift;
|
|
Packit Service |
4a2782 |
my $file = shift ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
use File::Copy ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return if -d $file ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak";
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
copy($file, $backup)
|
|
Packit Service |
4a2782 |
or die "Cannot copy $file to $backup: $!";
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @keep = ();
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
open F, "<$file"
|
|
Packit Service |
4a2782 |
or die "Cannot open $file: $!\n" ;
|
|
Packit Service |
4a2782 |
while (<F>)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
if (/^__(END|DATA)__/)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
push @keep, $_;
|
|
Packit Service |
4a2782 |
last ;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
&{ $our_sub }() if $our_sub ;
|
|
Packit Service |
4a2782 |
&{ $warn_sub }() if $warn_sub ;
|
|
Packit Service |
4a2782 |
push @keep, $_;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if (! eof F)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
while (<F>)
|
|
Packit Service |
4a2782 |
{ push @keep, $_ }
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
close F;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
open F, ">$file"
|
|
Packit Service |
4a2782 |
or die "Cannot open $file: $!\n";
|
|
Packit Service |
4a2782 |
print F @keep ;
|
|
Packit Service |
4a2782 |
close F;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub FindBrokenDependencies
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $version = shift ;
|
|
Packit Service |
4a2782 |
my %thisModule = map { $_ => 1} @_;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @modules = qw(
|
|
Packit Service |
4a2782 |
IO::Compress::Base
|
|
Packit Service |
4a2782 |
IO::Compress::Base::Common
|
|
Packit Service |
4a2782 |
IO::Uncompress::Base
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
Compress::Raw::Zlib
|
|
Packit Service |
4a2782 |
Compress::Raw::Bzip2
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
IO::Compress::RawDeflate
|
|
Packit Service |
4a2782 |
IO::Uncompress::RawInflate
|
|
Packit Service |
4a2782 |
IO::Compress::Deflate
|
|
Packit Service |
4a2782 |
IO::Uncompress::Inflate
|
|
Packit Service |
4a2782 |
IO::Compress::Gzip
|
|
Packit Service |
4a2782 |
IO::Compress::Gzip::Constants
|
|
Packit Service |
4a2782 |
IO::Uncompress::Gunzip
|
|
Packit Service |
4a2782 |
IO::Compress::Zip
|
|
Packit Service |
4a2782 |
IO::Uncompress::Unzip
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
IO::Compress::Bzip2
|
|
Packit Service |
4a2782 |
IO::Uncompress::Bunzip2
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
IO::Compress::Lzf
|
|
Packit Service |
4a2782 |
IO::Uncompress::UnLzf
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
IO::Compress::Lzop
|
|
Packit Service |
4a2782 |
IO::Uncompress::UnLzop
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
Compress::Zlib
|
|
Packit Service |
4a2782 |
);
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
my @broken = ();
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
foreach my $module ( grep { ! $thisModule{$_} } @modules)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $hasVersion = getInstalledVersion($module);
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# No need to upgrade if the module isn't installed at all
|
|
Packit Service |
4a2782 |
next
|
|
Packit Service |
4a2782 |
if ! defined $hasVersion;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
# If already have C::Z version 1, then an upgrade to any of the
|
|
Packit Service |
4a2782 |
# IO::Compress modules will not break it.
|
|
Packit Service |
4a2782 |
next
|
|
Packit Service |
4a2782 |
if $module eq 'Compress::Zlib' && $hasVersion < 2;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($hasVersion < $version)
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
push @broken, $module
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return @broken;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
sub getInstalledVersion
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
my $module = shift;
|
|
Packit Service |
4a2782 |
my $version;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
eval " require $module; ";
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
if ($@ eq '')
|
|
Packit Service |
4a2782 |
{
|
|
Packit Service |
4a2782 |
no strict 'refs';
|
|
Packit Service |
4a2782 |
$version = ${ $module . "::VERSION" };
|
|
Packit Service |
4a2782 |
$version = 0
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
return $version;
|
|
Packit Service |
4a2782 |
}
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
package MakeUtil ;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
1;
|
|
Packit Service |
4a2782 |
|
|
Packit Service |
4a2782 |
|