Skip to content

Commit 6f7ec72

Browse files
author
Edward Thomson
committed
index: refactor common read_index functionality
Most of `git_index_read_index` is common to reading any iterator. Refactor it out in case we want to implement `read_tree` in terms of it in the future.
1 parent 59a0005 commit 6f7ec72

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

src/index.c

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,38 +2925,38 @@ int git_index_read_tree(git_index *index, const git_tree *tree)
29252925
return error;
29262926
}
29272927

2928-
int git_index_read_index(
2928+
static int git_index_read_iterator(
29292929
git_index *index,
2930-
const git_index *new_index)
2930+
git_iterator *new_iterator,
2931+
size_t new_length_hint)
29312932
{
29322933
git_vector new_entries = GIT_VECTOR_INIT,
29332934
remove_entries = GIT_VECTOR_INIT;
29342935
git_idxmap *new_entries_map = NULL;
29352936
git_iterator *index_iterator = NULL;
2936-
git_iterator *new_iterator = NULL;
29372937
git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT;
29382938
const git_index_entry *old_entry, *new_entry;
29392939
git_index_entry *entry;
29402940
size_t i;
29412941
int error;
29422942

2943-
if ((error = git_vector_init(&new_entries, new_index->entries.length, index->entries._cmp)) < 0 ||
2943+
assert((new_iterator->flags & GIT_ITERATOR_DONT_IGNORE_CASE));
2944+
2945+
if ((error = git_vector_init(&new_entries, new_length_hint, index->entries._cmp)) < 0 ||
29442946
(error = git_vector_init(&remove_entries, index->entries.length, NULL)) < 0 ||
29452947
(error = git_idxmap_alloc(&new_entries_map)) < 0)
29462948
goto done;
29472949

2948-
if (index->ignore_case)
2949-
kh_resize(idxicase, (khash_t(idxicase) *) new_entries_map, new_index->entries.length);
2950-
else
2951-
kh_resize(idx, new_entries_map, new_index->entries.length);
2950+
if (index->ignore_case && new_length_hint)
2951+
kh_resize(idxicase, (khash_t(idxicase) *) new_entries_map, new_length_hint);
2952+
else if (new_length_hint)
2953+
kh_resize(idx, new_entries_map, new_length_hint);
29522954

29532955
opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
29542956

2955-
if ((error = git_iterator_for_index(&index_iterator, git_index_owner(index), index, &opts)) < 0 ||
2956-
(error = git_iterator_for_index(&new_iterator, git_index_owner(new_index), (git_index *)new_index, &opts)) < 0)
2957-
goto done;
2958-
2959-
if (((error = git_iterator_current(&old_entry, index_iterator)) < 0 &&
2957+
if ((error = git_iterator_for_index(&index_iterator,
2958+
git_index_owner(index), index, &opts)) < 0 ||
2959+
((error = git_iterator_current(&old_entry, index_iterator)) < 0 &&
29602960
error != GIT_ITEROVER) ||
29612961
((error = git_iterator_current(&new_entry, new_iterator)) < 0 &&
29622962
error != GIT_ITEROVER))
@@ -3050,13 +3050,36 @@ int git_index_read_index(
30503050
index_entry_free(entry);
30513051
}
30523052

3053+
clear_uptodate(index);
3054+
30533055
error = 0;
30543056

30553057
done:
30563058
git_idxmap_free(new_entries_map);
30573059
git_vector_free(&new_entries);
30583060
git_vector_free(&remove_entries);
30593061
git_iterator_free(index_iterator);
3062+
return error;
3063+
}
3064+
3065+
int git_index_read_index(
3066+
git_index *index,
3067+
const git_index *new_index)
3068+
{
3069+
git_iterator *new_iterator = NULL;
3070+
git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT;
3071+
int error;
3072+
3073+
opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
3074+
3075+
if ((error = git_iterator_for_index(&new_iterator,
3076+
git_index_owner(new_index), (git_index *)new_index, &opts)) < 0)
3077+
goto done;
3078+
3079+
error = git_index_read_iterator(index, new_iterator,
3080+
new_index->entries.length);
3081+
3082+
done:
30603083
git_iterator_free(new_iterator);
30613084
return error;
30623085
}

0 commit comments

Comments
 (0)