Skip to content

Commit c48f0f2

Browse files
sahitya-chandragitster
authored andcommitted
wt-status: avoid quadratic insertion for untracked paths
wt_status_collect_untracked() copies entries from dir.entries and dir.ignored into string_lists using string_list_insert(). That keeps the destination lists sorted and deduplicated, but each insertion may shift the backing array, making construction O(n^2) in the number of paths. Collect the entries with string_list_append() instead, then sort and deduplicate each list once. This preserves the sorted, duplicate-free result while reducing the construction cost to O(n log n). Signed-off-by: Sahitya Chandra <sahityajb@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent d35c539 commit c48f0f2

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

‎wt-status.c‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -832,14 +832,18 @@ static void wt_status_collect_untracked(struct wt_status *s)
832832
for (i = 0; i < dir.nr; i++) {
833833
struct dir_entry *ent = dir.entries[i];
834834
if (index_name_is_other(istate, ent->name, ent->len))
835-
string_list_insert(&s->untracked, ent->name);
835+
string_list_append(&s->untracked, ent->name);
836836
}
837+
string_list_sort(&s->untracked);
838+
string_list_remove_duplicates(&s->untracked, 0);
837839

838840
for (i = 0; i < dir.ignored_nr; i++) {
839841
struct dir_entry *ent = dir.ignored[i];
840842
if (index_name_is_other(istate, ent->name, ent->len))
841-
string_list_insert(&s->ignored, ent->name);
843+
string_list_append(&s->ignored, ent->name);
842844
}
845+
string_list_sort(&s->ignored);
846+
string_list_remove_duplicates(&s->ignored, 0);
843847

844848
dir_clear(&dir);
845849

0 commit comments

Comments
 (0)