You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2014/03/13 10:59:55 UTC

svn commit: r1577079 - in /subversion/trunk/subversion: include/private/ libsvn_client/ libsvn_delta/ libsvn_diff/ libsvn_fs_fs/ libsvn_ra/ libsvn_repos/ libsvn_subr/ libsvn_wc/ svndumpfilter/

Author: ivan
Date: Thu Mar 13 09:59:55 2014
New Revision: 1577079

URL: http://svn.apache.org/r1577079
Log:
Add svn_sort__array() -- simple wrapper around qsort() to sort APR array 
and use where applicable.

* subversion/include/private/svn_sorts_private.h
  (svn_sort__array): New declaration.

* subversion/libsvn_subr/sorts.c
  (svn_sort__array): New.

* subversion/libsvn_client/add.c
  (): Include svn_sorts_private.h.
  (mkdir_urls): Use svn_sort__array().

* subversion/libsvn_client/commit.c
  (): Include svn_sorts_private.h.
  (determine_lock_targets): Use svn_sort__array().

* subversion/libsvn_client/commit_util.c
  (): Remove stdlib.h and include svn_sorts_private.h.
  (svn_client__condense_commit_items): Use svn_sort__array().

* subversion/libsvn_client/ra.c
  (): Include svn_sorts_private.h.
  (svn_client__repos_location_segments): Use svn_sort__array().

* subversion/libsvn_client/resolved.c
  (): Remove stdlib.h and include svn_sorts_private.h.
  (svn_client__resolve_conflicts): Use svn_sort__array().
  
* subversion/libsvn_delta/path_driver.c
  (): Include svn_sorts_private.h.
  (svn_delta_path_driver2): Use svn_sort__array().

* subversion/libsvn_diff/parse-diff.c
  (): Include svn_sorts_private.h.
  (svn_diff_parse_next_patch): Use svn_sort__array().
  
* subversion/libsvn_fs_fs/cached_data.c
  (read_dir_entries): Use svn_sort__array().

* subversion/libsvn_fs_fs/transaction.c
  (verify_locks): Use svn_sort__array().

* subversion/libsvn_ra/compat.c
  (svn_ra__locations_from_log): Use svn_sort__array().

* subversion/libsvn_repos/log.c
  (): Include svn_sorts_private.h.
  (turn_unique_copies_into_moves, combine_mergeinfo_path_lists,
   handle_merged_revisions): Use svn_sort__array().

* subversion/libsvn_repos/replay.c
  (): Include svn_sorts_private.h.
  (svn_repos__replay_ev2): Use svn_sort__array().
  
* subversion/libsvn_repos/rev_hunt.c
  (): Include svn_sorts_private.h.
  (find_merged_revisions): Use svn_sort__array().

* subversion/libsvn_subr/mergeinfo.c
  (combine_with_lastrange, parse_revision_line, svn_mergeinfo_sort): Use 
   svn_sort__array().

* subversion/libsvn_wc/revert.c
  (): Include svn_sorts_private.h.
  (revert_restore_handle_copied_dirs): Use svn_sort__array().

* subversion/svndumpfilter/svndumpfilter.c
  (): Include svn_sorts_private.h.
  (do_filter): Use svn_sort__array().

Modified:
    subversion/trunk/subversion/include/private/svn_sorts_private.h
    subversion/trunk/subversion/libsvn_client/add.c
    subversion/trunk/subversion/libsvn_client/commit.c
    subversion/trunk/subversion/libsvn_client/commit_util.c
    subversion/trunk/subversion/libsvn_client/ra.c
    subversion/trunk/subversion/libsvn_client/resolved.c
    subversion/trunk/subversion/libsvn_delta/path_driver.c
    subversion/trunk/subversion/libsvn_diff/parse-diff.c
    subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
    subversion/trunk/subversion/libsvn_fs_fs/transaction.c
    subversion/trunk/subversion/libsvn_ra/compat.c
    subversion/trunk/subversion/libsvn_repos/log.c
    subversion/trunk/subversion/libsvn_repos/replay.c
    subversion/trunk/subversion/libsvn_repos/rev_hunt.c
    subversion/trunk/subversion/libsvn_subr/mergeinfo.c
    subversion/trunk/subversion/libsvn_subr/sorts.c
    subversion/trunk/subversion/libsvn_wc/revert.c
    subversion/trunk/subversion/svndumpfilter/svndumpfilter.c

Modified: subversion/trunk/subversion/include/private/svn_sorts_private.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_sorts_private.h?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_sorts_private.h (original)
+++ subversion/trunk/subversion/include/private/svn_sorts_private.h Thu Mar 13 09:59:55 2014
@@ -72,6 +72,14 @@ svn_sort__hash(apr_hash_t *ht,
                                       const svn_sort__item_t *),
                apr_pool_t *pool);
 
+/* Sort APR array @a array using ordering defined by @a comparison_func.
+ * @a comparison_func is defined as for the C stdlib function qsort().
+ */
+void
+svn_sort__array(apr_array_header_t *array,
+                int (*comparison_func)(const void *,
+                                       const void *));
+
 /* Return the lowest index at which the element @a *key should be inserted into
  * the array @a array, according to the ordering defined by @a compare_func.
  * The array must already be sorted in the ordering defined by @a compare_func.

Modified: subversion/trunk/subversion/libsvn_client/add.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/add.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/add.c (original)
+++ subversion/trunk/subversion/libsvn_client/add.c Thu Mar 13 09:59:55 2014
@@ -48,6 +48,7 @@
 #include "private/svn_client_private.h"
 #include "private/svn_wc_private.h"
 #include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
 #include "private/svn_magic.h"
 
 #include "svn_private_config.h"
@@ -1169,8 +1170,8 @@ mkdir_urls(const apr_array_header_t *url
             }
         }
     }
-  qsort(targets->elts, targets->nelts, targets->elt_size,
-        svn_sort_compare_paths);
+
+  svn_sort__array(targets, svn_sort_compare_paths);
 
   /* ### This reparent may be problematic in limited-authz-to-common-parent
      ### scenarios (compare issue #3242).  See also issue #3649. */

Modified: subversion/trunk/subversion/libsvn_client/commit.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/commit.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/commit.c (original)
+++ subversion/trunk/subversion/libsvn_client/commit.c Thu Mar 13 09:59:55 2014
@@ -45,6 +45,7 @@
 #include "client.h"
 #include "private/svn_wc_private.h"
 #include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
 
 #include "svn_private_config.h"
 
@@ -351,8 +352,7 @@ determine_lock_targets(apr_array_header_
           SVN_ERR(svn_dirent_condense_targets(&common, &wc_targets, wc_targets,
                                               FALSE, iterpool, iterpool));
 
-          qsort(wc_targets->elts, wc_targets->nelts, wc_targets->elt_size,
-                svn_sort_compare_paths);
+          svn_sort__array(wc_targets, svn_sort_compare_paths);
 
           if (wc_targets->nelts == 0
               || !svn_path_is_empty(APR_ARRAY_IDX(wc_targets, 0, const char*))

Modified: subversion/trunk/subversion/libsvn_client/commit_util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/commit_util.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/commit_util.c (original)
+++ subversion/trunk/subversion/libsvn_client/commit_util.c Thu Mar 13 09:59:55 2014
@@ -40,11 +40,11 @@
 #include "svn_hash.h"
 
 #include <assert.h>
-#include <stdlib.h>  /* for qsort() */
 
 #include "svn_private_config.h"
 #include "private/svn_wc_private.h"
 #include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
 
 /*** Uncomment this to turn on commit driver debugging. ***/
 /*
@@ -1405,8 +1405,7 @@ svn_client__condense_commit_items(const 
   SVN_ERR_ASSERT(ci && ci->nelts);
 
   /* Sort our commit items by their URLs. */
-  qsort(ci->elts, ci->nelts,
-        ci->elt_size, svn_client__sort_commit_item_urls);
+  svn_sort__array(ci, svn_client__sort_commit_item_urls);
 
   /* Loop through the URLs, finding the longest usable ancestor common
      to all of them, and making sure there are no duplicate URLs.  */

Modified: subversion/trunk/subversion/libsvn_client/ra.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/ra.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/ra.c (original)
+++ subversion/trunk/subversion/libsvn_client/ra.c Thu Mar 13 09:59:55 2014
@@ -42,6 +42,7 @@
 #include "svn_private_config.h"
 #include "private/svn_wc_private.h"
 #include "private/svn_client_private.h"
+#include "private/svn_sorts_private.h"
 
 
 /* This is the baton that we pass svn_ra_open3(), and is associated with
@@ -641,8 +642,7 @@ svn_client__repos_location_segments(apr_
                                      pool);
   SVN_ERR(svn_error_compose_create(
             err, svn_ra_reparent(ra_session, old_session_url, pool)));
-  qsort((*segments)->elts, (*segments)->nelts,
-        (*segments)->elt_size, compare_segments);
+  svn_sort__array(*segments, compare_segments);
   return SVN_NO_ERROR;
 }
 

Modified: subversion/trunk/subversion/libsvn_client/resolved.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/resolved.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/resolved.c (original)
+++ subversion/trunk/subversion/libsvn_client/resolved.c Thu Mar 13 09:59:55 2014
@@ -27,8 +27,6 @@
 
 /*** Includes. ***/
 
-#include <stdlib.h>
-
 #include "svn_types.h"
 #include "svn_wc.h"
 #include "svn_client.h"
@@ -39,6 +37,7 @@
 #include "svn_hash.h"
 #include "svn_sorts.h"
 #include "client.h"
+#include "private/svn_sorts_private.h"
 #include "private/svn_wc_private.h"
 
 #include "svn_private_config.h"
@@ -59,8 +58,7 @@ svn_client__resolve_conflicts(svn_boolea
     *conflicts_remain = FALSE;
 
   SVN_ERR(svn_hash_keys(&array, conflicted_paths, scratch_pool));
-  qsort(array->elts, array->nelts, array->elt_size,
-        svn_sort_compare_paths);
+  svn_sort__array(array, svn_sort_compare_paths);
 
   for (i = 0; i < array->nelts; i++)
     {

Modified: subversion/trunk/subversion/libsvn_delta/path_driver.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_delta/path_driver.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_delta/path_driver.c (original)
+++ subversion/trunk/subversion/libsvn_delta/path_driver.c Thu Mar 13 09:59:55 2014
@@ -32,6 +32,7 @@
 #include "svn_path.h"
 #include "svn_sorts.h"
 #include "private/svn_fspath.h"
+#include "private/svn_sorts_private.h"
 
 
 /*** Helper functions. ***/
@@ -157,8 +158,7 @@ svn_delta_path_driver2(const svn_delta_e
   if (sort_paths && paths->nelts > 1)
     {
       apr_array_header_t *sorted = apr_array_copy(subpool, paths);
-      qsort(sorted->elts, sorted->nelts, sorted->elt_size,
-            svn_sort_compare_paths);
+      svn_sort__array(sorted, svn_sort_compare_paths);
       paths = sorted;
     }
 

Modified: subversion/trunk/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/parse-diff.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/trunk/subversion/libsvn_diff/parse-diff.c Thu Mar 13 09:59:55 2014
@@ -38,6 +38,7 @@
 
 #include "private/svn_eol_private.h"
 #include "private/svn_dep_compat.h"
+#include "private/svn_sorts_private.h"
 
 /* Helper macro for readability */
 #define starts_with(str, start)  \
@@ -1333,8 +1334,7 @@ svn_diff_parse_next_patch(svn_patch_t **
        * offset. But just in case they weren't parsed in this order for
        * some reason, we sort them so that our caller can assume that hunks
        * are sorted as if parsed from a usual patch. */
-      qsort((*patch)->hunks->elts, (*patch)->hunks->nelts,
-            (*patch)->hunks->elt_size, compare_hunks);
+      svn_sort__array((*patch)->hunks, compare_hunks);
     }
 
   return SVN_NO_ERROR;

Modified: subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/cached_data.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/cached_data.c Thu Mar 13 09:59:55 2014
@@ -2078,7 +2078,7 @@ read_dir_entries(apr_array_header_t *ent
     }
 
   if (!sorted(entries))
-    qsort(entries->elts, entries->nelts, entries->elt_size, compare_dirents);
+    svn_sort__array(entries, compare_dirents);
 
   svn_pool_destroy(iterpool);
 

Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/transaction.c Thu Mar 13 09:59:55 2014
@@ -3242,8 +3242,7 @@ verify_locks(svn_fs_t *fs,
                                  sizeof(const char *));
   for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
     APR_ARRAY_PUSH(changed_paths, const char *) = svn__apr_hash_index_key(hi);
-  qsort(changed_paths->elts, changed_paths->nelts,
-        changed_paths->elt_size, svn_sort_compare_paths);
+  svn_sort__array(changed_paths, svn_sort_compare_paths);
 
   /* Now, traverse the array of changed paths, verify locks.  Note
      that if we need to do a recursive verification a path, we'll skip
@@ -3376,8 +3375,7 @@ verify_moves(svn_fs_t *fs,
   /* correct the deletions that refer to moved paths and make them refer to
      the paths in OLD_REV */
 
-  qsort(moves->elts, moves->nelts, moves->elt_size,
-        svn_sort_compare_paths);
+  svn_sort__array(moves, svn_sort_compare_paths);
 
   for (i = 0; i < deletions->nelts; ++i)
     {
@@ -3402,8 +3400,7 @@ verify_moves(svn_fs_t *fs,
         }
     }
 
-  qsort(deletions->elts, deletions->nelts, deletions->elt_size,
-        svn_sort_compare_paths);
+  svn_sort__array(deletions, svn_sort_compare_paths);
 
   /* The _same_ source paths must never occur more than once in any move 
      since our base revision. */

Modified: subversion/trunk/subversion/libsvn_ra/compat.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra/compat.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra/compat.c (original)
+++ subversion/trunk/subversion/libsvn_ra/compat.c Thu Mar 13 09:59:55 2014
@@ -337,8 +337,7 @@ svn_ra__locations_from_log(svn_ra_sessio
   /* Figure out the youngest and oldest revs (amongst the set of
      requested revisions + the peg revision) so we can avoid
      unnecessary log parsing. */
-  qsort(location_revisions->elts, location_revisions->nelts,
-        location_revisions->elt_size, compare_revisions);
+  svn_sort__array(location_revisions, compare_revisions);
   oldest_requested = APR_ARRAY_IDX(location_revisions, 0, svn_revnum_t);
   youngest_requested = APR_ARRAY_IDX(location_revisions,
                                      location_revisions->nelts - 1,

Modified: subversion/trunk/subversion/libsvn_repos/log.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/log.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/log.c (original)
+++ subversion/trunk/subversion/libsvn_repos/log.c Thu Mar 13 09:59:55 2014
@@ -42,6 +42,7 @@
 #include "private/svn_fs_private.h"
 #include "private/svn_mergeinfo_private.h"
 #include "private/svn_subr_private.h"
+#include "private/svn_sorts_private.h"
 
 
 
@@ -227,12 +228,10 @@ turn_unique_copies_into_moves(apr_hash_t
     return;
 
   /* identify copy-from paths that have been mentioned exactly once */
-
-  sources = (const char **)copy_sources->elts;
-  qsort(sources, copy_sources->nelts, copy_sources->elt_size,
-        (int (*)(const void *, const void *))svn_sort_compare_paths);
+  svn_sort__array(copy_sources, svn_sort_compare_paths);
 
   unique_copy_sources = apr_hash_make(pool);
+  sources = (const char **)copy_sources->elts;
   for (i = 0; i < copy_sources->nelts; ++i)
     if (   (i == 0 || strcmp(sources[i-1], sources[i]))
         && (i == copy_sources->nelts-1 || strcmp(sources[i+1], sources[i])))
@@ -1665,8 +1664,7 @@ combine_mergeinfo_path_lists(apr_array_h
 
       /* First, sort the list such that the start revision of the first
          revision arrays are sorted. */
-      qsort(rangelist_paths->elts, rangelist_paths->nelts,
-            rangelist_paths->elt_size, compare_rangelist_paths);
+      svn_sort__array(rangelist_paths, compare_rangelist_paths);
 
       /* Next, find the number of revision ranges which start with the same
          revision. */
@@ -1863,8 +1861,7 @@ handle_merged_revisions(svn_revnum_t rev
                                           TRUE, pool));
 
   SVN_ERR_ASSERT(combined_list != NULL);
-  qsort(combined_list->elts, combined_list->nelts,
-        combined_list->elt_size, compare_path_list_range);
+  svn_sort__array(combined_list, compare_path_list_range);
 
   /* Because the combined_lists are ordered youngest to oldest,
      iterate over them in reverse. */

Modified: subversion/trunk/subversion/libsvn_repos/replay.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/replay.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/replay.c (original)
+++ subversion/trunk/subversion/libsvn_repos/replay.c Thu Mar 13 09:59:55 2014
@@ -39,6 +39,7 @@
 #include "private/svn_fspath.h"
 #include "private/svn_repos_private.h"
 #include "private/svn_delta_private.h"
+#include "private/svn_sorts_private.h"
 
 
 /*** Backstory ***/
@@ -1546,7 +1547,7 @@ svn_repos__replay_ev2(svn_fs_root_t *roo
   /* Sort the paths.  Although not strictly required by the API, this has
      the pleasant side effect of maintaining a consistent ordering of
      dumpfile contents. */
-  qsort(paths->elts, paths->nelts, paths->elt_size, svn_sort_compare_paths);
+  svn_sort__array(paths, svn_sort_compare_paths);
 
   /* Now actually handle the various paths. */
   iterpool = svn_pool_create(scratch_pool);

Modified: subversion/trunk/subversion/libsvn_repos/rev_hunt.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/rev_hunt.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/trunk/subversion/libsvn_repos/rev_hunt.c Thu Mar 13 09:59:55 2014
@@ -39,6 +39,7 @@
 #include "repos.h"
 #include "private/svn_fspath.h"
 #include "private/svn_fs_private.h"
+#include "private/svn_sorts_private.h"
 
 
 /* Note:  this binary search assumes that the datestamp properties on
@@ -1302,8 +1303,7 @@ find_merged_revisions(apr_array_header_t
   while (new_merged_path_revs->nelts > 0);
 
   /* Sort MERGED_PATH_REVISIONS in increasing order by REVNUM. */
-  qsort(merged_path_revisions->elts, merged_path_revisions->nelts,
-        sizeof(struct path_revision *), compare_path_revisions);
+  svn_sort__array(merged_path_revisions, compare_path_revisions);
 
   /* Copy to the output array. */
   *merged_path_revisions_out = apr_array_copy(result_pool,

Modified: subversion/trunk/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/mergeinfo.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/mergeinfo.c Thu Mar 13 09:59:55 2014
@@ -455,8 +455,7 @@ combine_with_lastrange(const svn_merge_r
           /* Some of the above cases might have put *RANGELIST out of
              order, so re-sort.*/
           if (!sorted)
-            qsort(rangelist->elts, rangelist->nelts, rangelist->elt_size,
-                  svn_sort_compare_ranges);
+            svn_sort__array(rangelist, svn_sort_compare_ranges);
         }
     }
 
@@ -720,8 +719,7 @@ parse_revision_line(const char **input, 
    */
   if (! is_rangelist_normalized(rangelist))
     {
-      qsort(rangelist->elts, rangelist->nelts, rangelist->elt_size,
-            svn_sort_compare_ranges);
+      svn_sort__array(rangelist, svn_sort_compare_ranges);
 
       SVN_ERR(svn_rangelist__combine_adjacent_ranges(rangelist, scratch_pool));
     }
@@ -1996,7 +1994,7 @@ svn_mergeinfo_sort(svn_mergeinfo_t input
     {
       apr_array_header_t *rl = svn__apr_hash_index_val(hi);
 
-      qsort(rl->elts, rl->nelts, rl->elt_size, svn_sort_compare_ranges);
+      svn_sort__array(rl, svn_sort_compare_ranges);
     }
   return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/libsvn_subr/sorts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sorts.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sorts.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sorts.c Thu Mar 13 09:59:55 2014
@@ -134,6 +134,14 @@ svn_sort_compare_ranges(const void *a, c
   return item1->start < item2->start ? -1 : 1;
 }
 
+void
+svn_sort__array(apr_array_header_t *array,
+                int (*comparison_func)(const void *,
+                                       const void *))
+{
+  qsort(array->elts, array->nelts, array->elt_size, comparison_func);
+}
+
 apr_array_header_t *
 svn_sort__hash(apr_hash_t *ht,
                int (*comparison_func)(const svn_sort__item_t *,
@@ -172,7 +180,7 @@ svn_sort__hash(apr_hash_t *ht,
 
   /* quicksort the array if it isn't already sorted.  */
   if (!sorted)
-    qsort(ary->elts, ary->nelts, ary->elt_size,
+    svn_sort__array(ary,
           (int (*)(const void *, const void *))comparison_func);
 
   return ary;

Modified: subversion/trunk/subversion/libsvn_wc/revert.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/revert.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/revert.c (original)
+++ subversion/trunk/subversion/libsvn_wc/revert.c Thu Mar 13 09:59:55 2014
@@ -46,6 +46,7 @@
 #include "svn_private_config.h"
 #include "private/svn_io_private.h"
 #include "private/svn_wc_private.h"
+#include "private/svn_sorts_private.h"
 
 /* Thoughts on Reversion.
 
@@ -198,9 +199,7 @@ revert_restore_handle_copied_dirs(svn_bo
    * that still exist on disk (e.g. unversioned files within the copied tree).
    * So sort the children list such that longest paths come first and try to
    * remove each child directory in order. */
-  qsort(copied_children->elts, copied_children->nelts,
-        sizeof(svn_wc__db_revert_list_copied_child_info_t *),
-        compare_revert_list_copied_children);
+  svn_sort__array(copied_children, compare_revert_list_copied_children);
   for (i = 0; i < copied_children->nelts; i++)
     {
       child_info = APR_ARRAY_IDX(

Modified: subversion/trunk/subversion/svndumpfilter/svndumpfilter.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svndumpfilter/svndumpfilter.c?rev=1577079&r1=1577078&r2=1577079&view=diff
==============================================================================
--- subversion/trunk/subversion/svndumpfilter/svndumpfilter.c (original)
+++ subversion/trunk/subversion/svndumpfilter/svndumpfilter.c Thu Mar 13 09:59:55 2014
@@ -45,6 +45,7 @@
 
 #include "private/svn_mergeinfo_private.h"
 #include "private/svn_cmdline_private.h"
+#include "private/svn_sorts_private.h"
 
 #ifdef _WIN32
 typedef apr_status_t (__stdcall *open_fn_t)(apr_file_t **, apr_pool_t *);
@@ -1277,8 +1278,7 @@ do_filter(apr_getopt_t *os,
 
           APR_ARRAY_PUSH(keys, svn_revnum_t) = *revnum;
         }
-      qsort(keys->elts, keys->nelts,
-            keys->elt_size, svn_sort_compare_revisions);
+      svn_sort__array(keys, svn_sort_compare_revisions);
       for (i = 0; i < keys->nelts; i++)
         {
           svn_revnum_t this_key;
@@ -1321,7 +1321,7 @@ do_filter(apr_getopt_t *os,
 
           APR_ARRAY_PUSH(keys, const char *) = path;
         }
-      qsort(keys->elts, keys->nelts, keys->elt_size, svn_sort_compare_paths);
+      svn_sort__array(keys, svn_sort_compare_paths);
       for (i = 0; i < keys->nelts; i++)
         {
           svn_pool_clear(subpool);



Re: svn commit: r1577079 - in /subversion/trunk/subversion: include/private/ libsvn_client/ libsvn_delta/ libsvn_diff/ libsvn_fs_fs/ libsvn_ra/ libsvn_repos/ libsvn_subr/ libsvn_wc/ svndumpfilter/

Posted by Ivan Zhakov <iv...@visualsvn.com>.
On 13 March 2014 14:28, Bert Huijben <be...@qqmail.nl> wrote:
>>
>> +/* Sort APR array @a array using ordering defined by @a comparison_func.
>> + * @a comparison_func is defined as for the C stdlib function qsort().
>> + */
>> +void
>> +svn_sort__array(apr_array_header_t *array,
>> +                int (*comparison_func)(const void *,
>> +                                       const void *));
>
> I think the documentation should note that the array values must be pointers as that is how you pass the comparison function.
>
> There are pretty common cases where we use apr arrays with struct members, instead of pointer to struct. (E.g. for property changes)
>

Why? svn_sort__array() as qsort() invoke ordering callback with a
pointer to array element. It could pointer to pointer if array
contains pointer or pointer to any struct.


-- 
Ivan Zhakov
CTO | VisualSVN | http://www.visualsvn.com

RE: svn commit: r1577079 - in /subversion/trunk/subversion: include/private/ libsvn_client/ libsvn_delta/ libsvn_diff/ libsvn_fs_fs/ libsvn_ra/ libsvn_repos/ libsvn_subr/ libsvn_wc/ svndumpfilter/

Posted by Bert Huijben <be...@qqmail.nl>.

> -----Original Message-----
> From: ivan@apache.org [mailto:ivan@apache.org]
> Sent: donderdag 13 maart 2014 11:00
> To: commits@subversion.apache.org
> Subject: svn commit: r1577079 - in /subversion/trunk/subversion:
> include/private/ libsvn_client/ libsvn_delta/ libsvn_diff/ libsvn_fs_fs/
> libsvn_ra/ libsvn_repos/ libsvn_subr/ libsvn_wc/ svndumpfilter/
> 
> Author: ivan
> Date: Thu Mar 13 09:59:55 2014
> New Revision: 1577079
> 
> URL: http://svn.apache.org/r1577079
> Log:
> Add svn_sort__array() -- simple wrapper around qsort() to sort APR array
> and use where applicable.
> 
> * subversion/include/private/svn_sorts_private.h
>   (svn_sort__array): New declaration.
> 
> * subversion/libsvn_subr/sorts.c
>   (svn_sort__array): New.
> 
> * subversion/libsvn_client/add.c
>   (): Include svn_sorts_private.h.
>   (mkdir_urls): Use svn_sort__array().
> 
> * subversion/libsvn_client/commit.c
>   (): Include svn_sorts_private.h.
>   (determine_lock_targets): Use svn_sort__array().
> 
> * subversion/libsvn_client/commit_util.c
>   (): Remove stdlib.h and include svn_sorts_private.h.
>   (svn_client__condense_commit_items): Use svn_sort__array().
> 
> * subversion/libsvn_client/ra.c
>   (): Include svn_sorts_private.h.
>   (svn_client__repos_location_segments): Use svn_sort__array().
> 
> * subversion/libsvn_client/resolved.c
>   (): Remove stdlib.h and include svn_sorts_private.h.
>   (svn_client__resolve_conflicts): Use svn_sort__array().
> 
> * subversion/libsvn_delta/path_driver.c
>   (): Include svn_sorts_private.h.
>   (svn_delta_path_driver2): Use svn_sort__array().
> 
> * subversion/libsvn_diff/parse-diff.c
>   (): Include svn_sorts_private.h.
>   (svn_diff_parse_next_patch): Use svn_sort__array().
> 
> * subversion/libsvn_fs_fs/cached_data.c
>   (read_dir_entries): Use svn_sort__array().
> 
> * subversion/libsvn_fs_fs/transaction.c
>   (verify_locks): Use svn_sort__array().
> 
> * subversion/libsvn_ra/compat.c
>   (svn_ra__locations_from_log): Use svn_sort__array().
> 
> * subversion/libsvn_repos/log.c
>   (): Include svn_sorts_private.h.
>   (turn_unique_copies_into_moves, combine_mergeinfo_path_lists,
>    handle_merged_revisions): Use svn_sort__array().
> 
> * subversion/libsvn_repos/replay.c
>   (): Include svn_sorts_private.h.
>   (svn_repos__replay_ev2): Use svn_sort__array().
> 
> * subversion/libsvn_repos/rev_hunt.c
>   (): Include svn_sorts_private.h.
>   (find_merged_revisions): Use svn_sort__array().
> 
> * subversion/libsvn_subr/mergeinfo.c
>   (combine_with_lastrange, parse_revision_line, svn_mergeinfo_sort): Use
>    svn_sort__array().
> 
> * subversion/libsvn_wc/revert.c
>   (): Include svn_sorts_private.h.
>   (revert_restore_handle_copied_dirs): Use svn_sort__array().
> 
> * subversion/svndumpfilter/svndumpfilter.c
>   (): Include svn_sorts_private.h.
>   (do_filter): Use svn_sort__array().
> 
> Modified:
>     subversion/trunk/subversion/include/private/svn_sorts_private.h
>     subversion/trunk/subversion/libsvn_client/add.c
>     subversion/trunk/subversion/libsvn_client/commit.c
>     subversion/trunk/subversion/libsvn_client/commit_util.c
>     subversion/trunk/subversion/libsvn_client/ra.c
>     subversion/trunk/subversion/libsvn_client/resolved.c
>     subversion/trunk/subversion/libsvn_delta/path_driver.c
>     subversion/trunk/subversion/libsvn_diff/parse-diff.c
>     subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
>     subversion/trunk/subversion/libsvn_fs_fs/transaction.c
>     subversion/trunk/subversion/libsvn_ra/compat.c
>     subversion/trunk/subversion/libsvn_repos/log.c
>     subversion/trunk/subversion/libsvn_repos/replay.c
>     subversion/trunk/subversion/libsvn_repos/rev_hunt.c
>     subversion/trunk/subversion/libsvn_subr/mergeinfo.c
>     subversion/trunk/subversion/libsvn_subr/sorts.c
>     subversion/trunk/subversion/libsvn_wc/revert.c
>     subversion/trunk/subversion/svndumpfilter/svndumpfilter.c
> 
> Modified: subversion/trunk/subversion/include/private/svn_sorts_private.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private
> /svn_sorts_private.h?rev=1577079&r1=1577078&r2=1577079&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/include/private/svn_sorts_private.h
> (original)
> +++ subversion/trunk/subversion/include/private/svn_sorts_private.h Thu
> Mar 13 09:59:55 2014
> @@ -72,6 +72,14 @@ svn_sort__hash(apr_hash_t *ht,
>                                        const svn_sort__item_t *),
>                 apr_pool_t *pool);
> 
> +/* Sort APR array @a array using ordering defined by @a comparison_func.
> + * @a comparison_func is defined as for the C stdlib function qsort().
> + */
> +void
> +svn_sort__array(apr_array_header_t *array,
> +                int (*comparison_func)(const void *,
> +                                       const void *));

I think the documentation should note that the array values must be pointers as that is how you pass the comparison function.

There are pretty common cases where we use apr arrays with struct members, instead of pointer to struct. (E.g. for property changes)

	Bert