+#
+# Conditional build:
+%bcond_without tests # build without tests
+
+%define php_name php%{?php_suffix}
%define modname memcache
+%define php_min_version 5.0.0
+%define commit e702b5f91
Summary: %{modname} - a memcached extension
Summary(pl.UTF-8): %{modname} - rozszerzenie memcached
-Name: php-pecl-%{modname}
-Version: 3.0.4
-Release: 3
+Name: %{php_name}-pecl-%{modname}
+Version: 4.0.5.1
+Release: 1
License: PHP 3.01
Group: Development/Languages/PHP
-Source0: http://pecl.php.net/get/%{modname}-%{version}.tgz
-# Source0-md5: 07933ce0191274201ea6905cd509c5b0
-URL: http://pecl.php.net/package/memcache/
-BuildRequires: php-devel >= 3:5.0.0
-BuildRequires: rpmbuild(macros) >= 1.344
+Source0: https://pecl.php.net/get/memcache-%{version}.tgz
+# Source0-md5: 0b11dcaa218872b7645d2c3425ce7fe8
+Source1: %{modname}.ini
+Source2: %{modname}-apache.conf
+Source3: %{modname}-lighttpd.conf
+Source4: config.php
+Patch0: %{modname}-webapp.patch
+Patch1: tests.patch
+URL: https://pecl.php.net/package/memcache
+BuildRequires: %{php_name}-devel >= 3:7.0.0
+BuildRequires: %{php_name}-pcre
+BuildRequires: %{php_name}-session
+BuildRequires: %{php_name}-simplexml
+BuildRequires: %{php_name}-spl
+BuildRequires: %{php_name}-xml
+BuildRequires: php-packagexml2cl
+BuildRequires: rpm-php-pearprov >= 4.4.2-11
+BuildRequires: rpmbuild(macros) >= 1.650
+%if %{with tests}
+BuildRequires: %{php_name}-cli
+BuildRequires: memcached
+%endif
%{?requires_php_extension}
-Requires: php-common >= 4:5.0.4
-Requires: php-session
-Requires: php-zlib
-#Suggests: memcached
-Obsoletes: php-pear-%{modname}
+Requires: %{php_name}-session
+Requires: %{php_name}-zlib
+Suggests: memcached
+Provides: php(memcache) = %{version}
+Obsoletes: php-pecl-memcache < 3.0.8-5
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+%define _webapps /etc/webapps
+%define _webapp %{modname}
+%define _sysconfdir %{_webapps}/%{_webapp}
+%define _appdir %{_datadir}/%{_webapp}
+
+# bad depsolver
+%define _noautopear pear
+
+# put it together for rpmbuild
+%define _noautoreq %{?_noautophp} %{?_noautopear}
+
%description
Memcached is a caching daemon designed especially for dynamic web
applications to decrease database load by storing objects in memory.
To rozszerzenie umożliwia pracę z memcached za pomocą poręcznego
zorientowanego obiektowo (oraz przez procedury) interfejsu.
+%package web
+Summary: Web interface for memcache
+Group: Libraries
+# does not require extension itself
+Requires: php(core) >= %{php_min_version}
+Requires: php(date)
+Requires: php(gd)
+Requires: php(pcre)
+Requires: webapps
+Requires: webserver(php) >= 5.0
+%if "%{_rpmversion}" >= "5"
+BuildArch: noarch
+%endif
+
+%description web
+Via this web interface script you can manage and view statistics of
+memcache.
+
%prep
-%setup -q -c
-mv %{modname}-%{version}/* .
+%setup -qc
+mv %{modname}-*/* .
+%patch0 -p1
+%patch1 -p1
+
+cat <<'EOF' > run-tests.sh
+#!/bin/sh
+export NO_INTERACTION=1 REPORT_EXIT_STATUS=1 MALLOC_CHECK_=2
+exec %{__make} test \
+ PHP_EXECUTABLE=%{__php} \
+%if "%php_major_version.%php_minor_version" >= "7.4"
+ PHP_TEST_SHARED_SYSTEM_EXTENSIONS="simplexml session" \
+%else
+ PHP_TEST_SHARED_SYSTEM_EXTENSIONS="pcre spl simplexml session" \
+%endif
+ RUN_TESTS_SETTINGS="-q $*"
+EOF
+chmod +x run-tests.sh
+
+# skip failed tests
+die() {
+ echo >&2 "$*"
+ exit 1
+}
+xfail() {
+ set +x
+ while read s; do
+ t=$(echo "$s" | sed -rne 's/.+\[(.+)\]/\1/p')
+
+ test -f "$t" || die "Missing $t"
+ echo >&2 "XFAIL: $s"
+ cat >> $t <<-EOF
+
+ --XFAIL--
+ Skip
+ EOF
+ done
+}
+
+xfail <<'EOF'
+memcache->addServer() [tests/019.phpt]
+memcache->set()/memcache->get() with multiple keys and load balancing [tests/020.phpt]
+memcache->getExtendedStats() [tests/022.phpt]
+memcache_get_extended_stats() [tests/022a.phpt]
+memcache->delete() with load balancing [tests/023.phpt]
+memcache->increment() with load balancing [tests/025.phpt]
+memcache->delete() with load balancing [tests/026.phpt]
+memcache->addServer() adding server in failed mode [tests/031.phpt]
+memcache->getServerStatus(), memcache->setServerParams() [tests/032.phpt]
+memcache::connect() with unix domain socket [tests/035.phpt]
+ini_set('session.save_handler') [tests/036.phpt]
+ini_set('session.save_path') [tests/036b.phpt]
+memcache->increment()/decrement() with multiple keys [tests/040.phpt]
+memcache->delete() with multiple keys [tests/041.phpt]
+memcache->set() with multiple values [tests/042.phpt]
+ini_set('memcache.redundancy') [tests/043.phpt]
+ini_set('memcache.session_redundancy') [tests/044.phpt]
+hash strategies and functions [tests/046.phpt]
+ini_set('session.save_handler') with unix domain socket [tests/053.phpt]
+memcache multi host save path function [tests/bug73539.phpt]
+session_regenerate_id() should not cause fatal error [tests/githubbug13.phpt]
+EOF
%build
+packagexml2cl package.xml > ChangeLog
phpize
%configure \
--with-zlib-dir=/usr
%{__make}
+# simple module load test
+%{__php} -n -q \
+ -d extension_dir=modules \
+%if "%php_major_version.%php_minor_version" >= "7.4"
+ -d extension=%{php_extensiondir}/simplexml.so \
+ -d extension=%{php_extensiondir}/session.so \
+%else
+ -d extension=%{php_extensiondir}/pcre.so \
+ -d extension=%{php_extensiondir}/spl.so \
+ -d extension=%{php_extensiondir}/simplexml.so \
+ -d extension=%{php_extensiondir}/session.so \
+%endif
+ -d extension=%{modname}.so \
+ -m > modules.log
+grep %{modname} modules.log
+
+%if %{with tests}
+# Launch the Memcached service and stop it on exit
+domainsocket=$PWD/memcached.sock
+%{_sbindir}/memcached -p 11211 -U 11211 -d -P $PWD/memcached.pid
+%{_sbindir}/memcached -s $domainsocket -d -P $PWD/memcached-udp.pid
+trap 'kill $(cat memcached.pid memcached-udp.pid)' EXIT INT
+
+./run-tests.sh --show-diff
+%endif
+
%install
rm -rf $RPM_BUILD_ROOT
install -d $RPM_BUILD_ROOT{%{php_sysconfdir}/conf.d,%{php_extensiondir},%{_examplesdir}/%{name}-%{version}}
+install -p modules/%{modname}.so $RPM_BUILD_ROOT%{php_extensiondir}
+# we use "session_" prefix in inifile to get loader *after* session extension
+cp -p %{SOURCE1} $RPM_BUILD_ROOT%{php_sysconfdir}/conf.d/session_%{modname}.ini
+cp -p example.php $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
-install modules/%{modname}.so $RPM_BUILD_ROOT%{php_extensiondir}
-cat <<'EOF' > $RPM_BUILD_ROOT%{php_sysconfdir}/conf.d/session_%{modname}.ini
-; Enable %{modname} extension module
-extension=%{modname}.so
-;memcache.allow_failover=1
-;memcache.chunk_size=8192
-;memcache.default_port=11211
-;memcache.protocol=ascii
-;memcache.redudndancy=1
-;memcache.session_redundancy=2
-;memcache.hash_strategy=consistent
-;memcache.hash_function=crc32
-EOF
-cp -a example.php memcache.php $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
+install -d $RPM_BUILD_ROOT{%{_sysconfdir},%{_appdir}}
+cp -p memcache.php $RPM_BUILD_ROOT%{_appdir}
+cp -p %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/config.php
+cp -p %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/apache.conf
+cp -p $RPM_BUILD_ROOT%{_sysconfdir}/{apache,httpd}.conf
+cp -p %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/lighttpd.conf
%clean
rm -rf $RPM_BUILD_ROOT
%php_webserver_restart
fi
+%triggerin web -- apache1 < 1.3.37-3, apache1-base
+%webapp_register apache %{_webapp}
+
+%triggerun web -- apache1 < 1.3.37-3, apache1-base
+%webapp_unregister apache %{_webapp}
+
+%triggerin web -- apache < 2.2.0, apache-base
+%webapp_register httpd %{_webapp}
+
+%triggerun web -- apache < 2.2.0, apache-base
+%webapp_unregister httpd %{_webapp}
+
+%triggerin web -- lighttpd
+%webapp_register lighttpd %{_webapp}
+
+%triggerun web -- lighttpd
+%webapp_unregister lighttpd %{_webapp}
+
%files
%defattr(644,root,root,755)
-%doc CREDITS README
+%doc CREDITS README ChangeLog
%config(noreplace) %verify(not md5 mtime size) %{php_sysconfdir}/conf.d/session_%{modname}.ini
%attr(755,root,root) %{php_extensiondir}/%{modname}.so
%{_examplesdir}/%{name}-%{version}
+
+%files web
+%defattr(644,root,root,755)
+%dir %attr(750,root,http) %{_sysconfdir}
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/apache.conf
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/httpd.conf
+%attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lighttpd.conf
+%attr(640,root,http) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/config.php
+%{_appdir}