aboutsummaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2012-04-10 07:30:25 +0200
committerJunio C Hamano <gitster@pobox.com>2012-04-10 15:55:50 -0700
commit81a79d8e27f6dd5908ae9ba122833574b7475151 (patch)
treeb82edb063aeaf2c796413cdee546de940bf46c22 /refs.c
parentd3177275ed8e7dcb258a4496bf7b9317edfb9700 (diff)
downloadgit-81a79d8e27f6dd5908ae9ba122833574b7475151.tar.gz
git-81a79d8e27f6dd5908ae9ba122833574b7475151.tar.xz
sort_ref_dir(): simplify logic
Use the more usual indexing idiom for clarity. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/refs.c b/refs.c
index 4e0cfb2af..91f022593 100644
--- a/refs.c
+++ b/refs.c
@@ -227,11 +227,13 @@ static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2
}
/*
- * Sort the entries in dir (if they are not already sorted).
+ * Sort the entries in dir (if they are not already sorted)
+ * and remove any duplicate entries.
*/
static void sort_ref_dir(struct ref_dir *dir)
{
int i, j;
+ struct ref_entry *last = NULL;
/*
* This check also prevents passing a zero-length array to qsort(),
@@ -242,16 +244,15 @@ static void sort_ref_dir(struct ref_dir *dir)
qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
- /* Remove any duplicates from the ref_dir */
- i = 0;
- for (j = 1; j < dir->nr; j++) {
- if (is_dup_ref(dir->entries[i], dir->entries[j])) {
- free_ref_entry(dir->entries[j]);
- continue;
- }
- dir->entries[++i] = dir->entries[j];
+ /* Remove any duplicates: */
+ for (i = 0, j = 0; j < dir->nr; j++) {
+ struct ref_entry *entry = dir->entries[j];
+ if (last && is_dup_ref(last, entry))
+ free_ref_entry(entry);
+ else
+ last = dir->entries[i++] = entry;
}
- dir->sorted = dir->nr = i + 1;
+ dir->sorted = dir->nr = i;
}
#define DO_FOR_EACH_INCLUDE_BROKEN 01