You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2022/01/14 14:01:51 UTC

svn commit: r1897034 [35/37] - in /subversion/branches/multi-wc-format: ./ build/ build/ac-macros/ build/generator/ build/generator/swig/ build/generator/templates/ contrib/client-side/ contrib/client-side/svn_load_dirs/ contrib/hook-scripts/ contrib/s...

Modified: subversion/branches/multi-wc-format/tools/dev/unix-build/Makefile.svn
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dev/unix-build/Makefile.svn?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dev/unix-build/Makefile.svn (original)
+++ subversion/branches/multi-wc-format/tools/dev/unix-build/Makefile.svn Fri Jan 14 14:01:45 2022
@@ -46,11 +46,19 @@ USE_HTTPV1 ?= no
 USE_AUTHZ_SHORT_CIRCUIT ?= no
 RAMDISK ?= /ramdisk
 MAKE_JOBS ?= 4
+# available backends: fsfs fsx bdb
+SVN_CHECK_FS_BACKENDS ?= fsfs
 
 PWD		= $(shell pwd)
 UNAME		= $(shell uname)
 RUBY		= $(shell which ruby 2>/dev/null)
 ifeq ($(RUBY),)
+RUBY		= $(shell which ruby27 2>/dev/null)
+ifeq ($(RUBY),)
+RUBY		= $(shell which ruby26 2>/dev/null)
+ifeq ($(RUBY),)
+RUBY		= $(shell which ruby25 2>/dev/null)
+ifeq ($(RUBY),)
 RUBY		= $(shell which ruby24 2>/dev/null)
 ifeq ($(RUBY),)
 RUBY		= $(shell which ruby23 2>/dev/null)
@@ -71,6 +79,9 @@ endif # 2.1
 endif # 2.2
 endif # 2.3
 endif # 2.4
+endif # 2.5
+endif # 2.6
+endif # 2.7
 
 ifeq ($(UNAME),OpenBSD)
 # Pick the correct base compiler (ie. clang rather than ancient gcc 4.2.1)
@@ -85,8 +96,12 @@ else
 BRANCH		= $(TAG)
 endif
 WC		?= $(BRANCH)
-BRANCH_MAJOR	= $(shell echo $(BRANCH) | \
-			sed -e 's/\([0-9]\)\.\([0-9]\)\.[x0-9].*$$/\1.\2/')
+BRANCH_MAJOR	:= $(shell echo $(BRANCH) | sed -E 's/([0-9]+)\.([0-9]+)\..*/\1.\2/')
+ifeq ($(BRANCH_MAJOR), $(filter 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13, $(BRANCH_MAJOR)))
+PYTHON = python2
+else
+PYTHON = python
+endif
 SVN_REL_WC	= svn-$(WC)
 SVN_WC		= $(PWD)/$(SVN_REL_WC)
 PREFIX		= $(PWD)/prefix
@@ -97,20 +112,23 @@ OBJDIR		= $(PWD)/objdir
 
 BDB_MAJOR_VER	= 4.7
 BDB_VER		= $(BDB_MAJOR_VER).25
-APR_VER		= 1.5.2
+APR_VER		= 1.7.0
 APR_ICONV_VER	= 1.2.1
 GNU_ICONV_VER	= 1.15
-APR_UTIL_VER	= 1.5.4
-HTTPD_VER	= 2.2.32
+APR_UTIL_VER	= 1.6.1
+PCRE_VER	= 8.41
+HTTPD_VER	= 2.4.37
 NEON_VER	= 0.30.2
 SERF_VER	= 1.3.9
 SERF_OLD_VER	= 0.3.1
 CYRUS_SASL_VER	= 2.1.25
 SQLITE_VER	= 3160200
 LIBMAGIC_VER	= 5.30
-RUBY_VER	= 2.4.4
+RUBY_VER	= 2.7.4
 BZ2_VER	= 1.0.6
-PYTHON_VER	= 2.7.13
+PYTHON_VER	= 3.7.5
+PYTHON2_VER	= 2.7.13
+PY3C_VER	= 1.1
 JUNIT_VER	= 4.10
 GETTEXT_VER	= 0.19.8.1
 LZ4_VER		= 1.7.5
@@ -121,11 +139,14 @@ GNU_ICONV_DIST	= libiconv-$(GNU_ICONV_VE
 NEON_DIST	= neon-$(NEON_VER).tar.gz
 SQLITE_DIST	= sqlite-autoconf-$(SQLITE_VER).tar.gz
 CYRUS_SASL_DIST	= cyrus-sasl-$(CYRUS_SASL_VER).tar.gz
+PCRE_DIST	= pcre-$(PCRE_VER).tar.gz
 HTTPD_DIST	= httpd-$(HTTPD_VER).tar.gz
 LIBMAGIC_DIST	= file-$(LIBMAGIC_VER).tar.gz
 RUBY_DIST	= ruby-$(RUBY_VER).tar.gz
 BZ2_DIST	= bzip2-$(BZ2_VER).tar.gz
 PYTHON_DIST	= Python-$(PYTHON_VER).tgz
+PYTHON2_DIST	= Python-$(PYTHON2_VER).tgz
+PY3C_DIST	= py3c-$(PY3C_VER).tar.gz
 JUNIT_DIST	= junit-${JUNIT_VER}.jar
 GETTEXT_DIST	= gettext-$(GETTEXT_VER).tar.gz
 LZ4_DIST	= lz4-$(LZ4_VER).tar.gz
@@ -133,14 +154,17 @@ LZ4_DIST	= lz4-$(LZ4_VER).tar.gz
 SHA256_${BDB_DIST} = f14fd96dd38915a1d63dcb94a63fbb8092334ceba6b5060760427096f631263e
 SHA256_${APR_ICONV_DIST} = 19381959d50c4a5f3b9c84d594a5f9ffb3809786919b3058281f4c87e1f4b245
 SHA256_${GNU_ICONV_DIST} = ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178
-SHA256_${HTTPD_DIST} = b6e1528779f99c301d6438d89ae892a311619b43a39f16297f9eabd4a8d16cb8
+SHA256_${PCRE_DIST} = 244838e1f1d14f7e2fa7681b857b3a8566b74215f28133f14a8f5e59241b682c
+SHA256_${HTTPD_DIST} = aa97a834a32d51974be8d8a013b561e28d327387cb1da2c3c2762acd0146aabd
 SHA256_${NEON_DIST} = db0bd8cdec329b48f53a6f00199c92d5ba40b0f015b153718d1b15d3d967fbca
 SHA256_${CYRUS_SASL_DIST} = 418c16e6240a4f9b637cbe3d62937b9675627bad27c622191d47de8686fe24fe
 SHA256_${SQLITE_DIST} = 65cc0c3e9366f50c0679c5ccd31432cea894bc4a3e8947dabab88c8693263615
 SHA256_${LIBMAGIC_DIST} = 694c2432e5240187524c9e7cf1ec6acc77b47a0e19554d34c14773e43dbbf214
-SHA256_${RUBY_DIST} = 254f1c1a79e4cc814d1e7320bc5bdd995dc57e08727d30a767664619a9c8ae5a
+SHA256_${RUBY_DIST} = 3043099089608859fc8cce7f9fdccaa1f53a462457e3838ec3b25a7d609fbc5b
 SHA256_${BZ2_DIST} = a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
-SHA256_${PYTHON_DIST} = a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1
+SHA256_${PYTHON_DIST} = 8ecc681ea0600bbfb366f2b173f727b205bb825d93d2f0b286bc4e58d37693da
+SHA256_${PYTHON2_DIST} = a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1
+SHA256_${PY3C_DIST} = c7ffc22bc92dded0ca859db53ef3a0b466f89a9f8aad29359c9fe4ff18ebdd20
 SHA256_${JUNIT_DIST} = 36a747ca1e0b86f6ea88055b8723bb87030d627766da6288bf077afdeeb0f75a
 SHA256_${GETTEXT_DIST} = ff942af0e438ced4a8b0ea4b0b6e0d6d657157c5e2364de57baa279c1c125c43
 SHA256_${LZ4_DIST} = 0190cacd63022ccb86f44fa5041dc6c3804407ad61550ca21c382827319e7e7e
@@ -161,6 +185,7 @@ endef
 DISTFILES	= $(DISTDIR)/$(NEON_DIST) \
 		$(DISTDIR)/$(SERF_DIST) \
 		$(DISTDIR)/$(SQLITE_DIST) \
+		$(DISTDIR)/$(PCRE_DIST) \
 		$(DISTDIR)/$(HTTPD_DIST) \
 		$(DISTDIR)/$(APR_ICONV_DIST) \
 		$(DISTDIR)/$(GNU_ICONV_DIST) \
@@ -169,6 +194,8 @@ DISTFILES	= $(DISTDIR)/$(NEON_DIST) \
 		$(DISTDIR)/$(RUBY_DIST) \
 		$(DISTDIR)/$(BZ2_DIST) \
 		$(DISTDIR)/$(PYTHON_DIST) \
+		$(DISTDIR)/$(PYTHON2_DIST) \
+		$(DISTDIR)/$(PY3C_DIST) \
 		$(DISTDIR)/$(JUNIT_DIST) \
 		$(DISTDIR)/$(GETTEXT_DIST)
 
@@ -180,18 +207,21 @@ APR_URL		= https://svn.apache.org/repos/
 APR_ICONV_URL	= https://archive.apache.org/dist/apr/$(APR_ICONV_DIST)
 GNU_ICONV_URL	= https://ftp.gnu.org/pub/gnu/libiconv/$(GNU_ICONV_DIST)
 APR_UTIL_URL	= https://svn.apache.org/repos/asf/apr/apr-util
+PCRE_URL	= https://ftp.pcre.org/pub/pcre/$(PCRE_DIST)
 HTTPD_URL	= https://archive.apache.org/dist/httpd/$(HTTPD_DIST)
 #NEON_URL	= http://webdav.org/neon/$(NEON_DIST)
 NEON_URL	= http://ftp.openbsd.org/pub/OpenBSD/distfiles/$(NEON_DIST)
 SERF_URL	= https://svn.apache.org/repos/asf/serf/tags/$(SERF_VER)
 SERF_OLD_URL	= https://svn.apache.org/repos/asf/serf/tags/$(SERF_OLD_VER)
 SQLITE_URL	= https://www.sqlite.org/2017/$(SQLITE_DIST)
-CYRUS_SASL_URL	= ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/$(CYRUS_SASL_DIST)
+CYRUS_SASL_URL	= https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-${CYRUS_SASL_VER}/$(CYRUS_SASL_DIST)
 LIBMAGIC_URL	= ftp://ftp.astron.com/pub/file/$(LIBMAGIC_DIST)
-RUBY_URL	= https://cache.ruby-lang.org/pub/ruby/2.4/$(RUBY_DIST)
-BZ2_URL		= https://ftp.openbsd.org/pub/OpenBSD/distfiles/$(BZ2_DIST)
+RUBY_URL	= https://cache.ruby-lang.org/pub/ruby/2.7/$(RUBY_DIST)
+BZ2_URL		= https://stsp.name/distfiles/$(BZ2_DIST)
 PYTHON_URL	= https://python.org/ftp/python/$(PYTHON_VER)/$(PYTHON_DIST)
-JUNIT_URL	= https://downloads.sourceforge.net/project/junit/junit/$(JUNIT_VER)/$(JUNIT_DIST)
+PYTHON2_URL	= https://python.org/ftp/python/$(PYTHON2_VER)/$(PYTHON2_DIST)
+PY3C_URL	= https://stsp.name/distfiles/py3c-${PY3C_VER}.tar.gz
+JUNIT_URL	= https://stsp.name/distfiles/$(JUNIT_DIST)
 GETTEXT_URL	= https://ftp.gnu.org/pub/gnu/gettext/$(GETTEXT_DIST)
 LZ4_URL		= https://github.com/lz4/lz4/archive/v$(LZ4_VER).tar.gz
 
@@ -201,6 +231,7 @@ APR_SRCDIR	= $(SRCDIR)/apr-$(APR_VER)
 APR_ICONV_SRCDIR	= $(SRCDIR)/apr-iconv-$(APR_ICONV_VER)
 GNU_ICONV_SRCDIR	= $(SRCDIR)/libiconv-$(GNU_ICONV_VER)
 APR_UTIL_SRCDIR	= $(SRCDIR)/apr-util-$(APR_UTIL_VER)
+PCRE_SRCDIR	= $(SRCDIR)/pcre-$(PCRE_VER)
 HTTPD_SRCDIR	= $(SRCDIR)/httpd-$(HTTPD_VER)
 NEON_SRCDIR	= $(SRCDIR)/neon-$(NEON_VER)
 SERF_SRCDIR	= $(SRCDIR)/serf-$(SERF_VER)
@@ -211,6 +242,8 @@ LIBMAGIC_SRCDIR	= $(SRCDIR)/file-$(LIBMA
 RUBY_SRCDIR	= $(SRCDIR)/ruby-$(RUBY_VER)
 BZ2_SRCDIR	= $(SRCDIR)/bzip2-$(BZ2_VER)
 PYTHON_SRCDIR	= $(SRCDIR)/Python-$(PYTHON_VER)
+PYTHON2_SRCDIR	= $(SRCDIR)/Python-$(PYTHON2_VER)
+PY3C_SRCDIR	= $(SRCDIR)/py3c-$(PY3C_VER)
 GETTEXT_SRCDIR	= $(SRCDIR)/gettext-$(GETTEXT_VER)
 LZ4_SRCDIR	= ${SRCDIR}/lz4-$(LZ4_VER)
 SVN_SRCDIR	= $(SVN_WC)
@@ -220,6 +253,7 @@ APR_OBJDIR	= $(OBJDIR)/apr-$(APR_VER)
 APR_ICONV_OBJDIR	= $(OBJDIR)/apr-iconv-$(APR_ICONV_VER)
 GNU_ICONV_OBJDIR	= $(OBJDIR)/libiconv-$(GNU_ICONV_VER)
 APR_UTIL_OBJDIR	= $(OBJDIR)/apr-util-$(APR_UTIL_VER)
+PCRE_OBJDIR	= $(OBJDIR)/pcre-$(PCRE_VER)
 HTTPD_OBJDIR	= $(OBJDIR)/httpd-$(HTTPD_VER)
 NEON_OBJDIR	= $(OBJDIR)/neon-$(NEON_VER)
 SERF_OBJDIR	= $(OBJDIR)/serf-$(SERF_VER)
@@ -230,6 +264,8 @@ LIBMAGIC_OBJDIR	= $(OBJDIR)/file-$(LIBMA
 RUBY_OBJDIR	= $(OBJDIR)/ruby-$(RUBY_VER)
 BZ2_OBJDIR	= $(OBJDIR)/bzip2-$(BZ2_VER)
 PYTHON_OBJDIR	= $(OBJDIR)/python-$(PYTHON_VER)
+PYTHON2_OBJDIR	= $(OBJDIR)/python-$(PYTHON2_VER)
+PY3C_OBJDIR	= $(OBJDIR)/py3c-$(PY3C_VER)
 GETTEXT_OBJDIR	= $(OBJDIR)/gettext-$(GETTEXT_VER)
 LZ4_OBJDIR	= ${OBJDIR}/lz4-$(LZ4_VER)
 SVN_OBJDIR	= $(OBJDIR)/$(SVN_REL_WC)
@@ -244,10 +280,10 @@ PROFILE_CFLAGS=-pg
 endif
 
 # We need this to make sure some targets below pick up the right libraries
-LD_LIBRARY_PATH=$(PREFIX)/apr/lib:$(PREFIX)/gettext/lib:$(PREFIX)/iconv/lib:$(PREFIX)/bdb/lib:$(PREFIX)/neon/lib:$(PREFIX)/serf/lib:$(PREFIX)/sqlite/lib:$(PREFIX)/cyrus-sasl/lib:$(PREFIX)/iconv/lib:$(PREFIX)/libmagic/lib:$(PREFIX)/ruby/lib:$(PREFIX)/python/lib:$(PREFIX)/svn-$(WC)/lib
+LD_LIBRARY_PATH=$(PREFIX)/apr/lib:$(PREFIX)/gettext/lib:$(PREFIX)/iconv/lib:$(PREFIX)/bdb/lib:$(PREFIX)/neon/lib:$(PREFIX)/serf/lib:$(PREFIX)/sqlite/lib:$(PREFIX)/cyrus-sasl/lib:$(PREFIX)/iconv/lib:$(PREFIX)/libmagic/lib:$(PREFIX)/ruby/lib:$(PREFIX)/svn-$(WC)/lib
 
 # We need this to make sure some targets below pick up the right pkg-config files
-PKG_CONFIG_PATH=$(PREFIX)/apr/lib/pkgconfig:$(PREFIX)/neon/lib/pkgconfig:$(PREFIX)/serf/lib/pkgconfig:$(PREFIX)/sqlite/lib/pkgconfig:$(PREFIX)/ruby/lib/pkgconfig:$(PREFIX)/python/lib/pkgconfig:$(PREFIX)/lz4/lib/pkgconfig
+PKG_CONFIG_PATH=$(PREFIX)/apr/lib/pkgconfig:$(PREFIX)/neon/lib/pkgconfig:$(PREFIX)/serf/lib/pkgconfig:$(PREFIX)/sqlite/lib/pkgconfig:$(PREFIX)/ruby/lib/pkgconfig:$(PREFIX)/lz4/lib/pkgconfig
 
 
 #######################################################################
@@ -257,22 +293,22 @@ PKG_CONFIG_PATH=$(PREFIX)/apr/lib/pkgcon
 .PHONY: all reset clean nuke fetch
 
 all: dirs-create bdb-install apr-install iconv-install apr-util-install \
-	httpd-install neon-install serf-install serf-old-install \
+	pcre-install httpd-install neon-install serf-install serf-old-install \
 	sqlite-install cyrus-sasl-install libmagic-install \
-	ruby-install bz2-install python-install gettext-install \
-	lz4-install svn-install svn-bindings-install
+	ruby-install bz2-install python-install python2-install py3c-retrieve \
+	gettext-install lz4-install svn-install svn-bindings-install
 
 # Use these to start a build from the beginning.
 reset: dirs-reset bdb-reset apr-reset iconv-reset apr-util-reset \
-	httpd-reset neon-reset serf-reset serf-old-reset sqlite-reset \
-	cyrus-sasl-reset libmagic-reset ruby-reset python-reset \
-	bz2-reset gettext-reset lz4-reset svn-reset
+	pcre-reset httpd-reset neon-reset serf-reset serf-old-reset \
+	sqlite-reset cyrus-sasl-reset libmagic-reset ruby-reset python-reset \
+	python2-reset bz2-reset gettext-reset lz4-reset svn-reset
 
 # Use to save disk space.
-clean: bdb-clean apr-clean iconv-clean apr-util-clean httpd-clean \
+clean: bdb-clean apr-clean iconv-clean apr-util-clean pcre-clean httpd-clean \
 	neon-clean serf-clean serf-old-clean sqlite-clean cyrus-sasl-clean \
-	libmagic-clean ruby-clean bz2-clean python-clean gettext-clean \
-	lz4-clean svn-clean
+	libmagic-clean ruby-clean bz2-clean python-clean python2-clean \
+	gettext-clean lz4-clean svn-clean
 
 # Nukes everything (including installed binaries!)
 # Use this to start ALL OVER AGAIN! Use with caution!
@@ -529,6 +565,8 @@ $(GNU_ICONV_OBJDIR)/.retrieved: $(DISTDI
 	cd $(SRCDIR)/libiconv-$(GNU_ICONV_VER) && \
 		patch -p0 < $(GNU_ICONV_OBJDIR)/lib_encodings.def.diff && \
 		patch -p0 < $(GNU_ICONV_OBJDIR)/lib_aliases.gperf.diff
+	cd $(SRCDIR)/libiconv-${GNU_ICONV_VER} && \
+		sed -i 's/gcc/${CC}/' Makefile.devel
 	touch $@
 
 # configure gnu-iconv
@@ -632,6 +670,53 @@ $(APR_UTIL_OBJDIR)/.installed: $(APR_UTI
 	touch $@
 
 #######################################################################
+# pcre
+#######################################################################
+
+pcre-retrieve:	$(PCRE_OBJDIR)/.retrieved
+pcre-configure:	$(PCRE_OBJDIR)/.configured
+pcre-compile:	$(PCRE_OBJDIR)/.compiled
+pcre-install:	$(PCRE_OBJDIR)/.installed
+pcre-reset:
+	$(foreach f, .retrieved .configured .compiled .installed, \
+		rm -f $(PCRE_OBJDIR)/$(f);)
+
+pcre-clean:
+	-(cd $(PCRE_OBJDIR) && env MAKEFLAGS= make clean)
+
+# fetch distfile for pcre
+$(DISTDIR)/$(PCRE_DIST):
+	cd $(DISTDIR) && $(FETCH_CMD) $(PCRE_URL)
+
+# retrieve pcre
+$(PCRE_OBJDIR)/.retrieved: $(DISTDIR)/$(PCRE_DIST)
+	$(call do_check_sha256,$(PCRE_DIST))
+	[ -d $(PCRE_OBJDIR) ] || mkdir -p $(PCRE_OBJDIR)
+	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(PCRE_DIST)
+	touch $@
+
+# configure pcre
+$(PCRE_OBJDIR)/.configured: $(PCRE_OBJDIR)/.retrieved
+	cd $(PCRE_OBJDIR) \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		CC=$(CC) CXX=$(CXX) \
+		GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
+		$(PCRE_SRCDIR)/configure \
+		--prefix=$(PREFIX)/pcre
+	touch $@
+
+# compile pcre
+$(PCRE_OBJDIR)/.compiled: $(PCRE_OBJDIR)/.configured
+	(cd $(PCRE_OBJDIR) && env MAKEFLAGS= make -j${MAKE_JOBS})
+	touch $@
+
+# install pcre
+$(PCRE_OBJDIR)/.installed: $(PCRE_OBJDIR)/.compiled
+	(cd $(PCRE_OBJDIR) && env MAKEFLAGS= make install)
+	touch $@
+
+#######################################################################
 # httpd
 #######################################################################
 
@@ -646,104 +731,50 @@ httpd-reset:
 
 httpd-clean:
 	-(cd $(HTTPD_OBJDIR) && env MAKEFLAGS= make clean)
-	-rm ${HTTPD_OBJDIR}/chil-engine.diff
-	-rm ${HTTPD_OBJDIR}/ssl-set-state.diff
-	-rm ${HTTPD_OBJDIR}/acinclude.diff
+	rm -f $(HTTPD_OBJDIR)/mod-proxy-no-threads-2.4.diff
+	rm -f $(HTTPD_OBJDIR)/ssl-init-proxy-certs.diff
 
 # fetch distfile for httpd
 $(DISTDIR)/$(HTTPD_DIST):
 	cd $(DISTDIR) && $(FETCH_CMD) $(HTTPD_URL)
 
-$(HTTPD_OBJDIR)/chil-engine.diff:
-	mkdir -p $(dir $@)
-	echo > $@.tmp '--- modules/ssl/ssl_engine_init.c.orig	Mon Apr 14 13:20:57 2014'
-	echo >>$@.tmp '+++ modules/ssl/ssl_engine_init.c	Mon Apr 14 13:21:22 2014'
-	echo >>$@.tmp '@@ -406,9 +406,11 @@ void ssl_init_Engine(server_rec *s, apr_pool_t *p)'
-	echo >>$@.tmp '             ssl_die();'
-	echo >>$@.tmp '         }'
-	echo >>$@.tmp ' '
-	echo >>$@.tmp '+#ifdef ENGINE_CTRL_CHIL_SET_FORKCHECK'
-	echo >>$@.tmp '         if (strEQ(mc->szCryptoDevice, "chil")) {'
-	echo >>$@.tmp '             ENGINE_ctrl(e, ENGINE_CTRL_CHIL_SET_FORKCHECK, 1, 0, 0);'
-	echo >>$@.tmp '         }'
-	echo >>$@.tmp '+#endif'
-	echo >>$@.tmp ' '
-	echo >>$@.tmp '         if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {'
-	echo >>$@.tmp '             ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,'
-	mv -f $@.tmp $@
-
-$(HTTPD_OBJDIR)/ssl-set-state.diff:
-	mkdir -p $(dir $@)
-	echo > $@.tmp '--- modules/ssl/ssl_toolkit_compat.h.orig	Fri Feb  3 10:47:33 2017'
-	echo >>$@.tmp '+++ modules/ssl/ssl_toolkit_compat.h	Fri Feb  3 10:52:17 2017'
-	echo >>$@.tmp '@@ -84,7 +84,9 @@'
-	echo >>$@.tmp ' #define SSL_get_state(ssl) SSL_state(ssl)'
-	echo >>$@.tmp ' #endif'
-	echo >>$@.tmp ' '
-	echo >>$@.tmp '+#ifndef HAVE_SSL_SET_STATE'
-	echo >>$@.tmp ' #define SSL_set_state(ssl,val) (ssl)->state = val'
-	echo >>$@.tmp '+#endif'
-	echo >>$@.tmp ' '
-	echo >>$@.tmp ' #define MODSSL_BIO_CB_ARG_TYPE const char'
-	echo >>$@.tmp ' #define MODSSL_CRYPTO_CB_ARG_TYPE const char'
-	mv -f $@.tmp $@
-
-$(HTTPD_OBJDIR)/acinclude.diff:
+$(HTTPD_OBJDIR)/ssl-init-proxy-certs.diff:
 	mkdir -p $(dir $@)
-	echo >$@.tmp '--- acinclude.m4.orig	Fri Feb  3 11:05:08 2017'
-	echo >>$@.tmp '+++ acinclude.m4	Fri Feb  3 11:05:15 2017'
-	echo >>$@.tmp '@@ -455,6 +455,7 @@'
-	echo >>$@.tmp '     AC_CHECK_HEADERS([openssl/engine.h])'
-	echo >>$@.tmp '     AC_CHECK_FUNCS([SSLeay_version SSL_CTX_new], [], [liberrors="yes"])'
-	echo >>$@.tmp '     AC_CHECK_FUNCS([ENGINE_init ENGINE_load_builtin_engines])'
-	echo >>$@.tmp '+    AC_CHECK_FUNCS(SSL_set_state)'
-	echo >>$@.tmp '   else'
-	echo >>$@.tmp '     AC_CHECK_FUNCS([SSLC_library_version SSL_CTX_new], [], [liberrors="yes"])'
-	echo >>$@.tmp '     AC_CHECK_FUNCS(SSL_set_state)'
+	echo > $@.tmp '--- modules/ssl/ssl_engine_init.c.orig	Sun Dec 16 13:34:14 2018'
+	echo >> $@.tmp '+++ modules/ssl/ssl_engine_init.c	Sun Dec 16 13:34:59 2018'
+	echo >> $@.tmp '@@ -1492,7 +1492,7 @@'
+	echo >> $@.tmp '     X509_STORE_CTX *sctx;'
+	echo >> $@.tmp '     X509_STORE *store = SSL_CTX_get_cert_store(mctx->ssl_ctx);'
+	echo >> $@.tmp ' '
+	echo >> $@.tmp '-#if OPENSSL_VERSION_NUMBER >= 0x1010100fL'
+	echo >> $@.tmp '+#if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(LIBRESSL_VERSION_NUMBER)'
+	echo >> $@.tmp '     /* For OpenSSL >=1.1.1, turn on client cert support which is'
+	echo >> $@.tmp '      * otherwise turned off by default (by design).'
+	echo >> $@.tmp '      * https://github.com/openssl/openssl/issues/6933 */'
 	mv -f $@.tmp $@
 
-# fix build without APR_HAS_THREADS (broken by r1750836)
-ifneq ($(THREADING),yes)
-HTTPD_REVERT_1750836_CMD = (cd $(HTTPD_SRCDIR)/modules/proxy && svn diff -c-1750836 https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/modules/proxy/proxy_util.c | patch)
-else
-HTTPD_REVERT_1750836_CMD = true
-endif
+$(HTTPD_OBJDIR)/mod-proxy-no-threads-2.4.diff:
+	cd $(HTTPD_OBJDIR) && $(FETCH_CMD) https://stsp.name/mod-proxy-no-threads-2.4.diff
 
 # retrieve httpd
 $(HTTPD_OBJDIR)/.retrieved: $(DISTDIR)/$(HTTPD_DIST) \
-	$(HTTPD_OBJDIR)/chil-engine.diff $(HTTPD_OBJDIR)/ssl-set-state.diff \
-	$(HTTPD_OBJDIR)/acinclude.diff
+	$(HTTPD_OBJDIR)/ssl-init-proxy-certs.diff \
+	$(HTTPD_OBJDIR)/mod-proxy-no-threads-2.4.diff
 	$(call do_check_sha256,$(HTTPD_DIST))
 	[ -d $(HTTPD_OBJDIR) ] || mkdir -p $(HTTPD_OBJDIR)
 	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(HTTPD_DIST)
-	cd $(HTTPD_SRCDIR) && patch -p0 < $(HTTPD_OBJDIR)/chil-engine.diff
-	cd $(HTTPD_SRCDIR) && patch -p0 < $(HTTPD_OBJDIR)/ssl-set-state.diff
-	cd $(HTTPD_SRCDIR) && patch -p0 < $(HTTPD_OBJDIR)/acinclude.diff
-	cp $(HTTPD_SRCDIR)/modules/ssl/ssl_toolkit_compat.h \
-		$(HTTPD_SRCDIR)/modules/ssl/ssl_toolkit_compat.h.orig
-	sed '/^#define HAVE_SSL_RAND_EGD/d' \
-		< $(HTTPD_SRCDIR)/modules/ssl/ssl_toolkit_compat.h.orig \
-		> $(HTTPD_SRCDIR)/modules/ssl/ssl_toolkit_compat.h
-	cp $(HTTPD_SRCDIR)/modules/ssl/ssl_engine_vars.c \
-		$(HTTPD_SRCDIR)/modules/ssl/ssl_engine_vars.c.orig
-	sed 's/^\(#if (OPENSSL_VERSION_NUMBER >= 0x00908000)\)$$/\1 \&\& !defined(OPENSSL_NO_COMP)/' \
-		< $(HTTPD_SRCDIR)/modules/ssl/ssl_engine_vars.c.orig \
-		> $(HTTPD_SRCDIR)/modules/ssl/ssl_engine_vars.c
-	cp $(HTTPD_SRCDIR)/modules/ssl/ssl_engine_init.c \
-		$(HTTPD_SRCDIR)/modules/ssl/ssl_engine_init.c.orig
-	$(foreach f,  ssl_engine_init.c ssl_util_ssl.c ssl_util_ssl.h, \
-		cp $(HTTPD_SRCDIR)/modules/ssl/${f}  $(HTTPD_SRCDIR)/modules/ssl/${f}.orig; \
-		sed 's/SSL_CTX_use_certificate_chain/_SSL_CTX_use_certificate_chain/' \
-		< $(HTTPD_SRCDIR)/modules/ssl/${f}.orig \
-		> $(HTTPD_SRCDIR)/modules/ssl/${f};\
-	)
-	$(HTTPD_REVERT_1750836_CMD)
+	(cd $(HTTPD_SRCDIR) && patch -p0 < $(HTTPD_OBJDIR)/ssl-init-proxy-certs.diff)
+	(cd $(HTTPD_SRCDIR) && patch -p0 < $(HTTPD_OBJDIR)/mod-proxy-no-threads-2.4.diff)
+	(cd $(HTTPD_SRCDIR) && svn diff -cr1849590 https://svn.apache.org/repos/asf/httpd/httpd/trunk | patch -p0)
+	(cd $(HTTPD_SRCDIR) && svn diff -cr1663375 https://svn.apache.org/repos/asf/httpd/httpd/trunk | patch -p0)
 	touch $@
 
 # configure httpd
 $(HTTPD_OBJDIR)/.configured: $(HTTPD_OBJDIR)/.retrieved \
-	$(APR_UTIL_OBJDIR)/.installed
-	cd $(HTTPD_SRCDIR) && ./buildconf
+	$(APR_UTIL_OBJDIR)/.installed $(PCRE_OBJDIR)/.installed
+	cd $(HTTPD_SRCDIR) && ./buildconf \
+		--with-apr="$(PREFIX)/apr/bin/apr-1-config" \
+		--with-apr-util="$(PREFIX)/apr/bin/apu-1-config"
 	cd $(HTTPD_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
 		CC=$(CC) CXX=$(CXX) \
@@ -751,13 +782,16 @@ $(HTTPD_OBJDIR)/.configured: $(HTTPD_OBJ
 		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(HTTPD_SRCDIR)/configure \
 		--prefix=$(PREFIX)/httpd \
-		--enable-maintainer-mode \
+		--with-mpm=prefork \
 		--enable-ssl \
 		--enable-dav \
 		--enable-proxy \
-		--with-mpm=prefork \
-		--with-apr="$(PREFIX)/apr" \
-		--with-apr-util="$(PREFIX)/apr"
+		--disable-md \
+		--disable-http2 \
+		--disable-brotli \
+		--with-apr="$(PREFIX)/apr/bin/apr-1-config" \
+		--with-apr-util="$(PREFIX)/apr/bin/apu-1-config" \
+		--with-pcre="$(PREFIX)/pcre"
 	touch $@
 
 # compile httpd
@@ -776,19 +810,28 @@ $(HTTPD_CONF):
 	echo > $@.tmp '# httpd config for use with mod_dav_svn'
 	echo >>$@.tmp 'ServerRoot "$(PREFIX)/httpd"'
 	echo >>$@.tmp 'Listen localhost:8080'
+	echo >>$@.tmp 'LoadModule unixd_module modules/mod_unixd.so'
+	echo >>$@.tmp 'LoadModule alias_module modules/mod_alias.so'
+	echo >>$@.tmp 'LoadModule access_compat_module modules/mod_access_compat.so'
+	echo >>$@.tmp 'LoadModule authn_core_module modules/mod_authn_core.so'
+	echo >>$@.tmp 'LoadModule authn_file_module modules/mod_authn_file.so'
+	echo >>$@.tmp 'LoadModule authz_core_module modules/mod_authz_core.so'
+	echo >>$@.tmp 'LoadModule authz_user_module modules/mod_authz_user.so'
+	echo >>$@.tmp 'LoadModule authz_groupfile_module modules/mod_authz_groupfile.so'
+	echo >>$@.tmp 'LoadModule auth_basic_module modules/mod_auth_basic.so'
+	echo >>$@.tmp 'LoadModule dav_module modules/mod_dav.so'
 	echo >>$@.tmp 'LoadModule dav_svn_module modules/svn-$(WC)/mod_dav_svn.so'
 	echo >>$@.tmp 'LoadModule authz_svn_module modules/svn-$(WC)/mod_authz_svn.so'
 	echo >>$@.tmp 'DocumentRoot "$(PREFIX)/httpd/htdocs"'
 	echo >>$@.tmp '<Directory />'
 	echo >>$@.tmp '    Options FollowSymLinks'
 	echo >>$@.tmp '    AllowOverride None'
-	echo >>$@.tmp '    Order deny,allow'
-	echo >>$@.tmp '    Deny from all'
+	echo >>$@.tmp '    Require all denied'
 	echo >>$@.tmp '</Directory>'
 	echo >>$@.tmp '<Location /repos>'
 	echo >>$@.tmp '    DAV svn'
 	echo >>$@.tmp '    SVNPath /tmp/svn-sandbox/repos'
-	echo >>$@.tmp '    Allow from localhost'
+	echo >>$@.tmp '    Require ip localhost'
 	echo >>$@.tmp '</Location>'
 	mv -f $@.tmp $@
 
@@ -1186,6 +1229,29 @@ $(RUBY_OBJDIR)/openssl_missing.patch:
 	echo >> $@.tmp ' #if defined(HAVE_AUTHENTICATED_ENCRYPTION) && !defined(EVP_CTRL_AEAD_GET_TAG)'
 	mv -f $@.tmp $@
 
+$(RUBY_OBJDIR)/sparc64_buserror.patch:
+	mkdir -p $(dir $@)
+	echo > $@.tmp '--- compile.c.orig	Thu Mar 12 12:58:26 2020'
+	echo >> $@.tmp '+++ compile.c	Thu Mar 12 16:36:55 2020'
+	echo >> $@.tmp '@@ -751,6 +751,16 @@'
+	echo >> $@.tmp '   #define STRICT_ALIGNMENT'
+	echo >> $@.tmp ' #endif'
+	echo >> $@.tmp ' '
+	echo >> $@.tmp '+/*'
+	echo >> $@.tmp '+ * Some OpenBSD platforms (including sparc64) require strict alignment.'
+	echo >> $@.tmp '+ */'
+	echo >> $@.tmp '+#if defined(__OpenBSD__)'
+	echo >> $@.tmp '+  #include <sys/endian.h>'
+	echo >> $@.tmp '+  #ifdef __STRICT_ALIGNMENT'
+	echo >> $@.tmp '+    #define STRICT_ALIGNMENT'
+	echo >> $@.tmp '+  #endif'
+	echo >> $@.tmp '+#endif'
+	echo >> $@.tmp '+'
+	echo >> $@.tmp ' #ifdef STRICT_ALIGNMENT'
+	echo >> $@.tmp '   #if defined(HAVE_TRUE_LONG_LONG) && SIZEOF_LONG_LONG > SIZEOF_VALUE'
+	echo >> $@.tmp '     #define ALIGNMENT_SIZE SIZEOF_LONG_LONG'
+	mv -f $@.tmp $@
+
 ifeq ($(UNAME),OpenBSD)
 RUBY_SSL_EX_NEW_DATA_PATCH = sed -i -e '/^have_func("X509_STORE_set_ex_data")$$/ { p; s/^.*$$/\have_func("X509_STORE_get_ex_new_index")/; }'
 else
@@ -1194,13 +1260,14 @@ endif
 
 # retrieve ruby
 #
-$(RUBY_OBJDIR)/.retrieved: $(DISTDIR)/$(RUBY_DIST) $(RUBY_OBJDIR)/openssl_missing.patch
+$(RUBY_OBJDIR)/.retrieved: $(DISTDIR)/$(RUBY_DIST) $(RUBY_OBJDIR)/openssl_missing.patch $(RUBY_OBJDIR)/sparc64_buserror.patch
 	$(call do_check_sha256,$(RUBY_DIST))
 	[ -d $(RUBY_OBJDIR) ] || mkdir -p $(RUBY_OBJDIR)
 	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(RUBY_DIST)
 	-which ghead && sed -i -e "s/head -c/ghead -c/" $(RUBY_SRCDIR)/configure
 	$(RUBY_SSL_EX_NEW_DATA_PATCH) $(RUBY_SRCDIR)/ext/openssl/extconf.rb
 	cd $(RUBY_SRCDIR) && patch -p0 < $(RUBY_OBJDIR)/openssl_missing.patch
+	cd $(RUBY_SRCDIR) && patch -p0 < $(RUBY_OBJDIR)/sparc64_buserror.patch
 	touch $@
 
 ifeq ($(THREADING),yes)
@@ -1291,14 +1358,9 @@ python-clean:
 $(DISTDIR)/$(PYTHON_DIST):
 	cd $(DISTDIR) && $(FETCH_CMD) $(PYTHON_URL)
 
-# https://bugs.python.org/issue12560
-$(DISTDIR)/python-issue12560.patch:
-	cd $(DISTDIR) && $(FETCH_CMD) -O "$@" \
-		https://hg.python.org/cpython/raw-rev/32cc37a89b58
-	
 # retrieve python
 #
-$(PYTHON_OBJDIR)/.retrieved: $(DISTDIR)/$(PYTHON_DIST) $(DISTDIR)/python-issue12560.patch
+$(PYTHON_OBJDIR)/.retrieved: $(DISTDIR)/$(PYTHON_DIST)
 	$(call do_check_sha256,$(PYTHON_DIST))
 	[ -d $(PYTHON_OBJDIR) ] || mkdir -p $(PYTHON_OBJDIR)
 	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(PYTHON_DIST)
@@ -1312,7 +1374,6 @@ $(PYTHON_OBJDIR)/.retrieved: $(DISTDIR)/
 		> $(PYTHON_SRCDIR)/setup.py.patched
 	mv $(PYTHON_SRCDIR)/setup.py.patched $(PYTHON_SRCDIR)/setup.py
 	chmod +x $(PYTHON_SRCDIR)/setup.py
-	cd $(PYTHON_SRCDIR) && patch -p1 < $(DISTDIR)/python-issue12560.patch
 	touch $@
 
 # configure python
@@ -1326,13 +1387,14 @@ $(PYTHON_OBJDIR)/.configured: $(PYTHON_O
 		CC=$(CC) CXX=$(CXX) \
 		CPPFLAGS="-I$(PREFIX)/bz2/include" \
 		LDFLAGS="-Wl,-rpath=$(PREFIX)/python/lib -L$(PREFIX)/bz2/lib" \
-		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python/lib:$$LD_LIBRARY_PATH" \
 		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(PYTHON_SRCDIR)/configure \
 		--prefix=$(PREFIX)/python \
 		--enable-shared \
 		--with-system-expat \
 		--with-dbmliborder=bdb \
+		--without-pymalloc \
 		$(PYTHON_PROFILING)
 	touch $@
 
@@ -1340,7 +1402,7 @@ $(PYTHON_OBJDIR)/.configured: $(PYTHON_O
 $(PYTHON_OBJDIR)/.compiled: $(PYTHON_OBJDIR)/.configured
 	(cd $(PYTHON_OBJDIR) && \
 		env MAKEFLAGS= \
-		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python/lib:$$LD_LIBRARY_PATH" \
 		make -j${MAKE_JOBS})
 	touch $@
 
@@ -1348,10 +1410,117 @@ $(PYTHON_OBJDIR)/.compiled: $(PYTHON_OBJ
 $(PYTHON_OBJDIR)/.installed: $(PYTHON_OBJDIR)/.compiled
 	(cd $(PYTHON_OBJDIR) && \
 		env MAKEFLAGS= \
-		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python/lib:$$LD_LIBRARY_PATH" \
 		make install)
+	ln -sf $(PREFIX)/python/bin/python3 $(PREFIX)/python/bin/python
 	touch $@
 
+#######################################################################
+# python 2
+#######################################################################
+
+python2-retrieve:	$(PYTHON2_OBJDIR)/.retrieved
+python2-configure:	$(PYTHON2_OBJDIR)/.configured
+python2-compile:	$(PYTHON2_OBJDIR)/.compiled
+python2-install:	$(PYTHON2_OBJDIR)/.installed
+python2-reset:
+	$(foreach f, .retrieved .configured .compiled .installed, \
+		rm -f $(PYTHON2_OBJDIR)/$(f);)
+
+python2-clean:
+	-(cd $(PYTHON2_OBJDIR) && env MAKEFLAGS= make distclean)
+
+# fetch distfile for python 2
+$(DISTDIR)/$(PYTHON2_DIST):
+	cd $(DISTDIR) && $(FETCH_CMD) $(PYTHON2_URL)
+
+# https://bugs.python.org/issue12560
+$(DISTDIR)/python-issue12560.patch:
+	cd $(DISTDIR) && $(FETCH_CMD) -O "$@" \
+		https://hg.python.org/cpython/raw-rev/32cc37a89b58
+
+# retrieve python 2
+#
+$(PYTHON2_OBJDIR)/.retrieved: $(DISTDIR)/$(PYTHON2_DIST) $(DISTDIR)/python-issue12560.patch
+	$(call do_check_sha256,$(PYTHON2_DIST))
+	[ -d $(PYTHON2_OBJDIR) ] || mkdir -p $(PYTHON2_OBJDIR)
+	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(PYTHON2_DIST)
+	# Make setup.py use our own dependencies instead of system ones
+	sed -e "s#sqlite_inc_paths = \[ '/usr/include',#sqlite_inc_paths = [ '$(PREFIX)/sqlite/include',#" \
+		-e "s#'/usr/include/db4'#'$(PREFIX)/bdb/include'#" \
+		-e "s|\(add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')\)|pass #\1|" \
+		-e "s|\(add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')\)|pass #\1|" \
+		-e "s#find_library_file(lib_dirs, 'bz2'#find_library_file(['$(PREFIX)/bz2/lib'] + lib_dirs, 'bz2'#" \
+		< $(PYTHON2_SRCDIR)/setup.py \
+		> $(PYTHON2_SRCDIR)/setup.py.patched
+	mv $(PYTHON2_SRCDIR)/setup.py.patched $(PYTHON2_SRCDIR)/setup.py
+	chmod +x $(PYTHON2_SRCDIR)/setup.py
+	cd $(PYTHON2_SRCDIR) && patch -p1 < $(DISTDIR)/python-issue12560.patch
+	mkdir -p $(PYTHON2_OBJDIR)/bin
+	ln -sf "`which python2`" $(PYTHON2_OBJDIR)/bin/python
+	touch $@
+
+# configure python 2
+ifdef PROFILE
+PYTHON2_PROFILING=--enable-profiling
+endif
+$(PYTHON2_OBJDIR)/.configured: $(PYTHON2_OBJDIR)/.retrieved \
+	$(BZ2_OBJDIR)/.installed
+	cd $(PYTHON2_OBJDIR) \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		CC=$(CC) CXX=$(CXX) \
+		CPPFLAGS="-I$(PREFIX)/bz2/include" \
+		LDFLAGS="-Wl,-rpath=$(PREFIX)/python2/lib -L$(PREFIX)/bz2/lib" \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python2/lib:$$LD_LIBRARY_PATH" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
+		PATH=$(PYTHON2_OBJDIR)/bin:$$PATH \
+		$(PYTHON2_SRCDIR)/configure \
+		--prefix=$(PREFIX)/python2 \
+		--enable-shared \
+		--with-system-expat \
+		--with-dbmliborder=bdb \
+		--without-pymalloc \
+		$(PYTHON2_PROFILING)
+	touch $@
+
+# compile python 2
+$(PYTHON2_OBJDIR)/.compiled: $(PYTHON2_OBJDIR)/.configured
+	(cd $(PYTHON2_OBJDIR) && \
+		env MAKEFLAGS= \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python2/lib:$$LD_LIBRARY_PATH" \
+		PATH=$(PYTHON2_OBJDIR)/bin:$$PATH \
+		make -j${MAKE_JOBS})
+	touch $@
+
+# install python 2
+$(PYTHON2_OBJDIR)/.installed: $(PYTHON2_OBJDIR)/.compiled
+	(cd $(PYTHON2_OBJDIR) && \
+		env MAKEFLAGS= \
+		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/python2/lib:$$LD_LIBRARY_PATH" \
+		PATH=$(PYTHON2_OBJDIR)/bin:$$PATH \
+		make install)
+	ln -sf $(PREFIX)/python2/bin/python2 $(PREFIX)/python2/bin/python
+	touch $@
+
+#######################################################################
+# py3c
+#######################################################################
+
+py3c-retrieve:	$(PY3C_OBJDIR)/.retrieved
+py3c-reset:
+	$(foreach f, .retrieved .configured .compiled .installed, \
+		rm -f $(PY3C_OBJDIR)/$(f);)
+
+# fetch distfile for py3c
+$(DISTDIR)/$(PY3C_DIST):
+	cd $(DISTDIR) && $(FETCH_CMD) $(PY3C_URL)
+
+# retrieve py3c
+$(PY3C_OBJDIR)/.retrieved: $(DISTDIR)/$(PY3C_DIST)
+	$(call do_check_sha256,$(PY3C_DIST))
+	[ -d $(PY3C_OBJDIR) ] || mkdir -p $(PY3C_OBJDIR)
+	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(PY3C_DIST)
+	touch $@
 
 #######################################################################
 # junit
@@ -1541,7 +1710,7 @@ DISABLE_NEON_VERSION_CHECK=--disable-neo
 W_NO_SYSTEM_HEADERS=-Wno-system-headers
 NEON_FLAG=--with-neon="$(PREFIX)/neon"
 JAVAHL_CHECK_TARGET=check-javahl
-else ifeq ($(BRANCH_MAJOR), $(filter $(BRANCH_MAJOR), 1.8 1.9))
+else ifeq ($(BRANCH_MAJOR), $(filter 1.8 1.9, $(BRANCH_MAJOR)))
 BDB_FLAG=db.h:$(PREFIX)/bdb/include:$(PREFIX)/bdb/lib:db-$(BDB_MAJOR_VER)
 SERF_FLAG=--with-serf="$(PREFIX)/serf"
 # serf >= 1.3.0 is built with scons and no longer sets up rpath linker flags,
@@ -1552,7 +1721,7 @@ MOD_AUTHZ_SVN=modules/svn-$(WC)/mod_auth
 MOD_DONTDOTHAT=modules/svn-$(WC)/mod_dontdothat.so
 LIBMAGIC_FLAG=--with-libmagic=$(PREFIX)/libmagic
 JAVAHL_CHECK_TARGET=check-all-javahl
-else # 1.10
+else # 1.10, 1.11, 1.12, 1.13, 1.14, trunk
 BDB_FLAG=db.h:$(PREFIX)/bdb/include:$(PREFIX)/bdb/lib:db-$(BDB_MAJOR_VER)
 SERF_FLAG=--with-serf="$(PREFIX)/serf"
 # serf >= 1.3.0 is built with scons and no longer sets up rpath linker flags,
@@ -1610,10 +1779,11 @@ $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)
 			CC=$(CC) CXX=$(CXX) \
 			CFLAGS="-I$(PREFIX)/gettext/include -DAPR_POOL_DEBUG" \
 			CXXFLAGS="-I$(PREFIX)/gettext/include -DAPR_POOL_DEBUG" \
-			LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
-			PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
+			LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(PREFIX)/$(PYTHON)/lib:$$LD_LIBRARY_PATH" \
+			PKG_CONFIG_PATH=$(PKG_CONFIG_PATH):$(PREFIX)/$(PYTHON)/lib/pkgconfig \
+			PYTHON=$(PREFIX)/$(PYTHON)/bin/python \
 			GREP="`which grep`" \
-			PATH=$(PREFIX)/ruby/bin:$(PREFIX)/python/bin:$(PREFIX)/gettext/bin:$$PATH \
+			PATH=$(PREFIX)/ruby/bin:$(PREFIX)/$(PYTHON)/bin:$(PREFIX)/gettext/bin:$$PATH \
 			$(SVN_SRCDIR)/configure \
 			--enable-maintainer-mode \
 			--prefix="$(SVN_PREFIX)" \
@@ -1628,6 +1798,7 @@ $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)
 			--without-gnome-keyring \
 			--with-berkeley-db="$(BDB_FLAG)" \
 			--with-ruby-sitedir="$(SVN_PREFIX)/lib/ruby/site_ruby" \
+			--with-py3c="$(SRCDIR)/py3c-${PY3C_VER}" \
 			--disable-mod-activation \
 			$(JAVAHL_FLAG) \
 			$(LIBMAGIC_FLAG) \
@@ -1733,15 +1904,26 @@ $(HTTPD_CHECK_GROUPS):
 
 $(HTTPD_CHECK_CONF): $(MOD_DONTDOTHAT_CONF) $(HTTPD_CHECK_GROUPS)
 	mkdir -p $(dir $@)
-	$(PREFIX)/httpd/bin/htpasswd -bc $(HTTPD_CHECK_USERS).tmp jrandom rayjandom
-	$(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp jconstant rayjandom
-	$(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp __dumpster__ __loadster__
-	$(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp JRANDOM rayjandom
-	$(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp JCONSTANT rayjandom
+	env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PREFIX)/httpd/bin/htpasswd -bc $(HTTPD_CHECK_USERS).tmp jrandom rayjandom
+	env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp jconstant rayjandom
+	env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp __dumpster__ __loadster__
+	env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp JRANDOM rayjandom
+	env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PREFIX)/httpd/bin/htpasswd -b $(HTTPD_CHECK_USERS).tmp JCONSTANT rayjandom
 	mv -f $(HTTPD_CHECK_USERS).tmp $(HTTPD_CHECK_USERS)
 	echo > $@.tmp '# httpd config for make check'
 	echo >>$@.tmp 'ServerRoot "$(PREFIX)/httpd"'
 	echo >>$@.tmp 'Listen localhost:$(HTTPD_CHECK_PORT)'
+	echo >>$@.tmp 'LogLevel warn'
+	echo >>$@.tmp 'LoadModule unixd_module modules/mod_unixd.so'
+	echo >>$@.tmp 'LoadModule alias_module modules/mod_alias.so'
+	echo >>$@.tmp 'LoadModule access_compat_module modules/mod_access_compat.so'
+	echo >>$@.tmp 'LoadModule authn_core_module modules/mod_authn_core.so'
+	echo >>$@.tmp 'LoadModule authn_file_module modules/mod_authn_file.so'
+	echo >>$@.tmp 'LoadModule authz_core_module modules/mod_authz_core.so'
+	echo >>$@.tmp 'LoadModule authz_user_module modules/mod_authz_user.so'
+	echo >>$@.tmp 'LoadModule authz_groupfile_module modules/mod_authz_groupfile.so'
+	echo >>$@.tmp 'LoadModule auth_basic_module modules/mod_auth_basic.so'
+	echo >>$@.tmp 'LoadModule dav_module modules/mod_dav.so'
 	echo >>$@.tmp 'LoadModule dav_svn_module $(MOD_DAV_SVN)'
 	echo >>$@.tmp 'LoadModule authz_svn_module $(MOD_AUTHZ_SVN)'
 	echo >>$@.tmp 'LoadModule dontdothat_module $(MOD_DONTDOTHAT)'
@@ -1750,8 +1932,7 @@ $(HTTPD_CHECK_CONF): $(MOD_DONTDOTHAT_CO
 	echo >>$@.tmp '<Directory />'
 	echo >>$@.tmp '    Options FollowSymLinks'
 	echo >>$@.tmp '    AllowOverride None'
-	echo >>$@.tmp '    Order deny,allow'
-	echo >>$@.tmp '    Allow from all'
+	echo >>$@.tmp '    Require all granted'
 	echo >>$@.tmp '</Directory>'
 	echo >>$@.tmp '<Location /svn-test-work/repositories>'
 	echo >>$@.tmp '    DAV svn'
@@ -1783,11 +1964,26 @@ ifeq ($(USE_AUTHZ_SHORT_CIRCUIT),yes)
 	echo >>$@.tmp '    SVNPathAuthz short_circuit'
 endif
 	echo >>$@.tmp '</Location>'
+	echo >>$@.tmp '<Location /svn-test-work/local_tmp/trojan>'
+	echo >>$@.tmp '    DAV svn'
+	echo >>$@.tmp '    SVNPath $(SVN_WC)/subversion/tests/cmdline/svn-test-work/local_tmp/trojan'
+	echo >>$@.tmp '    AuthzSVNAccessFile $(SVN_WC)/subversion/tests/cmdline/svn-test-work/authz'
+	echo >>$@.tmp '    AuthType Basic'
+	echo >>$@.tmp '    AuthName "Subversion Repository"'
+	echo >>$@.tmp '    AuthUserFile $(HTTPD_CHECK_USERS)'
+	echo >>$@.tmp '    Require valid-user'
+ifeq ($(USE_HTTPV1),yes)
+	echo >>$@.tmp '    SVNAdvertiseV2Protocol off'
+endif
+ifeq ($(USE_AUTHZ_SHORT_CIRCUIT),yes)
+	echo >>$@.tmp '    SVNPathAuthz short_circuit'
+endif
+	echo >>$@.tmp '</Location>'
 	echo >>$@.tmp '# This Location lets you access repositories dropped in /tmp/'
 	echo >>$@.tmp '<Location /svn>'
 	echo >>$@.tmp '    DAV svn'
 	echo >>$@.tmp '    SVNParentPath /tmp'
-	echo >>$@.tmp '    Allow from all'
+	echo >>$@.tmp '    Require all granted'
 	echo >>$@.tmp '    #AuthType Basic'
 	echo >>$@.tmp '    #AuthName "Subversion Repository"'
 	echo >>$@.tmp '    #AuthUserFile $(HTTPD_CHECK_USERS)'
@@ -1828,12 +2024,27 @@ endif
 	echo >>$@.tmp '    Require all granted'
 	echo >>$@.tmp '  </IfModule>'
 	echo >>$@.tmp '  <IfModule !mod_authz_core.c>'
-	echo >>$@.tmp '    Allow from all'
+	echo >>$@.tmp '    Requite all granted'
 	echo >>$@.tmp '  </IfModule>'
 ifeq ($(USE_AUTHZ_SHORT_CIRCUIT),yes)
 	echo >>$@.tmp '    SVNPathAuthz short_circuit'
 endif
 	echo >>$@.tmp '</Location>'
+	echo >>$@.tmp '<Location /authz-test-work/in-repos-authz>'
+	echo >>$@.tmp '  DAV svn'
+	echo >>$@.tmp '  SVNParentPath     $(SVN_WC)/subversion/tests/cmdline/svn-test-work/repositories'
+	echo >>$@.tmp '  AuthzSVNReposRelativeAccessFile "^/authz"'
+	echo >>$@.tmp '  AuthType Basic'
+	echo >>$@.tmp '  AuthName "Subversion Repository"'
+	echo >>$@.tmp '  AuthUserFile $(HTTPD_CHECK_USERS)'
+	echo >>$@.tmp '  Require valid-user'
+ifeq ($(USE_HTTPV1),yes)
+	echo >>$@.tmp '  SVNAdvertiseV2Protocol off'
+endif
+ifeq ($(USE_AUTHZ_SHORT_CIRCUIT),yes)
+	echo >>$@.tmp '    SVNPathAuthz short_circuit'
+endif
+	echo >>$@.tmp '</Location>'
 	echo >>$@.tmp '<Location /authz-test-work/mixed>'
 	echo >>$@.tmp '  DAV               svn'
 	echo >>$@.tmp '  SVNParentPath     $(SVN_WC)/subversion/tests/cmdline/svn-test-work/local_tmp'
@@ -1846,7 +2057,7 @@ endif
 	echo >>$@.tmp '  AuthName          "Subversion Repository"'
 	echo >>$@.tmp '  AuthUserFile      $(HTTPD_CHECK_USERS)'
 	echo >>$@.tmp '  Require           valid-user'
-	echo >>$@.tmp '  Satisfy Any'
+	echo >>$@.tmp '  Satisfy           Any'
 ifeq ($(USE_AUTHZ_SHORT_CIRCUIT),yes)
 	echo >>$@.tmp '    SVNPathAuthz short_circuit'
 endif
@@ -1936,7 +2147,7 @@ endif
 	echo >>$@.tmp '<IfModule mod_authz_core.c>'
 	echo >>$@.tmp '  <Location /authz-test-work/sallrany>'
 	echo >>$@.tmp '    DAV               svn'
-	echo >>$@.tmp '    SVNParentPath     $($SVN_WC)/subversion/tests/cmdline/svn-test-work/local_tmp'
+	echo >>$@.tmp '    SVNParentPath     $(SVN_WC)/subversion/tests/cmdline/svn-test-work/local_tmp'
 	echo >>$@.tmp '    AuthzSVNAccessFile $(SVN_WC)/subversion/tests/cmdline/svn-test-work/authz'
 ifeq ($(USE_HTTPV1),yes)
 	echo >>$@.tmp '    SVNAdvertiseV2Protocol off'
@@ -1979,7 +2190,7 @@ endif
 	echo >>$@.tmp '</IfModule>'
 	echo >>$@.tmp 'RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)$$ /svn-test-work/repositories/$$1'
 	echo >>$@.tmp 'RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)$$ /svn-test-work/repositories/$$1'
-	echo >>$@.tmp 'Include "conf/$(SVN_REL_WC)*-custom.conf"'
+	echo >>$@.tmp 'IncludeOptional "conf/$(SVN_REL_WC)*-custom.conf"'
 	echo >> $@.tmp '#SVNInMemoryCacheSize 0'
 	echo >> $@.tmp '#SVNCacheTextDeltas Off'
 	echo >> $@.tmp '#SVNCacheRevProps Off'
@@ -1990,6 +2201,16 @@ $(HTTPD_PROXY_CONF): $(HTTPD_CHECK_CONF)
 	echo > $@.tmp '# httpd config for a write-through proxy'
 	echo >>$@.tmp 'ServerRoot "$(PREFIX)/httpd"'
 	echo >>$@.tmp 'Listen localhost:$(HTTPD_PROXY_PORT)'
+	echo >>$@.tmp 'LoadModule unixd_module modules/mod_unixd.so'
+	echo >>$@.tmp 'LoadModule alias_module modules/mod_alias.so'
+	echo >>$@.tmp 'LoadModule access_compat_module modules/mod_access_compat.so'
+	echo >>$@.tmp 'LoadModule authn_core_module modules/mod_authn_core.so'
+	echo >>$@.tmp 'LoadModule authn_file_module modules/mod_authn_file.so'
+	echo >>$@.tmp 'LoadModule authz_core_module modules/mod_authz_core.so'
+	echo >>$@.tmp 'LoadModule authz_user_module modules/mod_authz_user.so'
+	echo >>$@.tmp 'LoadModule authz_groupfile_module modules/mod_authz_groupfile.so'
+	echo >>$@.tmp 'LoadModule auth_basic_module modules/mod_auth_basic.so'
+	echo >>$@.tmp 'LoadModule dav_module modules/mod_dav.so'
 	echo >>$@.tmp 'LoadModule dav_svn_module $(MOD_DAV_SVN)'
 	echo >>$@.tmp 'LoadModule authz_svn_module $(MOD_AUTHZ_SVN)'
 	echo >>$@.tmp 'LoadModule dontdothat_module $(MOD_DONTDOTHAT)'
@@ -1999,7 +2220,7 @@ $(HTTPD_PROXY_CONF): $(HTTPD_CHECK_CONF)
 	echo >>$@.tmp '    DAV svn'
 	echo >>$@.tmp '    SVNParentPath /tmp/svn-$(BRANCH)-proxy'
 	echo >>$@.tmp '    SVNMasterURI http://localhost:$(HTTPD_CHECK_PORT)/svn/'
-	echo >>$@.tmp '    Allow from all'
+	echo >>$@.tmp '    Requite all granted'
 	echo >>$@.tmp '    #AuthType Basic'
 	echo >>$@.tmp '    #AuthName "Subversion Repository"'
 	echo >>$@.tmp '    #AuthUserFile $(HTTPD_CHECK_USERS)'
@@ -2015,7 +2236,7 @@ endif
 	echo >>$@.tmp '<Location /svn-proxy-sync>'
 	echo >>$@.tmp 'DAV svn'
 	echo >>$@.tmp 'SVNParentPath /tmp/svn-$(BRANCH)-proxy'
-	echo >>$@.tmp 'Allow from all'
+	echo >>$@.tmp 'Require all granted'
 	echo >>$@.tmp '</Location>'
 	mv -f $@.tmp $@
 
@@ -2089,12 +2310,13 @@ stop-svnserve:
 	$(SVNSERVE_STOP_CMD)
 
 define do_check
--cd $(svn_builddir) && for fs in fsfs bdb; do \
+-cd $(svn_builddir) && for fs in $(SVN_CHECK_FS_BACKENDS); do \
     echo "Begin test: $(subst svn-check-,,$@) x $$fs"; \
     test -d "$(RAMDISK)/tmp" && export TMPDIR="$(RAMDISK)/tmp"; \
     env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(LIB_PTHREAD_HACK) \
         env MAKEFLAGS= make check PARALLEL=$(PARALLEL) CLEANUP=$(CLEANUP) \
 	  EXCLUSIVE_WC_LOCKS=$(EXCLUSIVE_WC_LOCKS) \
+	  THREADED=$(THREADED) \
 	  SVN_BIN_DIR=$(SVN_PREFIX)/bin \
 	  MEMCACHED_SERVER=$(MEMCACHED_SERVER) $1 FS_TYPE=$$fs; \
     for log in tests.log fails.log; do \
@@ -2175,6 +2397,7 @@ svn-check-swig-rb:
 
 svn-check-javahl:
 	-if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
+		ln -s libsvnjavahl-1.so.0.0 $(PREFIX)/svn-$(WC)/lib/libsvnjavahl-1.so; \
 		(cd $(svn_builddir) && \
 			env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
 			MAKEFLAGS= make $(JAVAHL_CHECK_TARGET) 2>&1) | \

Modified: subversion/branches/multi-wc-format/tools/dev/unix-build/README
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dev/unix-build/README?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dev/unix-build/README (original)
+++ subversion/branches/multi-wc-format/tools/dev/unix-build/README Fri Jan 14 14:01:45 2022
@@ -1,7 +1,7 @@
 Introduction
 ============
 Makefile.svn aids Subversion developers on unix-like systems set up an
-SVN development environment without requiring root priviliges. It does
+SVN development environment without requiring root privileges. It does
 this by fetching Subversion along with many of its dependencies from
 the internet and building them using sane defaults suitable for
 development (for example, it invokes --enable-maintainer-mode while

Modified: subversion/branches/multi-wc-format/tools/dev/wc-format.py
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dev/wc-format.py?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dev/wc-format.py (original)
+++ subversion/branches/multi-wc-format/tools/dev/wc-format.py Fri Jan 14 14:01:45 2022
@@ -40,7 +40,7 @@ def get_format(wc_path):
     parent_path = os.path.dirname(os.path.abspath(wc_path))
     if wc_path != parent_path:
       formatno = get_format(parent_path)
-      if formatno >= MIN_SINGLE_DB_FORMAT:
+      if isinstance(formatno, int) and formatno >= MIN_SINGLE_DB_FORMAT:
       	return formatno
 
   return formatno

Propchange: subversion/branches/multi-wc-format/tools/dev/wc-ng/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Fri Jan 14 14:01:45 2022
@@ -1 +1,2 @@
 svn-wc-db-tester
+.libs

Modified: subversion/branches/multi-wc-format/tools/dev/x509-parser.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dev/x509-parser.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dev/x509-parser.c (original)
+++ subversion/branches/multi-wc-format/tools/dev/x509-parser.c Fri Jan 14 14:01:45 2022
@@ -118,7 +118,7 @@ get_der_cert_from_stream(const svn_strin
           return SVN_NO_ERROR;
         }
 
-      /* Try decoding as a PEM with begining and ending headers. */
+      /* Try decoding as a PEM with beginning and ending headers. */
       start = strstr(raw->data, PEM_BEGIN_CERT);
       end = strstr(raw->data, PEM_END_CERT);
       if (start && end && end > start)

Modified: subversion/branches/multi-wc-format/tools/dist/backport.pl
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/backport.pl?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/backport.pl (original)
+++ subversion/branches/multi-wc-format/tools/dist/backport.pl Fri Jan 14 14:01:45 2022
@@ -9,11 +9,11 @@ use v5.10.0; # needed for $^V
 # experimental and "subject to change" in v5.18 (see perl5180delta).  Every
 # use of it now triggers a warning.
 #
-# As of Perl v5.26.1, the semantics of given/when provided by Perl are
+# As of Perl v5.30.0, the semantics of given/when provided by Perl are
 # compatible with those expected by the script, so disable the warning for
 # those Perls.  But don't try to disable the the warning category on Perls
 # that don't know that category, since that breaks compilation.
-no if (v5.17.0 le $^V and $^V le v5.26.1),
+no if (v5.17.0 le $^V and $^V le v5.30.0),
    warnings => 'experimental::smartmatch';
 
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -157,7 +157,7 @@ N:   Move to the next entry.  Do not pro
      revisions added, justification changed) in the repository.
      (This is a local action that will not affect other people or bots.)
  :   Move to the next entry.  Prompt for the current entry again in the next
-     run of backport.pl. 
+     run of backport.pl.
      (That's a space character, ASCII 0x20.)
 ?:   Display this list.
 EOF
@@ -231,7 +231,7 @@ Both batch modes also perform a basic sa
 backport branches (via the "Branch:" header): if a backport branch is used, but
 at least one of the revisions enumerated in the entry title had neither been
 merged from $TRUNK to the branch root, nor been committed
-directly to the backport branch, the hourly bot will turn red and 
+directly to the backport branch, the hourly bot will turn red and
 nightly bot will skip the entry and email its admins.  (The nightly bot does
 not email the list on failure, since it doesn't use buildbot.)
 
@@ -262,6 +262,9 @@ numbers); it will be ignored.  For examp
     $0 "Committed revision 42." "\$Some_justification"
 will nominate r42.
 
+Revision numbers within the last thousand revisions may be specified using
+the last three digits only.
+
 The justification can be an arbitrarily-long string; if it is wider than the
 available width, this script will wrap it for you (and allow you to review
 the result before committing).
@@ -567,7 +570,7 @@ sub parse_entry {
   my (@revisions, @logsummary, $branch, @votes);
   # @lines = @_;
 
-  # strip spaces to match up with the indention
+  # strip spaces to match up with the indentation
   $_[0] =~ s/^( *)\* //;
   my $indentation = ' ' x (length($1) + 2);
   s/^$indentation// for @_;
@@ -1027,7 +1030,7 @@ sub handle_entry {
     # the "next PROMPT;" is; there's a "last;" at the end of the loop body.
     PROMPT: while (1) {
     say "";
-    say "\n>>> $entry{header_start}:";
+    say "\n\e\x5b32m>>> $entry{header_start}:\e\x5b0m";
     say join ", ", map { "r$_" } @{$entry{revisions}} if @{$entry{revisions}};
     say "$BRANCHES/$entry{branch}" if $entry{branch};
     say "--accept=$entry{accept}" if $entry{accept};
@@ -1196,7 +1199,7 @@ sub backport_main {
     given ($lines[0]) {
       # Section header
       when (/^[A-Z].*:$/i) {
-        say "\n\n=== $lines[0]" unless $YES;
+        say "\n\n\e\x5b33m\e\x5b1m=== $lines[0]\e\x5b0m" unless $YES;
         $in_approved = $lines[0] =~ /^Approved changes/;
       }
       # Comment
@@ -1238,6 +1241,20 @@ sub nominate_main {
 
   die "Unable to proceed." if warned_cannot_commit "Nominating failed";
 
+  # To save typing, require just the last three digits if they're unambiguous.
+  my $BASE_revision = `$SVN info --show-item=revision` + 0;
+  if ($BASE_revision > 1000) {
+    my $residue = $BASE_revision % 1000;
+    my $thousands = $BASE_revision - $residue;
+    @revnums = map {
+      $_ >= 1000
+        ? $_
+        : $thousands + $_ - 1000 * ($_ > $residue)
+      }
+      @revnums;
+  }
+
+  # Deduplicate and sort
   @revnums = sort { $a <=> $b } keys %{{ map { $_ => 1 } @revnums }};
   die "No revision numbers specified" unless @revnums;
 

Modified: subversion/branches/multi-wc-format/tools/dist/backport/merger.py
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/backport/merger.py?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/backport/merger.py (original)
+++ subversion/branches/multi-wc-format/tools/dist/backport/merger.py Fri Jan 14 14:01:45 2022
@@ -151,13 +151,13 @@ def log_message_file(logmsg):
     logmsg_file.write(logmsg)
     logmsg_file.flush()
     yield logmsg_file.name
-  
+
 def merge(entry, expected_stderr=None, *, commit=False):
   """Merges ENTRY into the working copy at cwd.
 
   Do not commit the result, unless COMMIT is true.  When committing,
   remove ENTRY from its STATUS file prior to committing.
-  
+
   EXPECTED_STDERR will be passed to run_svn() for the actual 'merge' command."""
 
   assert isinstance(entry, backport.status.StatusEntry)
@@ -225,7 +225,7 @@ def merge(entry, expected_stderr=None, *
 
   if entry.branch:
     revnum = last_changed_revision('./STATUS')
-    
+
     if commit:
       # Sleep to avoid out-of-order commit notifications
       if not os.getenv("SVN_BACKPORT_DONT_SLEEP"): # enabled by the test suite

Modified: subversion/branches/multi-wc-format/tools/dist/backport/status.py
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/backport/status.py?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/backport/status.py (original)
+++ subversion/branches/multi-wc-format/tools/dist/backport/status.py Fri Jan 14 14:01:45 2022
@@ -85,7 +85,7 @@ class Paragraph:
 
   def __init__(self, kind, text, entry, containing_section):
     """Constructor.
-    
+
     KIND is one of the Kind.* enumerators.
 
     TEXT is the physical text in the file, used by unparsing.
@@ -109,7 +109,7 @@ class Paragraph:
   @classmethod
   def is_header(cls, para_text):
     """PARA_TEXT is a single physical paragraph, as a bare multiline string.
-    
+
     If PARA_TEXT is a section header, return the header text; else, return
     False."""
     lines = para_text.split('\n', 2)
@@ -135,7 +135,7 @@ class Paragraph:
 
   def approved(self):
     "TRUE if this paragraph is in the approved section, false otherwise."
-    assert self.kind 
+    assert self.kind
     # ### backport.pl used to check just .startswith() here.
     return self.section() == "Approved changes"
 
@@ -335,7 +335,7 @@ class StatusEntry:
   def __init__(self, para_text, status_file=None):
     """Parse an entry from PARA_TEXT, and add it to SELF.  PARA_TEXT must
     contain exactly one entry, as a single multiline string.
-    
+
     STATUS_FILE is the StatusFile object containing this entry, if any.
     """
     self.branch = None
@@ -499,7 +499,7 @@ class StatusEntry:
     assert self.valid()
     suffix = "" if len(self.logsummary) == 1 else " [...]"
     return self.logsummary[0] + suffix
-             
+
   # Private for is_vetoed()
   _re_vetoed = re.compile(r'^\s*(-1:|-1\s*[()])', re.MULTILINE)
   def is_vetoed(self):

Modified: subversion/branches/multi-wc-format/tools/dist/backport_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/backport_tests.py?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/backport_tests.py (original)
+++ subversion/branches/multi-wc-format/tools/dist/backport_tests.py Fri Jan 14 14:01:45 2022
@@ -528,7 +528,7 @@ def backport_double_conflict(sbox):
   #    ...
   #    Warning summary
   #    ===============
-  #    
+  #
   #    r4 (default logsummary): subshell exited with code 256
   # And backport.pl would exit with exit code 1.
 

Modified: subversion/branches/multi-wc-format/tools/dist/checksums.py
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/checksums.py?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/checksums.py (original)
+++ subversion/branches/multi-wc-format/tools/dist/checksums.py Fri Jan 14 14:01:45 2022
@@ -19,7 +19,7 @@
 # under the License.
 #
 #
-# Check MD5 and SHA-1 and SHA-2 signatures of files, using 
+# Check MD5 and SHA-1 and SHA-2 signatures of files, using
 # md5sums, sha1sums, and/or sha512sums as manifests
 # Replaces the 'md5sum', 'sha1sum', and 'sha512sums' commands
 # on systems that do not have them, such as Mac OS X or Windows.

Modified: subversion/branches/multi-wc-format/tools/dist/dist.sh
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/dist.sh?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/dist.sh (original)
+++ subversion/branches/multi-wc-format/tools/dist/dist.sh Fri Jan 14 14:01:45 2022
@@ -327,7 +327,7 @@ if [ -z "$ZIP" ]; then
   # Use the gzip -n flag - this prevents it from storing the original name of
   # the .tar file, and far more importantly, the mtime of the .tar file, in the
   # produced .tar.gz file. This is important, because it makes the gzip
-  # encoding reproducable by anyone else who has an similar version of gzip,
+  # encoding reproducible by anyone else who has an similar version of gzip,
   # and also uses "gzip -9n". This means that committers who want to GPG-sign
   # both the .tar.gz and the .tar.bz2 can download the .tar.bz2 (which is
   # smaller), and locally generate an exact duplicate of the official .tar.gz

Modified: subversion/branches/multi-wc-format/tools/dist/nightly.sh
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/tools/dist/nightly.sh?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/tools/dist/nightly.sh (original)
+++ subversion/branches/multi-wc-format/tools/dist/nightly.sh Fri Jan 14 14:01:45 2022
@@ -21,7 +21,7 @@
 #
 set -e
 
-repo=http://svn.apache.org/repos/asf/subversion
+repo=https://svn.apache.org/repos/asf/subversion
 svn=svn
 olds=7