summaryrefslogtreecommitdiff
path: root/git-compat-util.h
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2019-10-09 14:00:59 +0900
committerLibravatar Junio C Hamano <gitster@pobox.com>2019-10-09 14:00:59 +0900
commit772cad0afb834b9af8ee56511dc3df4d6e2f011d (patch)
treebf4f9f9be0c01cfb4b4adb41dfda0ccb3fc1ba99 /git-compat-util.h
parentMerge branch 'js/mingw-spawn-with-spaces-in-path' (diff)
parentdiffcore_rename(): use a stable sort (diff)
downloadtgif-772cad0afb834b9af8ee56511dc3df4d6e2f011d.tar.xz
Merge branch 'js/diff-rename-force-stable-sort'
The rename detection logic sorts a list of rename source candidates by similarity to pick the best candidate, which means that a tie between sources with the same similarity is broken by the original location in the original candidate list (which is sorted by path). Force the sorting by similarity done with a stable sort, which is not promised by system supplied qsort(3), to ensure consistent results across platforms. * js/diff-rename-force-stable-sort: diffcore_rename(): use a stable sort Move git_sort(), a stable sort, into into libgit.a
Diffstat (limited to 'git-compat-util.h')
-rw-r--r--git-compat-util.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/git-compat-util.h b/git-compat-util.h
index d2e884e46a..a8b5854e27 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1092,10 +1092,10 @@ static inline int strtol_i(char const *s, int base, int *result)
return 0;
}
+void git_stable_qsort(void *base, size_t nmemb, size_t size,
+ int(*compar)(const void *, const void *));
#ifdef INTERNAL_QSORT
-void git_qsort(void *base, size_t nmemb, size_t size,
- int(*compar)(const void *, const void *));
-#define qsort git_qsort
+#define qsort git_stable_qsort
#endif
#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar)
@@ -1106,6 +1106,9 @@ static inline void sane_qsort(void *base, size_t nmemb, size_t size,
qsort(base, nmemb, size, compar);
}
+#define STABLE_QSORT(base, n, compar) \
+ git_stable_qsort((base), (n), sizeof(*(base)), compar)
+
#ifndef HAVE_ISO_QSORT_S
int git_qsort_s(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *, void *), void *ctx);