Skip to content

Commit 1850c99

Browse files
author
Vicent Marti
committed
Merge pull request libgit2#3550 from libgit2/vmg/index-fill-2
Index fill: Small fixups
2 parents 4baf2d8 + ef8b7fe commit 1850c99

File tree

4 files changed

+32
-14
lines changed

4 files changed

+32
-14
lines changed

src/idxmap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ static kh_inline khint_t idxentry_hash(const git_index_entry *e)
7070
#define git_idxmap_valid_index(h, idx) (idx != kh_end(h))
7171
#define git_idxmap_has_data(h, idx) kh_exist(h, idx)
7272

73+
#define git_idxmap_resize(h,s) kh_resize(idx, h, s)
7374
#define git_idxmap_free(h) kh_destroy(idx, h), h = NULL
7475
#define git_idxmap_clear(h) kh_clear(idx, h)
7576

src/index.c

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,18 @@ void git_index_entry__init_from_stat(
879879
entry->file_size = st->st_size;
880880
}
881881

882+
static void index_entry_adjust_namemask(
883+
git_index_entry *entry,
884+
size_t path_length)
885+
{
886+
entry->flags &= ~GIT_IDXENTRY_NAMEMASK;
887+
888+
if (path_length < GIT_IDXENTRY_NAMEMASK)
889+
entry->flags |= path_length & GIT_IDXENTRY_NAMEMASK;
890+
else
891+
entry->flags |= GIT_IDXENTRY_NAMEMASK;
892+
}
893+
882894
static int index_entry_create(
883895
git_index_entry **out,
884896
git_repository *repo,
@@ -1279,13 +1291,7 @@ static int index_insert(
12791291

12801292
/* make sure that the path length flag is correct */
12811293
path_length = ((struct entry_internal *)entry)->pathlen;
1282-
1283-
entry->flags &= ~GIT_IDXENTRY_NAMEMASK;
1284-
1285-
if (path_length < GIT_IDXENTRY_NAMEMASK)
1286-
entry->flags |= path_length & GIT_IDXENTRY_NAMEMASK;
1287-
else
1288-
entry->flags |= GIT_IDXENTRY_NAMEMASK;
1294+
index_entry_adjust_namemask(entry, path_length);
12891295

12901296
/* this entry is now up-to-date and should not be checked for raciness */
12911297
entry->flags_extended |= GIT_IDXENTRY_UPTODATE;
@@ -1550,21 +1556,28 @@ int git_index__fill(git_index *index, const git_vector *source_entries)
15501556

15511557
assert(index);
15521558

1559+
if (!source_entries->length)
1560+
return 0;
1561+
15531562
if (git_mutex_lock(&index->lock) < 0) {
15541563
giterr_set(GITERR_OS, "Unable to acquire index lock");
15551564
return -1;
15561565
}
15571566

1567+
git_vector_size_hint(&index->entries, source_entries->length);
1568+
git_idxmap_resize(index->entries_map, source_entries->length * 1.3);
1569+
15581570
git_vector_foreach(source_entries, i, source_entry) {
15591571
git_index_entry *entry = NULL;
15601572

15611573
if ((ret = index_entry_dup(&entry, index, source_entry)) < 0)
15621574
break;
15631575

1576+
index_entry_adjust_namemask(entry, ((struct entry_internal *)entry)->pathlen);
15641577
entry->flags_extended |= GIT_IDXENTRY_UPTODATE;
1578+
entry->mode = git_index__create_mode(entry->mode);
15651579

1566-
ret = git_vector_insert(&index->entries, entry);
1567-
if (ret < 0)
1580+
if ((ret = git_vector_insert(&index->entries, entry)) < 0)
15681581
break;
15691582

15701583
INSERT_IN_MAP(index, entry, ret);
@@ -2889,11 +2902,7 @@ static int read_tree_cb(
28892902
entry->flags_extended = 0;
28902903
}
28912904

2892-
if (path.size < GIT_IDXENTRY_NAMEMASK)
2893-
entry->flags = path.size & GIT_IDXENTRY_NAMEMASK;
2894-
else
2895-
entry->flags = GIT_IDXENTRY_NAMEMASK;
2896-
2905+
index_entry_adjust_namemask(entry, path.size);
28972906
git_buf_free(&path);
28982907

28992908
if (git_vector_insert(data->new_entries, entry) < 0) {

src/vector.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ GIT_INLINE(int) resize_vector(git_vector *v, size_t new_size)
4040
return 0;
4141
}
4242

43+
int git_vector_size_hint(git_vector *v, size_t size_hint)
44+
{
45+
if (v->_alloc_size >= size_hint)
46+
return 0;
47+
return resize_vector(v, size_hint);
48+
}
49+
4350
int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp)
4451
{
4552
size_t bytes;

src/vector.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void git_vector_free_deep(git_vector *v); /* free each entry and self */
3232
void git_vector_clear(git_vector *v);
3333
int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp);
3434
void git_vector_swap(git_vector *a, git_vector *b);
35+
int git_vector_size_hint(git_vector *v, size_t size_hint);
3536

3637
void **git_vector_detach(size_t *size, size_t *asize, git_vector *v);
3738

0 commit comments

Comments
 (0)