diff options
author | Britney Fransen <brfransen@gmail.com> | 2018-05-29 22:07:57 (GMT) |
---|---|---|
committer | Britney Fransen <brfransen@gmail.com> | 2018-05-29 22:07:57 (GMT) |
commit | d5d2d3cfb18d8687a6c38e10bbc231f18ce58b24 (patch) | |
tree | ca126a38b3b433815e5a658ba3efc68d0e8b905d | |
parent | 2eb82b89e4c9785d307e1ed12a042b9745ec7d8e (diff) | |
download | linhes_pkgbuild-d5d2d3cfb18d8687a6c38e10bbc231f18ce58b24.zip linhes_pkgbuild-d5d2d3cfb18d8687a6c38e10bbc231f18ce58b24.tar.gz linhes_pkgbuild-d5d2d3cfb18d8687a6c38e10bbc231f18ce58b24.tar.bz2 |
perl: update to 5.26.2
-rw-r--r-- | abs/core/perl/0001-Append-CFLAGS-and-LDFLAGS-to-their-Config.pm-counter.patch | 83 | ||||
-rw-r--r-- | abs/core/perl/CVE-2016-2381_duplicate_env.diff | 104 | ||||
-rw-r--r-- | abs/core/perl/ChangeLog | 66 | ||||
-rw-r--r-- | abs/core/perl/PKGBUILD | 243 | ||||
-rw-r--r-- | abs/core/perl/detect-old-perl-modules.hook | 10 | ||||
-rw-r--r-- | abs/core/perl/detect-old-perl-modules.sh | 36 | ||||
-rw-r--r-- | abs/core/perl/digest_eval_hole.diff | 61 | ||||
-rw-r--r-- | abs/core/perl/fix-h2ph-and-tests.patch | 104 | ||||
-rwxr-xr-x | abs/core/perl/generate-rebuild-list.sh | 11 | ||||
-rwxr-xr-x | abs/core/perl/patchprov | 259 | ||||
-rw-r--r-- | abs/core/perl/perl-binary-module-dependency-1.template | 5 | ||||
-rw-r--r-- | abs/core/perl/perl.install | 10 | ||||
-rw-r--r-- | abs/core/perl/perlbin.csh | 2 | ||||
-rw-r--r-- | abs/core/perl/perlbin.fish | 10 | ||||
-rwxr-xr-x | abs/core/perl/perlbin.sh | 2 | ||||
-rw-r--r-- | abs/core/perl/provides.pl | 299 | ||||
-rw-r--r-- | abs/core/perl/upgpkg | 4 |
17 files changed, 624 insertions, 685 deletions
diff --git a/abs/core/perl/0001-Append-CFLAGS-and-LDFLAGS-to-their-Config.pm-counter.patch b/abs/core/perl/0001-Append-CFLAGS-and-LDFLAGS-to-their-Config.pm-counter.patch deleted file mode 100644 index 1404460..0000000 --- a/abs/core/perl/0001-Append-CFLAGS-and-LDFLAGS-to-their-Config.pm-counter.patch +++ /dev/null @@ -1,83 +0,0 @@ -From bb249b0b26c2e79a6f55355ef94889070f07fd21 Mon Sep 17 00:00:00 2001 -From: Niko Tyni <ntyni@debian.org> -Date: Thu, 28 Apr 2011 09:18:54 +0300 -Subject: [PATCH] Append CFLAGS and LDFLAGS to their Config.pm counterparts in - EU::CBuilder - -Since ExtUtils::CBuilder 0.27_04 (bleadperl commit 06e8058f27e4), -CFLAGS and LDFLAGS from the environment have overridden the Config.pm -ccflags and ldflags settings. This can cause binary incompatibilities -between the core Perl and extensions built with EU::CBuilder. - -Append to the Config.pm values rather than overriding them. ---- - .../lib/ExtUtils/CBuilder/Base.pm | 6 +++- - dist/ExtUtils-CBuilder/t/04-base.t | 25 +++++++++++++++++++- - 2 files changed, 28 insertions(+), 3 deletions(-) - -diff --git a/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm b/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm -index b572312..2255c51 100644 ---- a/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm -+++ b/dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm -@@ -40,11 +40,13 @@ sub new { - $self->{config}{$k} = $v unless exists $self->{config}{$k}; - } - $self->{config}{cc} = $ENV{CC} if defined $ENV{CC}; -- $self->{config}{ccflags} = $ENV{CFLAGS} if defined $ENV{CFLAGS}; -+ $self->{config}{ccflags} = join(" ", $self->{config}{ccflags}, $ENV{CFLAGS}) -+ if defined $ENV{CFLAGS}; - $self->{config}{cxx} = $ENV{CXX} if defined $ENV{CXX}; - $self->{config}{cxxflags} = $ENV{CXXFLAGS} if defined $ENV{CXXFLAGS}; - $self->{config}{ld} = $ENV{LD} if defined $ENV{LD}; -- $self->{config}{ldflags} = $ENV{LDFLAGS} if defined $ENV{LDFLAGS}; -+ $self->{config}{ldflags} = join(" ", $self->{config}{ldflags}, $ENV{LDFLAGS}) -+ if defined $ENV{LDFLAGS}; - - unless ( exists $self->{config}{cxx} ) { - my ($ccpath, $ccbase, $ccsfx ) = fileparse($self->{config}{cc}, qr/\.[^.]*/); -diff --git a/dist/ExtUtils-CBuilder/t/04-base.t b/dist/ExtUtils-CBuilder/t/04-base.t -index c3bf6b5..1bb15aa 100644 ---- a/dist/ExtUtils-CBuilder/t/04-base.t -+++ b/dist/ExtUtils-CBuilder/t/04-base.t -@@ -1,7 +1,7 @@ - #! perl -w - - use strict; --use Test::More tests => 50; -+use Test::More tests => 64; - use Config; - use Cwd; - use File::Path qw( mkpath ); -@@ -326,6 +326,29 @@ is_deeply( $mksymlists_args, - "_prepare_mksymlists_args(): got expected arguments for Mksymlists", - ); - -+my %testvars = ( -+ CFLAGS => 'ccflags', -+ LDFLAGS => 'ldflags', -+); -+ -+while (my ($VAR, $var) = each %testvars) { -+ local $ENV{$VAR}; -+ $base = ExtUtils::CBuilder::Base->new( quiet => 1 ); -+ ok( $base, "ExtUtils::CBuilder::Base->new() returned true value" ); -+ isa_ok( $base, 'ExtUtils::CBuilder::Base' ); -+ like($base->{config}{$var}, qr/\Q$Config{$var}/, -+ "honours $var from Config.pm"); -+ -+ $ENV{$VAR} = "-foo -bar"; -+ $base = ExtUtils::CBuilder::Base->new( quiet => 1 ); -+ ok( $base, "ExtUtils::CBuilder::Base->new() returned true value" ); -+ isa_ok( $base, 'ExtUtils::CBuilder::Base' ); -+ like($base->{config}{$var}, qr/\Q$ENV{$VAR}/, -+ "honours $VAR from the environment"); -+ like($base->{config}{$var}, qr/\Q$Config{$var}/, -+ "doesn't override $var from Config.pm with $VAR from the environment"); -+} -+ - ##### - - for ($source_file, $object_file, $lib_file) { --- -1.7.4.4 - diff --git a/abs/core/perl/CVE-2016-2381_duplicate_env.diff b/abs/core/perl/CVE-2016-2381_duplicate_env.diff new file mode 100644 index 0000000..80adf62 --- /dev/null +++ b/abs/core/perl/CVE-2016-2381_duplicate_env.diff @@ -0,0 +1,104 @@ +From 83e7ebed7afa79a2f50eca6b6330eae7c3a02d36 Mon Sep 17 00:00:00 2001 +From: Tony Cook <tony@develop-help.com> +Date: Wed, 27 Jan 2016 11:52:15 +1100 +Subject: remove duplicate environment variables from environ + +If we see duplicate environment variables while iterating over +environ[]: + +a) make sure we use the same value in %ENV that getenv() returns. + +Previously on a duplicate, %ENV would have the last entry for the name +from environ[], but a typical getenv() would return the first entry. + +Rather than assuming all getenv() implementations return the first entry +explicitly call getenv() to ensure they agree. + +b) remove duplicate entries from environ + +Previously if there was a duplicate definition for a name in environ[] +setting that name in %ENV could result in an unsafe value being passed +to a child process, so ensure environ[] has no duplicates. + +Patch-Name: fixes/CVE-2016-2381_duplicate_env.diff +--- + perl.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 49 insertions(+), 2 deletions(-) + +diff --git a/perl.c b/perl.c +index 80a76c2..ed25429 100644 +--- a/perl.c ++++ b/perl.c +@@ -4303,23 +4303,70 @@ S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env) + } + if (env) { + char *s, *old_var; ++ STRLEN nlen; + SV *sv; ++ HV *dups = newHV(); ++ + for (; *env; env++) { + old_var = *env; + + if (!(s = strchr(old_var,'=')) || s == old_var) + continue; ++ nlen = s - old_var; + + #if defined(MSDOS) && !defined(DJGPP) + *s = '\0'; + (void)strupr(old_var); + *s = '='; + #endif +- sv = newSVpv(s+1, 0); +- (void)hv_store(hv, old_var, s - old_var, sv, 0); ++ if (hv_exists(hv, old_var, nlen)) { ++ const char *name = savepvn(old_var, nlen); ++ ++ /* make sure we use the same value as getenv(), otherwise code that ++ uses getenv() (like setlocale()) might see a different value to %ENV ++ */ ++ sv = newSVpv(PerlEnv_getenv(name), 0); ++ ++ /* keep a count of the dups of this name so we can de-dup environ later */ ++ if (hv_exists(dups, name, nlen)) ++ ++SvIVX(*hv_fetch(dups, name, nlen, 0)); ++ else ++ (void)hv_store(dups, name, nlen, newSViv(1), 0); ++ ++ Safefree(name); ++ } ++ else { ++ sv = newSVpv(s+1, 0); ++ } ++ (void)hv_store(hv, old_var, nlen, sv, 0); + if (env_is_not_environ) + mg_set(sv); + } ++ if (HvKEYS(dups)) { ++ /* environ has some duplicate definitions, remove them */ ++ HE *entry; ++ hv_iterinit(dups); ++ while ((entry = hv_iternext_flags(dups, 0))) { ++ STRLEN nlen; ++ const char *name = HePV(entry, nlen); ++ IV count = SvIV(HeVAL(entry)); ++ IV i; ++ SV **valp = hv_fetch(hv, name, nlen, 0); ++ ++ assert(valp); ++ ++ /* try to remove any duplicate names, depending on the ++ * implementation used in my_setenv() the iteration might ++ * not be necessary, but let's be safe. ++ */ ++ for (i = 0; i < count; ++i) ++ my_setenv(name, 0); ++ ++ /* and set it back to the value we set $ENV{name} to */ ++ my_setenv(name, SvPV_nolen(*valp)); ++ } ++ } ++ SvREFCNT_dec_NN(dups); + } + #endif /* USE_ENVIRON_ARRAY */ + #endif /* !PERL_MICRO */ diff --git a/abs/core/perl/ChangeLog b/abs/core/perl/ChangeLog deleted file mode 100644 index 9add39e..0000000 --- a/abs/core/perl/ChangeLog +++ /dev/null @@ -1,66 +0,0 @@ -2011-06-22 Angel Velasquez <angvp@archlinux.org> - * Added a patch for ExtUtils doesnt overwrite CFLAGS and LDFLAGS - * Fixed #FS22197, FS#22441, FS#24767 - * Rebuilt perl 5.14.1-2 against db 5.2.28 - -2011-06-16 Angel Velasquez <angvp@archlinux.org> - * Fixed #FS24660 - * Rebuilt against db 5.2.28 - -2011-05-16 Angel Velasquez <angvp@archlinux.org> - * perl 5.14.0 - * Removed patch for h2ph warning from 5.12.3 - * Removed provides array, you can use corelist -v 5.14.0 to know the - modules included with the perl core, through Module::CoreList (thx j3nnn1 - for the tip) - -2010-11-07 kevin <kevin@archlinux.org> - - * perl 5.12.2-1 - - Using /usr/bin/*_perl for script directories - -2010-11-06 kevin <kevin@archlinux.org> - - - Removed otherlibdirs directive from Configure - - Removed /usr/*/perl5/site_perl/5.10.1 from INC - - Finally removed legacy dirs /usr/lib/perl5/current and - /usr/lib/perl5/site_perl/current from @INC - -2010-05-23 kevin <kevin@archlinux.org> - - * perl 5.12.1-2 - - Francois updated the provides array. - -2010-05-23 kevin <kevin@archlinux.org> - - * perl 5.12.1-1 - -2010-05-16 kevin <kevin@archlinux.org> - - * perl 5.12.0-2 - -2010-05-12 kevin <kevin@archlinux.org> - - - FS#19411. Removed the for loop in perlbin.sh which didn't work on zsh. - This makes the loop variables unnecessary so the script no longer - pollutes the user's environment. - - FS#19427. Added /usr/*/perl5/site_perl/5.10.1 to otherlibdirs to support - user built modules. - -2010-05-09 kevin <kevin@archlinux.org> - - * perl 5.12.0-1 - - Modified perlbin.sh to only add existing dirs to PATH. Fixes FS#17402, - path points to non-existant directories - -2010-05-07 kevin <kevin@archlinux.org> - - - Added this changelog. - - Added -Dinc_version_list=none to fix FS#19136, double entry in @INC. - This removes the duplicates and versioned directory entries. - - Change scriptdirs to /usr/lib/perl5/{core,vendor,site}_perl/bin to fix - Fix FS#13808, binaries don't follow FHS. - - Stopped using versioned directories in sitelib and sitearch. - - -# vim: set ft=changelog ts=4 sw=4 et: diff --git a/abs/core/perl/PKGBUILD b/abs/core/perl/PKGBUILD index 58b94e7..8f56681 100644 --- a/abs/core/perl/PKGBUILD +++ b/abs/core/perl/PKGBUILD @@ -1,33 +1,159 @@ -# $Id: PKGBUILD 160587 2012-06-02 10:54:59Z bluewind $ -# Maintainer: Angel Velasquez <angvp@archlinux.org> +# $Id$ +# Maintainer: Florian Pritz <bluewind@xinu.at> +# Contributor: Angel Velasquez <angvp@archlinux.org> # Contributor: kevin <kevin.archlinux.org> # Contributor: judd <jvinet.zeroflux.org> -# Contributor: francois <francois.archlinux.org> +# Contributor: francois <francois.archlinux.org> + pkgname=perl -pkgver=5.16.0 -pkgrel=2 +pkgver=5.26.2 +_baseversion="${pkgver%.*}" +pkgrel=1 pkgdesc="A highly capable, feature-rich programming language" -arch=(i686 x86_64) +arch=(x86_64) license=('GPL' 'PerlArtistic') url="http://www.perl.org" groups=('base') -depends=('gdbm' 'db' 'coreutils' 'glibc' 'sh') -changelog=ChangeLog -source=(http://www.cpan.org/src/5.0/perl-${pkgver}.tar.bz2 -perlbin.sh -perlbin.csh -provides.pl) -install=perl.install -options=('makeflags' '!purge') -md5sums=('15a2f95fb27231e10998240f13acf961' - '5ed2542fdb9a60682f215bd33701e61a' - '1f0cbbee783e8a6d32f01be5118e0d5e' - '999c3eea6464860704abbb055a0f0896') - -# workaround to let the integrity check find the correct provides array -if [[ ${0##*/} = "parse_pkgbuilds.sh" ]]; then - true && provides=($(bsdtar -q -O -xf "/srv/ftp/pool/packages/$pkgname-$pkgver-$pkgrel-$CARCH.pkg.tar.xz" .PKGINFO | sed -rn 's#^provides = (.*)#\1#p')) -fi +depends=('gdbm' 'db' 'glibc') +# NOTE: This array is automatically generated by `./patchprov`. +# If you want to add entries, do so in the next array. +provides=('perl-archive-tar=2.24' + 'perl-attribute-handlers=0.99' + 'perl-autodie=2.29' + 'perl-autoloader=5.74' + 'perl-autouse=1.11' + 'perl-b-debug=1.24' + 'perl-base=2.26' + 'perl-bignum=0.47' + 'perl-carp=1.42' + 'perl-compress-raw-bzip2=2.074' + 'perl-compress-raw-zlib=2.074' + 'perl-config-perl-v=0.28' + 'perl-constant=1.33' + 'perl-cpan-meta-requirements=2.140' + 'perl-cpan-meta-yaml=0.018' + 'perl-cpan-meta=2.150010' + 'perl-cpan=2.18' + 'perl-data-dumper=2.167' + 'perl-db_file=1.840' + 'perl-devel-ppport=3.35' + 'perl-devel-selfstubber=1.06' + 'perl-digest-md5=2.55' + 'perl-digest-sha=5.96' + 'perl-digest=1.17_01' + 'perl-dumpvalue=1.18' + 'perl-encode=2.88' + 'perl-encoding-warnings=0.13' + 'perl-env=1.04' + 'perl-experimental=0.016' + 'perl-exporter=5.72' + 'perl-extutils-cbuilder=0.280225' + 'perl-extutils-constant=0.23' + 'perl-extutils-install=2.04' + 'perl-extutils-makemaker=7.24' + 'perl-extutils-manifest=1.70' + 'perl-extutils-parsexs=3.34' + 'perl-file-fetch=0.52' + 'perl-file-path=2.12_01' + 'perl-file-temp=0.2304' + 'perl-filter-simple=0.93' + 'perl-filter-util-call=1.55' + 'perl-getopt-long=2.49' + 'perl-http-tiny=0.070' + 'perl-i18n-collate=1.02' + 'perl-i18n-langtags=0.42' + 'perl-if=0.0606' + 'perl-io-compress=2.074' + 'perl-io-socket-ip=0.38' + 'perl-io-zlib=1.10' + 'perl-io=1.38' + 'perl-ipc-cmd=0.96' + 'perl-ipc-sysv=2.07' + 'perl-json-pp=2.27400_02' + 'perl-lib=0.64' + 'perl-libnet=3.10' + 'perl-locale-codes=3.42' + 'perl-locale-maketext-simple=0.21_01' + 'perl-locale-maketext=1.28' + 'perl-math-bigint-fastcalc=0.5005' + 'perl-math-bigint=1.999806' + 'perl-math-bigrat=0.2611' + 'perl-math-complex=1.5901' + 'perl-memoize=1.03_01' + 'perl-mime-base64=3.15' + 'perl-module-corelist=5.20180414_26' + 'perl-module-load-conditional=0.68' + 'perl-module-load=0.32' + 'perl-module-loaded=0.08' + 'perl-module-metadata=1.000033' + 'perl-net-ping=2.55' + 'perl-params-check=0.38' + 'perl-parent=0.236' + 'perl-pathtools=3.67' + 'perl-perl-ostype=1.010' + 'perl-perlfaq=5.021011' + 'perl-perlio-via-quotedprint=0.08' + 'perl-pod-checker=1.73' + 'perl-pod-escapes=1.07' + 'perl-pod-parser=1.63' + 'perl-pod-perldoc=3.28' + 'perl-pod-simple=3.35' + 'perl-pod-usage=1.69' + 'perl-podlators=5.006' + 'perl-safe=2.40' + 'perl-scalar-list-utils=1.46_02' + 'perl-search-dict=1.07' + 'perl-selfloader=1.23' + 'perl-socket=2.020_03' + 'perl-storable=2.62' + 'perl-sys-syslog=0.35' + 'perl-term-ansicolor=4.06' + 'perl-term-cap=1.17' + 'perl-term-complete=1.403' + 'perl-term-readline=1.17' + 'perl-test-harness=3.38' + 'perl-test-simple=1.302073' + 'perl-test=1.30' + 'perl-text-abbrev=1.02' + 'perl-text-balanced=2.03' + 'perl-text-parsewords=3.30' + 'perl-text-tabs=2013.0523' + 'perl-thread-queue=3.12' + 'perl-thread-semaphore=2.13' + 'perl-threads-shared=1.56' + 'perl-threads=2.15' + 'perl-tie-file=1.02' + 'perl-tie-refhash=1.39' + 'perl-time-hires=1.9741' + 'perl-time-local=1.25' + 'perl-time-piece=1.31' + 'perl-unicode-collate=1.19' + 'perl-unicode-normalize=1.25' + 'perl-version=0.9917' + 'perl-xsloader=0.27') +# Add your own provides here +provides=(${provides[@]}) +source=(https://www.cpan.org/src/5.0/perl-${pkgver}.tar.xz + perlbin.sh + perlbin.csh + perlbin.fish + perl-binary-module-dependency-1.template + detect-old-perl-modules.sh + detect-old-perl-modules.hook) +options=('makeflags' '!purge' 'emptydirs') +sha512sums=('fd54c90da250144c81b94587c01c49fa367f84c54406f1d360ddab4a41589a7b19efc1707f95c95d6357fae66fc3f6f00bf69dd7741db114c7034a14f52be65f' + '46724344828e7f86e016f9c8d588bf52b2e764e65e0acc1a38899a530c99bc6e4fd8b46fa0d4bbd685aa2074dd5bcbf9029ac3bb3f2d0ee9adfc4f6c0745f373' + 'fc1344a02c741d61af6f6b5967f29cc6f43c2059761522b150261924dd7e1989da5254c03ffa0627accd9af01bc152edd24e84a6b59579acb9ee1900b6ce9383' + '026f8e1e81cacceaf78ec58830fb6109c5e6e9f48df835e661ca6b7b3a7d600ae002b489532adb3f292f355f6889273cc59e015f6dc32df1910883e2ab6a1bb7' + 'f865c8e4df46bbdd911e28b80b85338a01f911d36e6f2a6bd3688d5aacd96ef2082ce44f3060c7d5356705c7a42e3397cf9509a2b28b686991360aac70dc24b4' + 'bd48af7a6209f2ad51aa1747a7238ecb11607a53f61460d873202bf14b55c3b7dd6f66f4a9f2cac8a24240313789a9a44dbc81b73587de46a6b1866bdfca5e26' + '6b5b2ba606d443da22c6c1a754829abd36f3fdfef1089bcf06c8f9db0217f2c2f02ebc14958ffa7afe618c9a80bd1025e76704f67466c0c3db7d40ef2c0e56b3') +# https://www.cpan.org/src/5.0/perl-$pkgver.tar.xz.sha256.txt + +prepare() { + cd ${srcdir}/${pkgname}-${pkgver} + +} build() { cd ${srcdir}/${pkgname}-${pkgver} @@ -35,19 +161,19 @@ build() { if [ "${CARCH}" = "x86_64" ]; then # for x86_64 arch_opts="-Dcccdlflags='-fPIC'" - else + else # for i686 arch_opts="" fi ./Configure -des -Dusethreads -Duseshrplib -Doptimize="${CFLAGS}" \ - -Dprefix=/usr -Dinstallprefix=${pkgdir}/usr -Dvendorprefix=/usr \ + -Dprefix=/usr -Dvendorprefix=/usr \ -Dprivlib=/usr/share/perl5/core_perl \ - -Darchlib=/usr/lib/perl5/core_perl \ + -Darchlib=/usr/lib/perl5/$_baseversion/core_perl \ -Dsitelib=/usr/share/perl5/site_perl \ - -Dsitearch=/usr/lib/perl5/site_perl \ + -Dsitearch=/usr/lib/perl5/$_baseversion/site_perl \ -Dvendorlib=/usr/share/perl5/vendor_perl \ - -Dvendorarch=/usr/lib/perl5/vendor_perl \ + -Dvendorarch=/usr/lib/perl5/$_baseversion/vendor_perl \ -Dscriptdir=/usr/bin/core_perl \ -Dsitescript=/usr/bin/site_perl \ -Dvendorscript=/usr/bin/vendor_perl \ @@ -64,20 +190,22 @@ check() { } package() { - # hack to work around makepkg running the subshell in check_sanity() - new_provides=($(cd "$srcdir/perl-$pkgver"; LD_PRELOAD=./libperl.so ./perl -Ilib "$srcdir/provides.pl" .)) - provides=(${new_provides[@]}) - cd ${srcdir}/${pkgname}-${pkgver} - make install + make DESTDIR="$pkgdir" install + + for template in "$srcdir/"*.template; do + install -Dm644 "$template" "$pkgdir/usr/share/makepkg-template/${template##*/}" + done + ln -s perl-binary-module-dependency-1.template "$pkgdir/usr/share/makepkg-template/"perl-binary-module-dependency.template ### Perl Settings ### # Change man page extensions for site and vendor module builds. - # Use archlinux email address instead of my own. + # Set no mail address since bug reports should go to the bug tracker + # and not someone's email. sed -e '/^man1ext=/ s/1perl/1p/' -e '/^man3ext=/ s/3perl/3pm/' \ - -e "/^cf_email=/ s/'.*'/'kevin@archlinux.org'/" \ - -e "/^perladmin=/ s/'.*'/'kevin@archlinux.org'/" \ - -i ${pkgdir}/usr/lib/perl5/core_perl/Config_heavy.pl + -e "/^cf_email=/ s/'.*'/''/" \ + -e "/^perladmin=/ s/'.*'/''/" \ + -i ${pkgdir}/usr/lib/perl5/$_baseversion/core_perl/Config_heavy.pl ### CPAN Settings ### # Set CPAN default config to use the site directories. @@ -85,32 +213,27 @@ package() { -e '/(mbuildpl_arg =>/ s/""/"installdirs=site"/' \ -i ${pkgdir}/usr/share/perl5/core_perl/CPAN/FirstTime.pm - ### CPANPLUS Settings ### - # Set CPANPLUS default config to use the site directories. - sed -e "/{'makemakerflags'}/ s/'';/'INSTALLDIRS=site';/" \ - -e "/{'buildflags'}/ s/'';/'installdirs=site';/" \ - -i ${pkgdir}/usr/share/perl5/core_perl/CPANPLUS/Config.pm - # Profile script to set paths to perl scripts. - install -D -m755 ${srcdir}/perlbin.sh \ + install -D -m644 ${srcdir}/perlbin.sh \ ${pkgdir}/etc/profile.d/perlbin.sh - # Profile script to set paths to perl scripts on csh. (FS#22441) - install -D -m755 ${srcdir}/perlbin.csh \ + # Profile script to set paths to perl scripts on csh. (FS#22441) + install -D -m644 ${srcdir}/perlbin.csh \ ${pkgdir}/etc/profile.d/perlbin.csh + # Profile script to set paths to perl scripts on fish. (FS#51191) + install -D -m 755 "$srcdir/perlbin.fish" \ + "$pkgdir/usr/share/fish/vendor_conf.d/perlbin.fish" - (cd ${pkgdir}/usr/bin; mv perl${pkgver} perl) - (cd ${pkgdir}/usr/bin/core_perl; ln -sf c2ph pstruct; ln -sf s2p psed) - grep -Rl "${pkgdir}" ${pkgdir}/usr | \ - xargs sed -i "s^${pkgdir}^^g" - - # Remove all pod files *except* those under /usr/share/perl5/core_perl/pod/ - # (FS#16488) - rm -f $pkgdir/usr/share/perl5/core_perl/*.pod - for d in $pkgdir/usr/share/perl5/core_perl/*; do - if [ -d $d -a $(basename $d) != "pod" ]; then - find $d -name *.pod -delete - fi - done - find $pkgdir/usr/lib -name *.pod -delete + # Add the dirs so new installs will already have them in PATH once they + # install their first perl programm + install -d -m755 "$pkgdir/usr/bin/vendor_perl" + install -d -m755 "$pkgdir/usr/bin/site_perl" + + #(cd ${pkgdir}/usr/bin; mv perl${pkgver} perl) + rm "$pkgdir/usr/bin/perl$pkgver" + + install -D -m755 -t "$pkgdir/usr/share/libalpm/scripts" "$srcdir/detect-old-perl-modules.sh" + install -D -m644 -t "$pkgdir/usr/share/libalpm/hooks" "$srcdir/detect-old-perl-modules.hook" + + find $pkgdir -name perllocal.pod -delete find $pkgdir -name .packlist -delete } diff --git a/abs/core/perl/detect-old-perl-modules.hook b/abs/core/perl/detect-old-perl-modules.hook new file mode 100644 index 0000000..5ff80d1 --- /dev/null +++ b/abs/core/perl/detect-old-perl-modules.hook @@ -0,0 +1,10 @@ +[Trigger] +Operation = Install +Operation = Upgrade +Type = File +Target = usr/lib/perl5/*/ + +[Action] +Description = Warn about old perl modules +When = PostTransaction +Exec = /usr/share/libalpm/scripts/detect-old-perl-modules.sh diff --git a/abs/core/perl/detect-old-perl-modules.sh b/abs/core/perl/detect-old-perl-modules.sh new file mode 100644 index 0000000..cdc8df3 --- /dev/null +++ b/abs/core/perl/detect-old-perl-modules.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +basedir=/usr/lib/perl5 +perlver=$(perl -e '$v = $^V->{version}; print $v->[0].".".($v->[1]);') + +dir_empty() { + local dir=$1 + [[ $(find $dir -maxdepth 0 -empty -exec echo empty \;) = "empty" ]] && return 0 || return 1 +} + +print_unowned_files() { + local dir=$1 + LC_ALL=C find "$dir" -type f -exec pacman -Qqo {} + |& sed -n 's/^error: No package owns \(.*\)$/\1/p' +} + +for dir in "$basedir/"*; do + if [[ "${dir##*/}" != "$perlver" ]]; then + if [[ -d "$dir" ]] && ! dir_empty "$dir"; then + pkgcount=$(pacman -Qqo "$dir" | wc -l) + if ((pkgcount > 0)); then + printf "WARNING: '%s' contains data from at least %d packages which will NOT be used by the installed perl interpreter.\n" "$dir" "$pkgcount" + printf " -> Run the following command to get a list of affected packages: pacman -Qqo '%s'\n" "$dir" + fi + + unowned_count=$(print_unowned_files "$dir" | wc -l) + if ((unowned_count > 0)); then + printf "WARNING: %d file(s) in %s are not tracked by pacman and need to be rebuilt.\n" "$unowned_count" "$dir" + printf " -> These were most likely installed directly by cpan or a similar tool.\n" + printf " Run the following command to get a list of these files:\n" + printf " LC_ALL=C find \"%s\" -type f -exec pacman -Qqo {} + |& sed -n 's/^error: No package owns \(.*\)$/\\\1/p'\n" "$dir" + fi + fi + fi +done + + diff --git a/abs/core/perl/digest_eval_hole.diff b/abs/core/perl/digest_eval_hole.diff deleted file mode 100644 index 4790413..0000000 --- a/abs/core/perl/digest_eval_hole.diff +++ /dev/null @@ -1,61 +0,0 @@ -From 4b6a7324284e7435a361c58f7ddb32fc0c635bd0 Mon Sep 17 00:00:00 2001 -From: "Michael G. Schwern" <schwern@pobox.com> -Date: Mon, 3 Oct 2011 19:05:29 +0100 -Subject: Close the eval "require $module" security hole in - Digest->new($algorithm) - -Also the filter was incomplete. - -Bug-Debian: http://bugs.debian.org/644108 - -Patch-Name: fixes/digest_eval_hole.diff ---- - cpan/Digest/Digest.pm | 6 ++++-- - cpan/Digest/t/security.t | 14 ++++++++++++++ - 2 files changed, 18 insertions(+), 2 deletions(-) - create mode 100644 cpan/Digest/t/security.t - -diff --git a/cpan/Digest/Digest.pm b/cpan/Digest/Digest.pm -index 384dfc8..d714434 100644 ---- a/cpan/Digest/Digest.pm -+++ b/cpan/Digest/Digest.pm -@@ -24,7 +24,7 @@ sub new - shift; # class ignored - my $algorithm = shift; - my $impl = $MMAP{$algorithm} || do { -- $algorithm =~ s/\W+//; -+ $algorithm =~ s/\W+//g; - "Digest::$algorithm"; - }; - $impl = [$impl] unless ref($impl); -@@ -35,7 +35,9 @@ sub new - ($class, @args) = @$class if ref($class); - no strict 'refs'; - unless (exists ${"$class\::"}{"VERSION"}) { -- eval "require $class"; -+ my $pm_file = $class . ".pm"; -+ $pm_file =~ s{::}{/}g; -+ eval { require $pm_file }; - if ($@) { - $err ||= $@; - next; -diff --git a/cpan/Digest/t/security.t b/cpan/Digest/t/security.t -new file mode 100644 -index 0000000..5cba122 ---- /dev/null -+++ b/cpan/Digest/t/security.t -@@ -0,0 +1,14 @@ -+#!/usr/bin/env perl -+ -+# Digest->new() had an exploitable eval -+ -+use strict; -+use warnings; -+ -+use Test::More tests => 1; -+ -+use Digest; -+ -+$LOL::PWNED = 0; -+eval { Digest->new(q[MD;5;$LOL::PWNED = 42]) }; -+is $LOL::PWNED, 0; diff --git a/abs/core/perl/fix-h2ph-and-tests.patch b/abs/core/perl/fix-h2ph-and-tests.patch deleted file mode 100644 index a2d176e..0000000 --- a/abs/core/perl/fix-h2ph-and-tests.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 8d66b3f930dc6d88b524d103e304308ae73a46e7 Mon Sep 17 00:00:00 2001 -From: Robin Barker <rmbarker@cpan.org> -Date: Thu, 22 Apr 2010 11:51:20 +0100 -Subject: [PATCH 1/1] Fix h2ph and test - ---- - lib/h2ph.t | 12 ++++++++++-- - utils/h2ph.PL | 28 +++++++++++++++++++++++----- - 2 files changed, 33 insertions(+), 7 deletions(-) - -diff --git a/lib/h2ph.t b/lib/h2ph.t -index 27dd7b9..8d62d46 100644 ---- a/lib/h2ph.t -+++ b/lib/h2ph.t -@@ -18,7 +18,7 @@ if (!(-e $extracted_program)) { - exit 0; - } - --plan(4); -+plan(5); - - # quickly compare two text files - sub txt_compare { -@@ -41,8 +41,16 @@ $result = runperl( progfile => 'lib/h2ph.pht', - stderr => 1 ); - like( $result, qr/syntax OK$/, "output compiles"); - -+$result = runperl( progfile => '_h2ph_pre.ph', -+ switches => ['-c'], -+ stderr => 1 ); -+like( $result, qr/syntax OK$/, "preamble compiles"); -+ - $result = runperl( switches => ["-w"], -- prog => '$SIG{__WARN__} = sub { die $_[0] }; require q(lib/h2ph.pht);'); -+ stderr => 1, -+ prog => <<'PROG' ); -+$SIG{__WARN__} = sub { die $_[0] }; require q(lib/h2ph.pht); -+PROG - is( $result, '', "output free of warnings" ); - - # cleanup -diff --git a/utils/h2ph.PL b/utils/h2ph.PL -index 8f56db4..1255807 100644 ---- a/utils/h2ph.PL -+++ b/utils/h2ph.PL -@@ -401,7 +401,10 @@ if ($opt_e && (scalar(keys %bad_file) > 0)) { - exit $Exit; - - sub expr { -- $new = '"(assembly code)"' and return if /\b__asm__\b/; # freak out. -+ if (/\b__asm__\b/) { # freak out -+ $new = '"(assembly code)"'; -+ return -+ } - my $joined_args; - if(keys(%curargs)) { - $joined_args = join('|', keys(%curargs)); -@@ -770,7 +773,7 @@ sub inc_dirs - sub build_preamble_if_necessary - { - # Increment $VERSION every time this function is modified: -- my $VERSION = 2; -+ my $VERSION = 3; - my $preamble = "$Dest_dir/_h2ph_pre.ph"; - - # Can we skip building the preamble file? -@@ -798,7 +801,16 @@ sub build_preamble_if_necessary - # parenthesized value: d=(v) - $define{$_} = $1; - } -- if ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) { -+ if (/^(\w+)\((\w)\)$/) { -+ my($macro, $arg) = ($1, $2); -+ my $def = $define{$_}; -+ $def =~ s/$arg/\$\{$arg\}/g; -+ print PREAMBLE <<DEFINE; -+unless (defined &$macro) { sub $macro(\$) { my (\$$arg) = \@_; \"$def\" } } -+ -+DEFINE -+ } elsif -+ ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) { - # float: - print PREAMBLE - "unless (defined &$_) { sub $_() { $1 } }\n\n"; -@@ -807,8 +819,14 @@ sub build_preamble_if_necessary - print PREAMBLE - "unless (defined &$_) { sub $_() { $1 } }\n\n"; - } elsif ($define{$_} =~ /^\w+$/) { -- print PREAMBLE -- "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n"; -+ my $def = $define{$_}; -+ if ($isatype{$def}) { -+ print PREAMBLE -+ "unless (defined &$_) { sub $_() { \"$def\" } }\n\n"; -+ } else { -+ print PREAMBLE -+ "unless (defined &$_) { sub $_() { &$def } }\n\n"; -+ } - } else { - print PREAMBLE - "unless (defined &$_) { sub $_() { \"", --- -1.6.5.2.74.g610f9.dirty - diff --git a/abs/core/perl/generate-rebuild-list.sh b/abs/core/perl/generate-rebuild-list.sh new file mode 100755 index 0000000..0ea6a93 --- /dev/null +++ b/abs/core/perl/generate-rebuild-list.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +echo "vim" + +pkgfile -rd "^/usr/lib/perl5/" | sed 's#^.*/##' | sort -u + +pkgfile -r "^/usr/lib/perl5/vendor_perl/auto/.*\.so$" | sed 's#^.*/##' | sort -u +ssh soyuz.archlinux.org PATH=/usr/local/bin:\$PATH\; /home/bluewind/bin/sogrep-all libperl.so + +# this one is optional +#pkgfile -r '^/usr/share/perl5/' | sed 's#^.*/##' | sort -u diff --git a/abs/core/perl/patchprov b/abs/core/perl/patchprov new file mode 100755 index 0000000..c1b038d --- /dev/null +++ b/abs/core/perl/patchprov @@ -0,0 +1,259 @@ +#!/usr/bin/perl +## +## Name: +## patchprov +## +## Description: +## Patch the provides list in the perl package PKGBUILD. Scan the appropriate +## directories under the perl source tree for directories containing dists +## similar to CPAN dists. Search the files in the distributions for VERSION +## strings, which are perl expressions. Filters these version strings through +## the perl interpreter, then transform the dist. names and versions into +## package names and versions. Finally, we cut out the "provides" array from the +## PKGBUILD and replace it with the newer version. +## +## Usage: +## patchprov [path to perl source tree] [path to PKGBUILD] +## +## Caveats: +## The path code is not platform independent and will only work in POSIX. +## +## Changelog: +## 06/10/14 JD Rewrite from scratch for perl 5.20.0 and ArchLinux. +## +## Authors: +## Justin "juster" Davis <jrcd83@gmail.com> +## + +use warnings; +use strict; + +sub err +{ + print STDERR "patchprov: error: @_\n"; + exit 1; +} + +## Extract the dist. name from its containing directory. +sub path_dist +{ + my($path) = @_; + $path =~ s{^.*/}{}; + return $path; +} + +## Create a path like $path/lib/Foo/Bar.pm for Foo::Bar. +sub lib_modpath +{ + my($path, $modname) = @_; + $modname =~ s{::}{/}g; + return "$path/lib/$modname.pm"; +} + +## Create a path to a file in the containing directory, named after +## the last segment of the module name, with suffix attached. +sub dumb_modpath +{ + my($path, $modname, $suffix) = @_; + $modname =~ s{^.*::}{}; + return "$path/$modname$suffix"; +} + +## Find a source file contained in the directory that we can scrape the +## perl versions string from. +my %distmods = ( + 'PathTools' => 'Cwd', + 'Scalar-List-Utils' => 'List::Util', + 'IO-Compress' => 'IO::Compress::Gzip', +); +sub dist_srcpath +{ + my($path) = @_; + my $distname = path_dist($path); + my $modname; + if(exists $distmods{$distname}){ + $modname = $distmods{$distname}; + }else{ + $modname = $distname; + $modname =~ s/-/::/g; + } + my @srcpaths = ( + lib_modpath($path, $modname), + dumb_modpath($path, $modname, '.pm'), + dumb_modpath($path, $modname, '_pm.PL'), + "$path/VERSION", # for podlators + ); + for my $src (@srcpaths){ + return $src if(-f $src); + } + return undef; +} + +## Scrape the version string for the module file or Makefile.PL. +sub scrape_verln +{ + my($srcpath) = @_; + open my $fh, '<', $srcpath or die "open: $!"; + while(my $ln = <$fh>){ + if($ln =~ s/^.*VERSION *=>? *//){ + close $fh; + return $ln; + } + } + close $fh; + err("failed to find VERSION in $srcpath"); +} + +## Scrape the version string from the module source file. +sub scrape_modver +{ + my($srcpath) = @_; + return scrape_verln($srcpath); +} + +## Scrape the version string from the Makefile.PL. (for libnet) +sub scrape_mkplver +{ + my($srcpath) = @_; + my $verln = scrape_verln($srcpath); + $verln =~ s/,/;/; + return $verln; +} + +## Scrape the version string from a file inside the dist dir. +sub distpath_ver +{ + my($distpath) = @_; + my $srcpath = dist_srcpath($distpath); + my $mkplpath = "$distpath/Makefile.PL"; + if(defined $srcpath){ + return scrape_modver($srcpath); + }elsif(-f $mkplpath){ + return scrape_mkplver($mkplpath); + }else{ + err("failed to scrape version from $distpath"); + } +} + +## Search the base path for the dist dirs and extract their respective +## version strings. +sub find_distvers +{ + my($basepath) = @_; + opendir my $dh, $basepath or die "opendir: $!"; + my @dirs = grep { -d $_ } map { "$basepath/$_" } grep { !/^[.]/ } readdir $dh; + closedir $dh; + + my @distvers; + for my $dpath (@dirs){ + push @distvers, [ path_dist($dpath), distpath_ver($dpath) ]; + } + return @distvers; +} + +## Maps an aref of dist name/perl version strings (perl expressions) to +## a package name and version string suitable for a PKGBUILD. +sub pkgspec +{ + my($dist, $ver) = @$_; + $dist =~ tr/A-Z/a-z/; + $ver = eval $ver; + return "perl-$dist=$ver"; +} + +## Searches the perl source dir provided for a list of packages which +## correspond to the core distributions bundled within in. +sub perlcorepkgs +{ + my($perlpath) = @_; + my @dirs = ("$perlpath/cpan", "$perlpath/dist"); + my @provs; + for my $d (@dirs){ + if(!-d $d){ + err("$d is not a valid directory"); + } + push @provs, map pkgspec, find_distvers($d); + } + return @provs; +} + +## Formats the provided lines into a neatly formatted bash array. The first arg +## is the name of the bash variable to assign it to. +sub basharray +{ + my $vname = shift; + + ## Sort entries and surround with quotes. + my @lns = sort map { qq{'$_'} } @_; + $lns[0] = "$vname=($lns[0]"; + + ## Indent lines for OCD geeks. + if(@lns > 1){ + my $ind = length($vname) + 2; + splice @lns, 1, @lns-1, + map { (' ' x $ind) . $_ } @lns[1 .. $#lns]; + } + + $lns[$#lns] .= ')'; + return map { "$_\n" } @lns; +} + +## Patch the PKGBUILD at the given path with a new provides array, overwriting +## the old one. +sub patchpb +{ + my $pbpath = shift; + open my $fh, '<', $pbpath or die "open: $!"; + my @lines = <$fh>; + close $fh; + + my($i, $j); + for($i = 0; $i < @lines; $i++){ + last if($lines[$i] =~ /^provides=/); + } + if($i == @lines){ + err("failed to find provides array in PKGBUILD"); + } + for($j = $i; $j < @lines; $j++){ + last if($lines[$j] =~ /[)]/); + } + if($j == @lines){ + err("failed to find end of provides array"); + } + + splice @lines, $i, $j-$i+1, + basharray('provides', grep { !/win32|next/ } @_); + + ## Avoid corrupting the existing PKGBUILD in case of a crash, etc. + if(-f "$pbpath.$$"){ + err("pbpath.$$ temporary file already exists, please remove it."); + } + open $fh, '>', "$pbpath.$$" or die "open: $!"; + print $fh @lines; + close $fh or die "close: $!"; + rename "$pbpath.$$", "$pbpath" or die "rename: $!"; + + return; +} + +## Program entrypoint. +sub main +{ + if(@_ < 2){ + print STDERR "usage: $0 [perl source path] [PKGBUILD path]\n"; + exit 2; + } + my($perlpath, $pbpath) = @_; + if(!-f $pbpath){ + err("$pbpath is not a valid file."); + }elsif(!-d $perlpath){ + err("$perlpath is not a valid directory."); + }else{ + patchpb($pbpath, perlcorepkgs($perlpath)); + } + exit 0; +} + +main(@ARGV); + +# EOF diff --git a/abs/core/perl/perl-binary-module-dependency-1.template b/abs/core/perl/perl-binary-module-dependency-1.template new file mode 100644 index 0000000..822ee91 --- /dev/null +++ b/abs/core/perl/perl-binary-module-dependency-1.template @@ -0,0 +1,5 @@ +if [[ $(find "$pkgdir/usr/lib/perl5/" -name "*.so") ]]; then + _perlver_min=$(perl -e '$v = $^V->{version}; print $v->[0].".".($v->[1]);') + _perlver_max=$(perl -e '$v = $^V->{version}; print $v->[0].".".($v->[1]+1);') + depends+=("perl>=$_perlver_min" "perl<$_perlver_max") +fi diff --git a/abs/core/perl/perl.install b/abs/core/perl/perl.install deleted file mode 100644 index a355c5b..0000000 --- a/abs/core/perl/perl.install +++ /dev/null @@ -1,10 +0,0 @@ -# arg 1: the new package version -post_install() { - for ver in 5.8.{0,1,2,3,4,5,6,7,8}; do - [ -h usr/lib/perl5/$ver ] && rm usr/lib/perl5/$ver - [ -h usr/lib/perl5/site_perl/$ver ] && rm usr/lib/perl5/site_perl/$ver - [ -h usr/bin/perl$ver ] && rm usr/bin/perl$ver - done - return 0 -} - diff --git a/abs/core/perl/perlbin.csh b/abs/core/perl/perlbin.csh index 535f0b1..fccecbd 100644 --- a/abs/core/perl/perlbin.csh +++ b/abs/core/perl/perlbin.csh @@ -1,5 +1,5 @@ # Set path to perl scriptdirs if they exist -# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_Scripts +# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts # Added /usr/bin/*_perl dirs for scripts # Remove /usr/lib/perl5/*_perl/bin in next release diff --git a/abs/core/perl/perlbin.fish b/abs/core/perl/perlbin.fish new file mode 100644 index 0000000..1f52ebb --- /dev/null +++ b/abs/core/perl/perlbin.fish @@ -0,0 +1,10 @@ +# Set path to perl scriptdirs if they exist +# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts + +if status --is-login + for perldir in /usr/bin/site_perl /usr/bin/vendor_perl /usr/bin/core_perl + if test -d $perldir + set PATH $PATH $perldir + end + end +end diff --git a/abs/core/perl/perlbin.sh b/abs/core/perl/perlbin.sh index 20f8304..7e38f20 100755 --- a/abs/core/perl/perlbin.sh +++ b/abs/core/perl/perlbin.sh @@ -1,5 +1,5 @@ # Set path to perl scriptdirs if they exist -# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_Scripts +# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts # Added /usr/bin/*_perl dirs for scripts # Remove /usr/lib/perl5/*_perl/bin in next release diff --git a/abs/core/perl/provides.pl b/abs/core/perl/provides.pl deleted file mode 100644 index d2cdc76..0000000 --- a/abs/core/perl/provides.pl +++ /dev/null @@ -1,299 +0,0 @@ -# provides.pl -## -# Script for printing out a provides list of every CPAN distribution -# that is bundled with perl. You can run it before building perl -# or you can run it after building perl. Required modules are in core -# for perl 5.13 and above. It might be nice if this didn't require -# HTTP::Tiny and maybe just used wget or curl. -# -# This script uses HTTP::Tiny to query Tatsuhiko Miyagawa's webapp at -# cpanmetadb.plackperl.org to cross-reference module files to their -# providing CPAN distribution. Thank you Miyagawa! -# -# - Justin "juster" Davis <jrcd83@gmail.com> - -use warnings 'FATAL' => 'all'; -use strict; - -package Common; - -sub evalver -{ - my ($path, $mod) = @_; - - open my $fh, '<', $path or die "open $path: $!"; - - my $m = ($mod - ? qr/(?:\$${mod}::VERSION|\$VERSION)/ - : qr/\$VERSION/); - - while (my $ln = <$fh>) { - next unless $ln =~ /\s*$m\s*=\s*.+/; - chomp $ln; - my $ver = do { no strict; eval $ln }; - return $ver unless $@; - die qq{$path:$. bad version string in "$ln"\n}; - } - - close $fh; - return undef; -} - - -#----------------------------------------------------------------------------- - -package Dists; - -sub maindistfile -{ - my ($dist, $dir) = @_; - - # libpath is the modern style, installing modules under lib/ - # with dirs matching the name components. - my $libpath = join q{/}, 'lib', split /-/, "${dist}.pm"; - - # dumbpath is an old style where there's no subdirs and just - # a .pm file. - my $dumbpath = $dist; - $dumbpath =~ s/\A.+-//; - $dumbpath .= ".pm"; - - my @paths = ($libpath, $dumbpath); - # Some modules (with simple names like XSLoader, lib, etc) are - # generated by Makefile.PL. Search through their generating code. - push @paths, "${dist}_pm.PL" if $dist =~ tr/-/-/ == 0; - - for my $path (map { "$dir/$_" } @paths) { return $path if -f $path; } - return undef; -} - -sub module_ver -{ - my ($dist, $dir) = @_; - - my $path = maindistfile($dist, $dir) or return undef; - - my $mod = $dist; - $mod =~ s/-/::/g; - my $ver = Common::evalver($path, $mod); - unless ($ver) { - warn "failed to find version in module file for $dist\n"; - return undef; - } - - return $ver; -} - -sub changelog_ver -{ - my ($dist, $dir) = @_; - - my $path; - for my $tmp (glob "$dir/{Changes,ChangeLog}") { - if (-f $tmp) { $path = $tmp; last; } - } - return undef unless $path; - - open my $fh, '<', $path or die "open: $!"; - while (<$fh>) { - return $1 if /\A\s*(?:$dist[ \t]*)?([0-9._]+)/; - return $1 if /\A\s*version\s+([0-9._]+)/i; - } - close $fh; - - return undef; -} - -# for some reason podlators has a VERSION file with perl code in it -sub verfile_ver -{ - my ($dist, $dir) = @_; - - my $path = "$dir/VERSION"; - return undef unless -f $path; # no warning, only podlaters has it - - return Common::evalver($path); -} - -# scans a directory full of nicely separated dist. directories. -sub scan_distroot -{ - my ($distroot) = @_; - opendir my $cpand, "$distroot" or die "failed to open $distroot"; - my @dists = grep { !/^\./ && -d "$distroot/$_" } readdir $cpand; - closedir $cpand; - - my @found; - for my $dist (@dists) { - my $distdir = "$distroot/$dist"; - my $ver = (module_ver($dist, $distdir) - || changelog_ver($dist, $distdir) - || verfile_ver($dist, $distdir)); - - if ($ver) { push @found, [ $dist, $ver ]; } - else { warn "failed to find version for $dist\n"; } - } - return @found; -} - -sub find -{ - my ($srcdir) = @_; - return map { scan_distroot($_) } glob "$srcdir/{cpan,dist}"; -} - -#----------------------------------------------------------------------------- - -package Modules; - -use HTTP::Tiny qw(); -use File::Find qw(); -use File::stat; - -*findfile = *File::Find::find; - -sub cpan_provider -{ - my ($module) = @_; - my $url = "http://cpanmetadb.plackperl.org/v1.0/package/$module"; - my $http = HTTP::Tiny->new; - my $resp = $http->get($url); - return undef unless $resp->{'success'}; - - my ($cpanpath) = $resp->{'content'} =~ /^distfile: (.*)$/m - or return undef; - - my $dist = $cpanpath; - $dist =~ s{\A.+/}{}; # remove author directory - $dist =~ s{-[^-]+\z}{}; # remove version and extension - return ($dist eq 'perl' ? undef : $dist); -} - -sub find -{ - my ($srcdir) = @_; - my $libdir = "$srcdir/lib/"; - die "failed to find $libdir directory" unless -d $libdir; - - # Find only the module files that have not changed since perl - # was extracted. We don't want the files perl just recently - # installed into lib/. We processed those already. - my @modfiles; - my $finder = sub { - return unless /[.]pm\z/; - return if m{\Q$libdir\E[^/]+/t/}; # ignore testing modules - push @modfiles, $_; - }; - findfile({ 'no_chdir' => 1, 'wanted' => $finder }, $libdir); - - # First we have to find what the oldest ctime actually is. - my $oldest = time; - @modfiles = map { - my $modfile = $_; - my $ctime = (stat $modfile)->ctime; - $oldest = $ctime if $ctime < $oldest; - [ $modfile, $ctime ]; # save ctime for later - } @modfiles; - - # Then we filter out any file that was created more than a - # few seconds after that. Process the rest. - my @mods; - for my $modfile (@modfiles) { - my ($mod, $ctime) = @$modfile; - next if $ctime - $oldest > 5; # ignore newer files - - my $path = $mod; - $mod =~ s{[.]pm\z}{}; - $mod =~ s{\A$libdir}{}; - $mod =~ s{/}{::}g; - - my $ver = Common::evalver($path, $mod) || q{}; - push @mods, [ $mod, $ver ]; - } - - # Convert modules names to the dist names who provide them. - my %seen; - my @dists; - for my $modref (@mods) { - my ($mod, $ver) = @$modref; - my $dist = cpan_provider($mod) or next; # filter out core modules - next if $seen{$dist}++; # avoid duplicate dists - push @dists, [ $dist, $ver ]; - } - return @dists; -} - -#----------------------------------------------------------------------------- - -package Dist2Pkg; - -sub name -{ - my ($name) = @_; - my $orig = $name; - - # Package names should be lowercase and consist of alphanumeric - # characters only (and hyphens!)... - $name =~ tr/A-Z/a-z/; - $name =~ tr/_+/-/; # _ and +'s converted to - (ie Tabbed-Text+Wrap) - $name =~ tr/-a-z0-9+//cd; # Delete all other chars. - $name =~ tr/-/-/s; - - # Delete leading or trailing hyphens... - $name =~ s/\A-|-\z//g; - - die qq{Dist. name '$orig' completely violates packaging standards} - unless $name; - - return "perl-$name"; -} - -sub version -{ - my ($version) = @_; - - # Package versions should be numbers and decimal points only... - $version =~ tr/-/./; - $version =~ tr/_0-9.-//cd; - - # Remove developer versions because pacman has no special logic - # to compare them to regular versions like perl does. - $version =~ s/_[^_]+\z//; - - $version =~ tr/_//d; # delete other underscores - $version =~ tr/././s; # only one period at a time - $version =~ s/\A[.]|[.]\z//g; # shouldn't start or stop with a period - - return $version; -} - -#----------------------------------------------------------------------------- - -package main; - -my %CPANNAME = ('List-Util' => 'Scalar-List-Utils', - 'Text-Tabs' => 'Text-Tabs+Wrap', - 'Cwd' => 'PathTools'); - -my $perldir = shift or die "Usage: $0 [path to perl source directory]\n"; -die "$perldir is not a valid directory." unless -d $perldir; - -my @dists = (Dists::find($perldir), Modules::find($perldir)); -for my $dist (@dists) { - my $name = $dist->[0]; - $dist->[0] = $CPANNAME{$name} if exists $CPANNAME{$name}; -} - -my @pkgs = map { - my ($name, $ver) = @$_; - $name = Dist2Pkg::name($name); - $ver = Dist2Pkg::version($ver); - [ $name, $ver ]; -} @dists; - -@pkgs = sort { $a->[0] cmp $b->[0] } @pkgs; - -for my $pkg (@pkgs) { - my ($name, $ver) = @$pkg; - print "$name=$ver\n"; -} diff --git a/abs/core/perl/upgpkg b/abs/core/perl/upgpkg new file mode 100644 index 0000000..6a38607 --- /dev/null +++ b/abs/core/perl/upgpkg @@ -0,0 +1,4 @@ +upgpkg_build() { + makepkg -o + ./patchprov src/perl-$pkgver PKGBUILD +} |