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/02/02 13:04:31 UTC

svn commit: r1897695 - in /subversion/branches/pristines-on-demand: ./ build/ subversion/bindings/swig/python/tests/ subversion/libsvn_client/ subversion/libsvn_ra_svn/ subversion/libsvn_repos/ subversion/libsvn_subr/ subversion/libsvn_wc/ subversion/p...

Author: julianfoad
Date: Wed Feb  2 13:04:31 2022
New Revision: 1897695

URL: http://svn.apache.org/viewvc?rev=1897695&view=rev
Log:
On the 'pristines-on-demand' branch: sync with trunk@1897694.

Modified:
    subversion/branches/pristines-on-demand/   (props changed)
    subversion/branches/pristines-on-demand/INSTALL
    subversion/branches/pristines-on-demand/NOTICE
    subversion/branches/pristines-on-demand/build/run_tests.py
    subversion/branches/pristines-on-demand/subversion/bindings/swig/python/tests/fs.py
    subversion/branches/pristines-on-demand/subversion/libsvn_client/conflicts.c
    subversion/branches/pristines-on-demand/subversion/libsvn_client/merge.c
    subversion/branches/pristines-on-demand/subversion/libsvn_ra_svn/marshal.c
    subversion/branches/pristines-on-demand/subversion/libsvn_repos/authz.c
    subversion/branches/pristines-on-demand/subversion/libsvn_repos/reporter.c
    subversion/branches/pristines-on-demand/subversion/libsvn_subr/version.c
    subversion/branches/pristines-on-demand/subversion/libsvn_wc/update_editor.c
    subversion/branches/pristines-on-demand/subversion/po/it.po
    subversion/branches/pristines-on-demand/subversion/svn/info-cmd.c
    subversion/branches/pristines-on-demand/subversion/svn/shelf-cmd.c
    subversion/branches/pristines-on-demand/subversion/svn/shelf2-cmd.c
    subversion/branches/pristines-on-demand/subversion/svnadmin/svnadmin.c
    subversion/branches/pristines-on-demand/subversion/tests/cmdline/basic_tests.py
    subversion/branches/pristines-on-demand/subversion/tests/cmdline/log_tests.py
    subversion/branches/pristines-on-demand/subversion/tests/cmdline/pegrev_parse_tests.py
    subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/actions.py
    subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/main.py
    subversion/branches/pristines-on-demand/subversion/tests/libsvn_diff/diff-diff3-test.c
    subversion/branches/pristines-on-demand/tools/client-side/bash_completion
    subversion/branches/pristines-on-demand/tools/dev/unix-build/Makefile.svn

Propchange: subversion/branches/pristines-on-demand/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1892643-1897694

Modified: subversion/branches/pristines-on-demand/INSTALL
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/INSTALL?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/INSTALL (original)
+++ subversion/branches/pristines-on-demand/INSTALL Wed Feb  2 13:04:31 2022
@@ -1034,6 +1034,12 @@ II.   INSTALLATION
       Note that you'd make sure to define ZLIB_WINAPI in the ZLib config
       header and move the lib-file into the zlib root-directory.
 
+      Please note that you MUST NOT build ZLib with the included assembler
+      optimized code. It is known to be buggy, see for example the discussion
+      https://svn.haxx.se/dev/archive-2013-10/0109.shtml.
+      This means that you must not define ASMV or ASMINF. Note that the VS
+      projects in contrib\visualstudio define these in the Debug configuration.
+
       Apache Serf
 
       ### Section about Apache Serf might be required/useful to add.
@@ -1445,7 +1451,7 @@ IV.   PLATFORM-SPECIFIC ISSUES
 
       And there's an item about this in the Subversion FAQ:
 
-          https://subversion.apache.org/faq.html#windows-xp-server
+      https://subversion.apache.org/faq.html#windows-xp-server
 
       The only known workaround for now is to update to Windows XP
       SP1 (or higher).

Modified: subversion/branches/pristines-on-demand/NOTICE
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/NOTICE?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/NOTICE (original)
+++ subversion/branches/pristines-on-demand/NOTICE Wed Feb  2 13:04:31 2022
@@ -1,5 +1,5 @@
 Apache Subversion
-Copyright 2021 The Apache Software Foundation
+Copyright 2022 The Apache Software Foundation
 
 This product includes software developed by many people, and distributed
 under Contributor License Agreements to The Apache Software Foundation

Modified: subversion/branches/pristines-on-demand/build/run_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/build/run_tests.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/build/run_tests.py (original)
+++ subversion/branches/pristines-on-demand/build/run_tests.py Wed Feb  2 13:04:31 2022
@@ -798,10 +798,12 @@ class TestHarness:
     # ### Even if failure==1 it could be that the test didn't run at all.
     if test_failed and test_failed != 1:
       if self.log:
-        log.write('FAIL:  %s: Unknown test failure; see tests.log.\n' % progbase)
+        log.write('FAIL:  %s: Unknown test failure (%s); see tests.log.\n'
+                  % (progbase, test_failed))
         log.flush()
       else:
-        log.write('FAIL:  %s: Unknown test failure.\n' % progbase)
+        log.write('FAIL:  %s: Unknown test failure (%s).\n'
+                  % (progbase, test_failed))
 
   def _run_c_test(self, progabs, progdir, progbase, test_nums, dot_count):
     'Run a c test, escaping parameters as required.'

Modified: subversion/branches/pristines-on-demand/subversion/bindings/swig/python/tests/fs.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/bindings/swig/python/tests/fs.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/bindings/swig/python/tests/fs.py (original)
+++ subversion/branches/pristines-on-demand/subversion/bindings/swig/python/tests/fs.py Wed Feb  2 13:04:31 2022
@@ -346,13 +346,12 @@ class SubversionFSTestCase(unittest.Test
     if (isinstance(expected_conflict, bytes)
         and not isinstance(expected_conflict, str)):
       expected_conflict = expected_conflict.decode('utf-8')
-    err = None
+
     new_rev = None
     conflict = None
     try:
       conflict, new_rev = fs.commit_txn(txn, pool)
     except core.SubversionException as e:
-      err = e
       self.assertTrue(hasattr(e, 'conflict_p'))
       conflict = e.conflict_p
       if isinstance(conflict, bytes) and not isinstance(conflict, str):
@@ -360,41 +359,42 @@ class SubversionFSTestCase(unittest.Test
       self.assertTrue(hasattr(e, 'new_rev'))
       new_rev = e.new_rev
 
-    if err and err.apr_err == core.SVN_ERR_FS_CONFLICT:
-      self.assertIsNotNone(expected_conflict,
-          "commit conflicted at '%s', but no conflict expected"
-          % conflict if conflict else '(missing conflict info!)')
-      self.assertIsNotNone(conflict,
-          "commit conflicted as expected, "
-          "but no conflict path was returned ('%s' expected)"
-          % expected_conflict)
-      if expected_conflict:
-        self.assertEqual(conflict, expected_conflict,
-            "commit conflicted at '%s', but expected conflict at '%s'"
-            % (conflict, expected_conflict))
-
-      # The svn_fs_commit_txn() API promises to set *NEW_REV to an
-      # invalid revision number in the case of a conflict.
-      self.assertEqual(new_rev, core.SVN_INVALID_REVNUM,
-                       "conflicting commit returned valid new revision")
-
-    elif err:
-      # commit may have succeeded, but always report an error
-      if new_rev != core.SVN_INVALID_REVNUM:
-        raise core.SubversionException(
-                    "commit succeeded but something else failed",
-                    err.apr_err, err)
+      if e.apr_err == core.SVN_ERR_FS_CONFLICT:
+        self.assertIsNotNone(expected_conflict,
+            "commit conflicted at '%s', but no conflict expected"
+            % conflict if conflict else '(missing conflict info!)')
+        self.assertIsNotNone(conflict,
+            "commit conflicted as expected, "
+            "but no conflict path was returned ('%s' expected)"
+            % expected_conflict)
+        if expected_conflict:
+          self.assertEqual(conflict, expected_conflict,
+              "commit conflicted at '%s', but expected conflict at '%s'"
+              % (conflict, expected_conflict))
+
+        # The svn_fs_commit_txn() API promises to set *NEW_REV to an
+        # invalid revision number in the case of a conflict.
+        self.assertEqual(new_rev, core.SVN_INVALID_REVNUM,
+                         "conflicting commit returned valid new revision")
+
       else:
-        raise core.SubversionException(
-                    "commit failed due to something other than conflict",
-                    err.apr_err, err)
+        # commit may have succeeded, but always report an error
+        if new_rev != core.SVN_INVALID_REVNUM:
+          raise core.SubversionException(
+                      "commit succeeded but something else failed",
+                      e.apr_err, e)
+        else:
+          raise core.SubversionException(
+                      "commit failed due to something other than conflict",
+                      e.apr_err, e)
     else:
-      # err == None, commit should have succeeded
+      # commit should have succeeded
       self.assertNotEqual(new_rev, core.SVN_INVALID_REVNUM,
                           "commit failed but no error was returned")
       self.assertIsNone(expected_conflict,
                         "commit succeeded that was expected to fail at '%s'"
                         % expected_conflict)
+
     return new_rev
 
 

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_client/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_client/conflicts.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_client/conflicts.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_client/conflicts.c Wed Feb  2 13:04:31 2022
@@ -7889,7 +7889,7 @@ resolve_merge_incoming_added_dir_merge(s
       if (details->added_rev == SVN_INVALID_REVNUM)
         return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
                                  _("Could not determine when '%s' was "
-                                   "added the repository"),
+                                   "added to the repository"),
                                  svn_dirent_local_style(local_abspath,
                                                         scratch_pool));
       rev1 = rev_below(details->added_rev);

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_client/merge.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_client/merge.c Wed Feb  2 13:04:31 2022
@@ -12948,7 +12948,7 @@ do_automatic_merge_locked(svn_client__co
          for the root path of the merge).
 
          An improvement would be to change find_automatic_merge() to
-         find the base for each sutree, and then here use the oldest base
+         find the base for each subtree, and then here use the oldest base
          among all subtrees. */
       apr_array_header_t *merge_sources;
       svn_ra_session_t *ra_session = NULL;

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_ra_svn/marshal.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_ra_svn/marshal.c Wed Feb  2 13:04:31 2022
@@ -2786,9 +2786,6 @@ svn_error_t *svn_ra_svn__write_cmd_failu
   return writebuf_write_literal(conn, pool, ") ) ");
 }
 
-/* Initializer for static svn_string_t . */
-#define STATIC_SVN_STRING(x) { x, sizeof(x) - 1 }
-
 /* Return a pre-cooked serialized representation for the changed path
    flags NODE_KIND, TEXT_MODIFIED and PROPS_MODIFIED.  If we don't
    have a suitable pre-cooked string, return an empty string. */
@@ -2798,18 +2795,18 @@ changed_path_flags(svn_node_kind_t node_
                    svn_boolean_t props_modified)
 {
   static const svn_string_t file_flags[4]
-    = { STATIC_SVN_STRING(" ) ( 4:file false false ) ) "),
-        STATIC_SVN_STRING(" ) ( 4:file false true ) ) "),
-        STATIC_SVN_STRING(" ) ( 4:file true false ) ) "),
-        STATIC_SVN_STRING(" ) ( 4:file true true ) ) ") };
+    = { SVN__STATIC_STRING(" ) ( 4:file false false ) ) "),
+        SVN__STATIC_STRING(" ) ( 4:file false true ) ) "),
+        SVN__STATIC_STRING(" ) ( 4:file true false ) ) "),
+        SVN__STATIC_STRING(" ) ( 4:file true true ) ) ") };
 
   static const svn_string_t dir_flags[4]
-    = { STATIC_SVN_STRING(" ) ( 3:dir false false ) ) "),
-        STATIC_SVN_STRING(" ) ( 3:dir false true ) ) "),
-        STATIC_SVN_STRING(" ) ( 3:dir true false ) ) "),
-        STATIC_SVN_STRING(" ) ( 3:dir true true ) ) ") };
+    = { SVN__STATIC_STRING(" ) ( 3:dir false false ) ) "),
+        SVN__STATIC_STRING(" ) ( 3:dir false true ) ) "),
+        SVN__STATIC_STRING(" ) ( 3:dir true false ) ) "),
+        SVN__STATIC_STRING(" ) ( 3:dir true true ) ) ") };
 
-  static const svn_string_t no_flags = STATIC_SVN_STRING("");
+  static const svn_string_t no_flags = SVN__STATIC_STRING("");
 
   /* Select the array based on the NODE_KIND. */
   const svn_string_t *flags;

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_repos/authz.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_repos/authz.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_repos/authz.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_repos/authz.c Wed Feb  2 13:04:31 2022
@@ -130,6 +130,30 @@ static svn_object_pool__t *authz_pool =
 static svn_object_pool__t *filtered_pool = NULL;
 static svn_atomic_t authz_pool_initialized = FALSE;
 
+/*
+ * Ensure that we will initialize authz again if the pool which
+ * our authz caches depend on is cleared.
+ *
+ * HTTPD may run pre/post config hooks multiple times and clear
+ * its global configuration pool which our authz pools depend on.
+ * This happens in a non-threaded context during HTTPD's intialization
+ * and HTTPD's main loop, so it is safe to reset static variables here.
+ * (And any applications which cleared this pool while SVN threads
+ * were running would crash no matter what.)
+ *
+ * See issue #4880, "Use-after-free of object-pools in
+ * subversion/libsvn_repos/authz.c when used as httpd module"
+ */
+static apr_status_t
+deinit_authz(void *data)
+{
+  /* The two object pools run their own cleanup handlers. */
+  authz_pool = NULL;
+  filtered_pool = NULL;
+  authz_pool_initialized = FALSE;
+  return APR_SUCCESS;
+}
+
 /* Implements svn_atomic__err_init_func_t. */
 static svn_error_t *
 synchronized_authz_initialize(void *baton, apr_pool_t *pool)
@@ -143,6 +167,7 @@ synchronized_authz_initialize(void *bato
   SVN_ERR(svn_object_pool__create(&authz_pool, multi_threaded, pool));
   SVN_ERR(svn_object_pool__create(&filtered_pool, multi_threaded, pool));
 
+  apr_pool_cleanup_register(pool, NULL, deinit_authz, apr_pool_cleanup_null);
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_repos/reporter.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_repos/reporter.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_repos/reporter.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_repos/reporter.c Wed Feb  2 13:04:31 2022
@@ -47,7 +47,7 @@
    the delta between the source and target revs.
 
    Spill-buffer content format: we use a simple ad-hoc format to store the
-   report operations.  Each report operation is the concatention of
+   report operations.  Each report operation is the concatenation of
    the following ("+/-" indicates the single character '+' or '-';
    <length> and <revnum> are written out as decimal strings):
 

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_subr/version.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_subr/version.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_subr/version.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_subr/version.c Wed Feb  2 13:04:31 2022
@@ -41,7 +41,7 @@ svn_boolean_t svn_ver_compatible(const s
                                  const svn_version_t *lib_version)
 {
   /* With normal development builds the matching rules are stricter
-     that for release builds, to avoid inadvertently using the wrong
+     than for release builds, to avoid inadvertently using the wrong
      libraries.  For backward compatibility testing of development
      builds one can use --disable-full-version-match to cause a
      development build to use the release build rules.  This allows
@@ -143,7 +143,7 @@ svn_version_extended(svn_boolean_t verbo
   info->build_time = __TIME__;
   info->build_host = SVN_BUILD_HOST;
   info->copyright = apr_pstrdup
-    (pool, _("Copyright (C) 2021 The Apache Software Foundation.\n"
+    (pool, _("Copyright (C) 2022 The Apache Software Foundation.\n"
              "This software consists of contributions made by many people;\n"
              "see the NOTICE file for more information.\n"
              "Subversion is open source software, see "

Modified: subversion/branches/pristines-on-demand/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/libsvn_wc/update_editor.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/pristines-on-demand/subversion/libsvn_wc/update_editor.c Wed Feb  2 13:04:31 2022
@@ -1070,7 +1070,7 @@ window_handler(svn_txdelta_window_t *win
 
 /* Find the last-change info within ENTRY_PROPS, and return then in the
    CHANGED_* parameters. Each parameter will be initialized to its "none"
-   value, and will contain the relavent info if found.
+   value, and will contain the relevant info if found.
 
    CHANGED_AUTHOR will be allocated in RESULT_POOL. SCRATCH_POOL will be
    used for some temporary allocations.

Modified: subversion/branches/pristines-on-demand/subversion/po/it.po
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/po/it.po?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/po/it.po (original)
+++ subversion/branches/pristines-on-demand/subversion/po/it.po Wed Feb  2 13:04:31 2022
@@ -4214,10 +4214,6 @@ msgstr ""
 msgid "authorization failed: %s"
 msgstr "autorizzazione non riuscita: %s"
 
-#: ../libsvn_ra_neon/util.c:630
-msgid "authorization failed"
-msgstr "autorizzazione fallita"
-
 #: ../libsvn_ra_neon/util.c:635
 msgid "could not connect to server"
 msgstr "non ho potuto connettermi al server"

Modified: subversion/branches/pristines-on-demand/subversion/svn/info-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/svn/info-cmd.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/svn/info-cmd.c (original)
+++ subversion/branches/pristines-on-demand/subversion/svn/info-cmd.c Wed Feb  2 13:04:31 2022
@@ -46,6 +46,8 @@
 #include "svn_private_config.h"
 #include "cl-conflicts.h"
 
+#include "private/svn_string_private.h"
+
 
 /*** Code. ***/
 
@@ -376,26 +378,24 @@ typedef struct info_item_map_t
   const info_item_t print_what;
 } info_item_map_t;
 
-#define MAKE_STRING(x) { x, sizeof(x) - 1 }
 static const info_item_map_t info_item_map[] =
   {
-    { MAKE_STRING("kind"),                info_item_kind },
-    { MAKE_STRING("url"),                 info_item_url },
-    { MAKE_STRING("relative-url"),        info_item_relative_url },
-    { MAKE_STRING("repos-root-url"),      info_item_repos_root_url },
-    { MAKE_STRING("repos-uuid"),          info_item_repos_uuid },
-    { MAKE_STRING("repos-size"),          info_item_repos_size },
-    { MAKE_STRING("revision"),            info_item_revision },
-    { MAKE_STRING("last-changed-revision"),
-                                          info_item_last_changed_rev },
-    { MAKE_STRING("last-changed-date"),   info_item_last_changed_date },
-    { MAKE_STRING("last-changed-author"), info_item_last_changed_author },
-    { MAKE_STRING("wc-root"),             info_item_wc_root },
-    { MAKE_STRING("schedule"),            info_item_schedule },
-    { MAKE_STRING("depth"),               info_item_depth },
-    { MAKE_STRING("changelist"),          info_item_changelist },
+    { SVN__STATIC_STRING("kind"),                info_item_kind },
+    { SVN__STATIC_STRING("url"),                 info_item_url },
+    { SVN__STATIC_STRING("relative-url"),        info_item_relative_url },
+    { SVN__STATIC_STRING("repos-root-url"),      info_item_repos_root_url },
+    { SVN__STATIC_STRING("repos-uuid"),          info_item_repos_uuid },
+    { SVN__STATIC_STRING("repos-size"),          info_item_repos_size },
+    { SVN__STATIC_STRING("revision"),            info_item_revision },
+    { SVN__STATIC_STRING("last-changed-revision"),
+                                                 info_item_last_changed_rev },
+    { SVN__STATIC_STRING("last-changed-date"),   info_item_last_changed_date },
+    { SVN__STATIC_STRING("last-changed-author"), info_item_last_changed_author },
+    { SVN__STATIC_STRING("wc-root"),             info_item_wc_root },
+    { SVN__STATIC_STRING("schedule"),            info_item_schedule },
+    { SVN__STATIC_STRING("depth"),               info_item_depth },
+    { SVN__STATIC_STRING("changelist"),          info_item_changelist },
   };
-#undef MAKE_STRING
 
 static const apr_size_t info_item_map_len =
   (sizeof(info_item_map) / sizeof(info_item_map[0]));

Modified: subversion/branches/pristines-on-demand/subversion/svn/shelf-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/svn/shelf-cmd.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/svn/shelf-cmd.c (original)
+++ subversion/branches/pristines-on-demand/subversion/svn/shelf-cmd.c Wed Feb  2 13:04:31 2022
@@ -897,7 +897,7 @@ svn_cl__shelf_shelve(apr_getopt_t *os,
     else
       SVN_ERR(err);
 
-      if (! opt_state->quiet)
+    if (! opt_state->quiet)
       {
         if (opt_state->keep_local)
           SVN_ERR(svn_cmdline_printf(pool,

Modified: subversion/branches/pristines-on-demand/subversion/svn/shelf2-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/svn/shelf2-cmd.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/svn/shelf2-cmd.c (original)
+++ subversion/branches/pristines-on-demand/subversion/svn/shelf2-cmd.c Wed Feb  2 13:04:31 2022
@@ -897,7 +897,7 @@ svn_cl__shelf_shelve(apr_getopt_t *os,
     else
       SVN_ERR(err);
 
-      if (! opt_state->quiet)
+    if (! opt_state->quiet)
       {
         if (opt_state->keep_local)
           SVN_ERR(svn_cmdline_printf(pool,

Modified: subversion/branches/pristines-on-demand/subversion/svnadmin/svnadmin.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/svnadmin/svnadmin.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/svnadmin/svnadmin.c (original)
+++ subversion/branches/pristines-on-demand/subversion/svnadmin/svnadmin.c Wed Feb  2 13:04:31 2022
@@ -352,7 +352,8 @@ static const svn_opt_subcommand_desc3_t
     "2. Delete the property NAME on transaction TXN.\n"
    )},
    {'r', 't', svnadmin__use_pre_revprop_change_hook,
-    svnadmin__use_post_revprop_change_hook} },
+    svnadmin__use_post_revprop_change_hook},
+   { {'r', "specify revision number ARG"} } },
 
   {"deltify", subcommand_deltify, {0}, {N_(
     "usage: svnadmin deltify [-r LOWER[:UPPER]] REPOS_PATH\n"
@@ -541,7 +542,8 @@ static const svn_opt_subcommand_desc3_t
     "The size includes revision properties and excludes FSFS indexes.\n"
    )},
    {'r', 'q', 'M'},
-   { {'q', "print only the size and a newline"} } },
+   { {'r', "specify revision number ARG"},
+     {'q', "print only the size and a newline"} }, },
 
   {"rmlocks", subcommand_rmlocks, {0}, {N_(
     "usage: svnadmin rmlocks REPOS_PATH LOCKED_PATH...\n"
@@ -570,7 +572,8 @@ static const svn_opt_subcommand_desc3_t
     "NOTE: Revision properties are not versioned, so this command will\n"
     "overwrite the previous log message.\n"
    )},
-   {'r', svnadmin__bypass_hooks} },
+   {'r', svnadmin__bypass_hooks},
+   { {'r', "specify revision number ARG"} }, }, 
 
   {"setrevprop", subcommand_setrevprop, {0}, {N_(
     "usage: 1. svnadmin setrevprop REPOS_PATH -r REVISION NAME FILE\n"
@@ -588,7 +591,8 @@ static const svn_opt_subcommand_desc3_t
     "2. Set the property NAME on transaction TXN to the contents of FILE.\n"
    )},
    {'r', 't', svnadmin__use_pre_revprop_change_hook,
-    svnadmin__use_post_revprop_change_hook} },
+    svnadmin__use_post_revprop_change_hook},
+   { {'r', "specify revision number ARG"} }, }, 
 
   {"setuuid", subcommand_setuuid, {0}, {N_(
     "usage: svnadmin setuuid REPOS_PATH [NEW_UUID]\n"

Modified: subversion/branches/pristines-on-demand/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/cmdline/basic_tests.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/cmdline/basic_tests.py Wed Feb  2 13:04:31 2022
@@ -3244,6 +3244,42 @@ def filtered_ls_top_level_path(sbox):
     exit_code, output, error = svntest.actions.run_and_verify_svn(
       [], [], 'ls', f_path, '--search=*/*', *extra_opts)
 
+def keep_local_reverted_properly(sbox):
+  "rm --keep-local, /bin/rm, revert"
+
+  sbox.build(read_only=True)
+  wc_dir = sbox.wc_dir
+
+  lambda_path = sbox.ospath('A/B/lambda')
+  E_path =  sbox.ospath('A/B/E')
+  targets = [ lambda_path, E_path ]
+
+  # Modify
+  sbox.simple_append('A/B/lambda', "added text\n")
+  svntest.main.run_svn(None, 'ps', 'k', 'v', E_path)
+
+  # Schedule for removal
+  svntest.main.run_svn(None, 'rm', '--keep-local', *targets)
+
+  # Remove from disk
+  os.unlink(lambda_path)
+  shutil.rmtree(E_path)
+
+  # Revert
+  svntest.main.run_svn(None, 'revert', *targets)
+
+  # Check that the modifications are absent
+  # 
+  # alpha and beta are still scheduled for deletion because 'revert' doesn't
+  # recurse by default.
+  expected_disk = svntest.main.greek_state.copy()
+  expected_disk.remove('A/B/E/alpha', 'A/B/E/beta')
+  expected_output = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_output.tweak('A/B/E/alpha', 'A/B/E/beta', status='D ')
+  #
+  svntest.actions.verify_disk(sbox.wc_dir, expected_disk, check_props=True)
+  svntest.actions.run_and_verify_status(wc_dir, expected_output)
+
 
 ########################################################################
 # Run the tests
@@ -3320,6 +3356,7 @@ test_list = [ None,
               null_update_last_changed_revision,
               null_prop_update_last_changed_revision,
               filtered_ls_top_level_path,
+              keep_local_reverted_properly,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/pristines-on-demand/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/cmdline/log_tests.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/cmdline/log_tests.py Wed Feb  2 13:04:31 2022
@@ -2816,6 +2816,59 @@ def log_with_merge_history_and_search(sb
   if count(output, "<logentry") != count(output, "</logentry"):
     raise svntest.Failure("Apparently invalid XML in " + repr(output))
 
+@XFail(svntest.main.is_ra_type_file)
+@Issue(4856)
+def log_xml_with_merge_history(sbox):
+  "log --use-merge-history --xml"
+  
+  sbox.build()
+
+  # r2-r4: create branches
+  sbox.simple_repo_copy('A', 'A2')
+  sbox.simple_repo_copy('A', 'A3')
+  sbox.simple_repo_copy('A', 'A4')
+
+  # r5: mod in trunk
+  sbox.simple_append('A/mu', 'line 2')
+  sbox.simple_commit(message='r5: mod')
+  sbox.simple_update()
+
+  # r6-r7: merge A=>A2, A2=>A3
+  svntest.main.run_svn(None, 'merge', '-c', '5', sbox.repo_url + '/A', sbox.ospath('A2'))
+  sbox.simple_commit(message='r6: merge A=>A2')
+  sbox.simple_update()
+  svntest.main.run_svn(None, 'merge', '-c', '6', sbox.repo_url + '/A2', sbox.ospath('A3'))
+  sbox.simple_commit(message='r7: merge A2=>A3')
+  sbox.simple_update()
+
+  # r8: add file in A3
+  xi_path = os.path.join(sbox.wc_dir, 'A3/xi')
+  svntest.main.file_write(xi_path, "This is the file 'A3/xi'.\n")
+  svntest.main.run_svn(None, 'add', xi_path)
+  sbox.simple_commit(message='r8: add A3/xi')
+  sbox.simple_update()
+
+  # r9: merge A3=>A4
+  svntest.main.run_svn(None, 'merge', '-r', '6:8', sbox.repo_url + '/A3', sbox.ospath('A4'))
+  sbox.simple_commit(message='r9: merge A3=>A4')
+  sbox.simple_update()
+
+  # Helper function
+  def count(haystack, needle):
+    """Return the number of times the string NEEDLE occurs in the string
+    HAYSTACK."""
+    return len(haystack.split(needle)) - 1
+
+  # Check the output is valid
+  # ### Since the test is currently XFail, we only smoke test the output.
+  # ### When fixing this test to PASS, extend this validation.
+  _, output, _ = svntest.main.run_svn(None, 'log', '--xml', '-g', '-r', '8:9',
+                                      sbox.ospath('A4'))
+
+  output = '\n'.join(output)
+  if count(output, "<logentry") != count(output, "</logentry"):
+    raise svntest.Failure("Apparently invalid XML in " + repr(output))
+
 ########################################################################
 # Run the tests
 
@@ -2867,6 +2920,7 @@ test_list = [ None,
               log_revision_move_copy,
               log_on_deleted_deep,
               log_with_merge_history_and_search,
+              log_xml_with_merge_history,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/pristines-on-demand/subversion/tests/cmdline/pegrev_parse_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/cmdline/pegrev_parse_tests.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/cmdline/pegrev_parse_tests.py (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/cmdline/pegrev_parse_tests.py Wed Feb  2 13:04:31 2022
@@ -52,7 +52,7 @@ Item = wc.StateItem
 # commands, because the parser may have (and as of this writing does have)
 # edge-case bugs that we can only expose in this way. Therefore, these helpers
 # ensure that we run 'svn' with the CWD at the root of the working copy.
-def run_svn(sbox, expected_status, expected_stderr, *varargs):
+def run_svn_at_wcdir(sbox, expected_status, expected_stderr, *varargs):
   if expected_stderr is None:
     expected_stderr = []
 
@@ -96,8 +96,8 @@ def do_add_file(sbox, dst, dst_cmdline,
     expected_status.add({dst: Item(status='A ', wc_rev='-')})
 
   main.file_write(sbox.ospath(dst), "This is file '"  + dst + "'.")
-  run_svn(sbox, expected_status, expected_stderr,
-          'add', dst_cmdline)
+  run_svn_at_wcdir(sbox, expected_status, expected_stderr,
+                   'add', dst_cmdline)
 
 def do_add_file_e(sbox, dst, dst_cmdline, expected_stderr=None):
   "like do_add_file() but with an empty sandbox"
@@ -109,8 +109,8 @@ def do_make_dir(sbox, dst, dst_cmdline,
   if expected_status is not None:
     expected_status.add({dst: Item(status='A ', wc_rev='-')})
 
-  run_svn(sbox, expected_status, expected_stderr,
-          'mkdir', dst_cmdline)
+  run_svn_at_wcdir(sbox, expected_status, expected_stderr,
+                   'mkdir', dst_cmdline)
 
 def do_make_dir_e(sbox, dst, dst_cmdline, expected_stderr=None):
   "like do_make_dir() but with an empty sandbox"
@@ -121,8 +121,8 @@ def do_remove(sbox, dst, dst_cmdline, ex
   if expected_status is not None and dst in expected_status.desc:
     expected_status.tweak(dst, status='D ')
 
-  run_svn(sbox, expected_status, expected_stderr,
-          'remove', dst_cmdline)
+  run_svn_at_wcdir(sbox, expected_status, expected_stderr,
+                   'remove', dst_cmdline)
 
 def do_rename(sbox, src, src_cmdline, dst, dst_cmdline,
               expected_stderr=None):
@@ -132,8 +132,8 @@ def do_rename(sbox, src, src_cmdline, ds
     expected_status.add({dst: Item(status='A ', copied='+',
                                    moved_from=src, wc_rev='-')})
 
-  run_svn(sbox, expected_status, expected_stderr,
-          'rename', src_cmdline, dst_cmdline)
+  run_svn_at_wcdir(sbox, expected_status, expected_stderr,
+                   'rename', src_cmdline, dst_cmdline)
 
 
 ######################################################################

Modified: subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/actions.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/actions.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/actions.py (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/actions.py Wed Feb  2 13:04:31 2022
@@ -2134,9 +2134,10 @@ def disable_revprop_changes(repo_dir):
   main.create_python_hook_script(hook_path,
                                  'import sys\n'
                                  'sys.stderr.write("pre-revprop-change %s" %'
-                                                  ' " ".join(sys.argv[1:]))\n'
+                                                  ' " ".join(sys.argv[2:]))\n'
                                  'sys.exit(1)\n',
                                  cmd_alternative=
+                                       '@shift\n'
                                        '@echo pre-revprop-change %* 1>&2\n'
                                        '@exit 1\n')
 

Modified: subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/main.py
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/main.py?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/main.py (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/cmdline/svntest/main.py Wed Feb  2 13:04:31 2022
@@ -616,6 +616,13 @@ def run_command_stdin(command, error_exp
 
   start = time.time()
 
+  if sys.version_info >= (3, 0):
+    # Don't include 'bytes' since spawn_process() would raise.
+    assert all(isinstance(arg, (str, int)) for arg in varargs)
+  else:
+    # Include 'unicode' since svnrdump_tests pass b''.decode().
+    assert all(isinstance(arg, (str, unicode, int)) for arg in varargs)
+
   exit_code, stdout_lines, stderr_lines = spawn_process(command,
                                                         bufsize,
                                                         binary_mode,
@@ -637,8 +644,7 @@ def run_command_stdin(command, error_exp
       break
     # Does the server leak the repository on-disk path?
     # (prop_tests-12 installs a hook script that does that intentionally)
-    if any(map(_line_contains_repos_diskpath, lines)) \
-       and not any(map(lambda arg: 'prop_tests-12' in arg, varargs)):
+    if any(map(_line_contains_repos_diskpath, lines)):
       raise Failure("Repository diskpath in %s: %r" % (name, lines))
 
   valgrind_diagnostic = False

Modified: subversion/branches/pristines-on-demand/subversion/tests/libsvn_diff/diff-diff3-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/subversion/tests/libsvn_diff/diff-diff3-test.c?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/subversion/tests/libsvn_diff/diff-diff3-test.c (original)
+++ subversion/branches/pristines-on-demand/subversion/tests/libsvn_diff/diff-diff3-test.c Wed Feb  2 13:04:31 2022
@@ -28,6 +28,8 @@
 #include "svn_pools.h"
 #include "svn_utf.h"
 
+#include "private/svn_string_private.h"
+
 /* Used to terminate lines in large multi-line string literals. */
 #define NL APR_EOL_STR
 
@@ -2071,15 +2073,13 @@ test_three_way_merge_conflict_styles(apr
 }
 
 
-#define MAKE_STRING(cstr) { (cstr), sizeof((cstr))-1 }
-
 static svn_error_t *
 test_diff4(apr_pool_t *pool)
 {
   svn_diff_t *diff;
   svn_stream_t *actual, *expected;
   svn_boolean_t same;
-  static svn_string_t B2 = MAKE_STRING(
+  static svn_string_t B2 = SVN__STATIC_STRING(
     "int main (int argc, char **argv)\n"
     "{\n"
     "  /* line minus-five of context */\n"
@@ -2094,7 +2094,7 @@ test_diff4(apr_pool_t *pool)
     "  /* line plus-four of context */\n"
     "  /* line plus-five of context */\n"
     "}\n");
-  static svn_string_t B2new = MAKE_STRING(
+  static svn_string_t B2new = SVN__STATIC_STRING(
     "int main (int argc, char **argv)\n"
     "{\n"
     "  /* line minus-five of context */\n"
@@ -2109,7 +2109,7 @@ test_diff4(apr_pool_t *pool)
     "  /* line plus-four of context */\n"
     "  /* line plus-five of context */\n"
     "}\n");
-  static svn_string_t T1 = MAKE_STRING(
+  static svn_string_t T1 = SVN__STATIC_STRING(
     "int main (int argc, char **argv)\n"
     "{\n"
     "  /* line minus-five of context */\n"
@@ -2124,7 +2124,7 @@ test_diff4(apr_pool_t *pool)
     "  /* line plus-four of context */\n"
     "  /* line plus-five of context */\n"
     "}\n");
-  static svn_string_t T2 = MAKE_STRING(
+  static svn_string_t T2 = SVN__STATIC_STRING(
     "#include <stdio.h>\n"
     "\n"
     "int main (int argc, char **argv)\n"
@@ -2141,7 +2141,7 @@ test_diff4(apr_pool_t *pool)
     "  /* line plus-four of context */\n"
     "  /* line plus-five of context */\n"
     "}\n");
-  static svn_string_t T3 = MAKE_STRING(
+  static svn_string_t T3 = SVN__STATIC_STRING(
     "#include <stdio.h>\n"
     "\n"
     "int main (int argc, char **argv)\n"

Modified: subversion/branches/pristines-on-demand/tools/client-side/bash_completion
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/tools/client-side/bash_completion?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/tools/client-side/bash_completion (original)
+++ subversion/branches/pristines-on-demand/tools/client-side/bash_completion Wed Feb  2 13:04:31 2022
@@ -1127,7 +1127,7 @@ _svn()
 	COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )
 	return 0
 }
-complete -F _svn -o default -X '@(*/.svn|*/.svn/|.svn|.svn/)' svn
+complete -F _svn -o bashdefault -o default -X '@(*/.svn|*/.svn/|.svn|.svn/)' svn
 
 _svnadmin ()
 {
@@ -1280,7 +1280,7 @@ _svnadmin ()
 
 	return 0
 }
-complete -F _svnadmin -o default svnadmin
+complete -F _svnadmin -o bashdefault -o default svnadmin
 
 _svndumpfilter ()
 {
@@ -1354,7 +1354,7 @@ _svndumpfilter ()
 
 	return 0
 }
-complete -F _svndumpfilter -o default svndumpfilter
+complete -F _svndumpfilter -o bashdefault -o default svndumpfilter
 
 _svnlook ()
 {
@@ -1485,7 +1485,7 @@ _svnlook ()
 
 	return 0
 }
-complete -F _svnlook -o default svnlook
+complete -F _svnlook -o bashdefault -o default svnlook
 
 _svnsync ()
 {
@@ -1568,7 +1568,7 @@ _svnsync ()
 
 	return 0
 }
-complete -F _svnsync -o default svnsync
+complete -F _svnsync -o bashdefault -o default svnsync
 
 # reasonable completion for 'svnversion'
 _svnversion ()

Modified: subversion/branches/pristines-on-demand/tools/dev/unix-build/Makefile.svn
URL: http://svn.apache.org/viewvc/subversion/branches/pristines-on-demand/tools/dev/unix-build/Makefile.svn?rev=1897695&r1=1897694&r2=1897695&view=diff
==============================================================================
--- subversion/branches/pristines-on-demand/tools/dev/unix-build/Makefile.svn (original)
+++ subversion/branches/pristines-on-demand/tools/dev/unix-build/Makefile.svn Wed Feb  2 13:04:31 2022
@@ -53,6 +53,12 @@ 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)
@@ -73,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)
@@ -115,7 +124,7 @@ 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	= 3.7.5
 PYTHON2_VER	= 2.7.13
@@ -151,7 +160,7 @@ SHA256_${NEON_DIST} = db0bd8cdec329b48f5
 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} = 8ecc681ea0600bbfb366f2b173f727b205bb825d93d2f0b286bc4e58d37693da
 SHA256_${PYTHON2_DIST} = a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1
@@ -207,7 +216,7 @@ SERF_OLD_URL	= https://svn.apache.org/re
 SQLITE_URL	= https://www.sqlite.org/2017/$(SQLITE_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)
+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)
 PYTHON2_URL	= https://python.org/ftp/python/$(PYTHON2_VER)/$(PYTHON2_DIST)
@@ -556,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
@@ -1239,33 +1250,6 @@ $(RUBY_OBJDIR)/sparc64_buserror.patch:
 	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'
-	echo >> $@.tmp '@@ -2094,7 +2104,8 @@'
-	echo >> $@.tmp ' 	    unref_destination(iobj, 0);'
-	echo >> $@.tmp ' 	    REMOVE_ELEM(&iobj->link);'
-	echo >> $@.tmp ' 	}'
-	echo >> $@.tmp '-	else if (iobj != diobj && IS_INSN_ID(diobj, jump) &&'
-	echo >> $@.tmp '+	else if (iobj != diobj && IS_INSN(&diobj->link) &&'
-	echo >> $@.tmp '+		 IS_INSN_ID(diobj, jump) &&'
-	echo >> $@.tmp ' 		 OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) {'
-	echo >> $@.tmp ' 	    replace_destination(iobj, diobj);'
-	echo >> $@.tmp ' 	    remove_unreachable_chunk(iseq, iobj->link.next);'
-	echo >> $@.tmp '@@ -2136,6 +2147,7 @@'
-	echo >> $@.tmp ' 	 * L2:'
-	echo >> $@.tmp ' 	 */'
-	echo >> $@.tmp ' 	else if ((piobj = (INSN *)get_prev_insn(iobj)) != 0 &&'
-	echo >> $@.tmp '+		 IS_INSN(&piobj->link) &&'
-	echo >> $@.tmp ' 		 (IS_INSN_ID(piobj, branchif) ||'
-	echo >> $@.tmp ' 		  IS_INSN_ID(piobj, branchunless))) {'
-	echo >> $@.tmp ' 	    if (niobj == (INSN *)get_destination_insn(piobj)) {'
-	echo >> $@.tmp '@@ -2176,7 +2188,7 @@'
-	echo >> $@.tmp ' 	}'
-	echo >> $@.tmp ' '
-	echo >> $@.tmp ' 	for (;;) {'
-	echo >> $@.tmp '-	    if (IS_INSN_ID(nobj, jump)) {'
-	echo >> $@.tmp '+	    if (IS_INSN(&nobj->link) && IS_INSN_ID(nobj, jump)) {'
-	echo >> $@.tmp ' 		replace_destination(iobj, nobj);'
-	echo >> $@.tmp ' 	    }'
-	echo >> $@.tmp ' 	    else if (prev_dup && IS_INSN_ID(nobj, dup) &&'
 	mv -f $@.tmp $@
 
 ifeq ($(UNAME),OpenBSD)