diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2016-11-24 18:45:36 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-11-28 15:30:17 -0800 |
commit | fa6ca11105ccb46b785fd4ed58c333d5ad7f1774 (patch) | |
tree | 12367cdeb454f55591ec88b59f91e53a7c62e529 /merge-recursive.c | |
parent | ac84098b7e32406a982ac01cc76a663d5605224b (diff) | |
download | git-fa6ca11105ccb46b785fd4ed58c333d5ad7f1774.tar.gz |
merge-recursive.c: use string_list_sort instead of qsortnd/qsort-in-merge-recursive
Merge-recursive sorts a string list using a raw qsort(), where it
feeds the "items" from one struct but the "nr" and size fields from
another struct. This isn't a bug because one list is a copy of the
other, but it's unnecessarily confusing (and also caused our recent
QSORT() cleanups via coccinelle to miss this call site).
Let's use string_list_sort() instead, which is more concise and harder
to get wrong. Note that we need to adjust our comparison function,
which gets fed only the strings now, not the string_list_items. That's
OK because we don't use the "util" field as part of our sort.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-recursive.c')
-rw-r--r-- | merge-recursive.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/merge-recursive.c b/merge-recursive.c index aa92e30f63..6802d86c14 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -388,12 +388,10 @@ static struct string_list *get_unmerged(void) return unmerged; } -static int string_list_df_name_compare(const void *a, const void *b) +static int string_list_df_name_compare(const char *one, const char *two) { - const struct string_list_item *one = a; - const struct string_list_item *two = b; - int onelen = strlen(one->string); - int twolen = strlen(two->string); + int onelen = strlen(one); + int twolen = strlen(two); /* * Here we only care that entries for D/F conflicts are * adjacent, in particular with the file of the D/F conflict @@ -406,8 +404,8 @@ static int string_list_df_name_compare(const void *a, const void *b) * since in other cases any changes in their order due to * sorting cause no problems for us. */ - int cmp = df_name_compare(one->string, onelen, S_IFDIR, - two->string, twolen, S_IFDIR); + int cmp = df_name_compare(one, onelen, S_IFDIR, + two, twolen, S_IFDIR); /* * Now that 'foo' and 'foo/bar' compare equal, we have to make sure * that 'foo' comes before 'foo/bar'. @@ -451,8 +449,8 @@ static void record_df_conflict_files(struct merge_options *o, string_list_append(&df_sorted_entries, next->string)->util = next->util; } - qsort(df_sorted_entries.items, entries->nr, sizeof(*entries->items), - string_list_df_name_compare); + df_sorted_entries.cmp = string_list_df_name_compare; + string_list_sort(&df_sorted_entries); string_list_clear(&o->df_conflict_file_set, 1); for (i = 0; i < df_sorted_entries.nr; i++) { |