Skip to content

Commit b3c96fb

Browse files
pcloudsgitster
authored andcommitted
split-index: strip pathname of on-disk replaced entries
We know the positions of replaced entries via the replace bitmap in "link" extension, so the "name" path does not have to be stored (it's still in the shared index). With this, we also have a way to distinguish additions vs replacements at load time and can catch broken "link" extensions. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent ce7c614 commit b3c96fb

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

cache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ struct cache_entry {
170170
#define CE_MATCHED (1 << 26)
171171

172172
#define CE_UPDATE_IN_BASE (1 << 27)
173+
#define CE_STRIP_NAME (1 << 28)
173174

174175
/*
175176
* Extended on-disk flags

read-cache.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,9 +1787,15 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce,
17871787
{
17881788
int size;
17891789
struct ondisk_cache_entry *ondisk;
1790+
int saved_namelen = saved_namelen; /* compiler workaround */
17901791
char *name;
17911792
int result;
17921793

1794+
if (ce->ce_flags & CE_STRIP_NAME) {
1795+
saved_namelen = ce_namelen(ce);
1796+
ce->ce_namelen = 0;
1797+
}
1798+
17931799
if (!previous_name) {
17941800
size = ondisk_ce_size(ce);
17951801
ondisk = xcalloc(1, size);
@@ -1821,6 +1827,10 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce,
18211827
strbuf_splice(previous_name, common, to_remove,
18221828
ce->name + common, ce_namelen(ce) - common);
18231829
}
1830+
if (ce->ce_flags & CE_STRIP_NAME) {
1831+
ce->ce_namelen = saved_namelen;
1832+
ce->ce_flags &= ~CE_STRIP_NAME;
1833+
}
18241834

18251835
result = ce_write(c, fd, ondisk, size);
18261836
free(ondisk);

split-index.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ static void replace_entry(size_t pos, void *data)
8989
struct index_state *istate = data;
9090
struct split_index *si = istate->split_index;
9191
struct cache_entry *dst, *src;
92+
9293
if (pos >= istate->cache_nr)
9394
die("position for replacement %d exceeds base index size %d",
9495
(int)pos, istate->cache_nr);
@@ -100,10 +101,14 @@ static void replace_entry(size_t pos, void *data)
100101
die("entry %d is marked as both replaced and deleted",
101102
(int)pos);
102103
src = si->saved_cache[si->nr_replacements];
104+
if (ce_namelen(src))
105+
die("corrupt link extension, entry %d should have "
106+
"zero length name", (int)pos);
103107
src->index = pos + 1;
104108
src->ce_flags |= CE_UPDATE_IN_BASE;
105-
free(dst);
106-
dst = src;
109+
src->ce_namelen = dst->ce_namelen;
110+
copy_cache_entry(dst, src);
111+
free(src);
107112
si->nr_replacements++;
108113
}
109114

@@ -131,6 +136,9 @@ void merge_base_index(struct index_state *istate)
131136
remove_marked_cache_entries(istate);
132137

133138
for (i = si->nr_replacements; i < si->saved_cache_nr; i++) {
139+
if (!ce_namelen(si->saved_cache[i]))
140+
die("corrupt link extension, entry %d should "
141+
"have non-zero length name", i);
134142
add_index_entry(istate, si->saved_cache[i],
135143
ADD_CACHE_OK_TO_ADD |
136144
ADD_CACHE_KEEP_CACHE_TREE |
@@ -213,6 +221,7 @@ void prepare_to_write_split_index(struct index_state *istate)
213221
ewah_set(si->delete_bitmap, i);
214222
else if (ce->ce_flags & CE_UPDATE_IN_BASE) {
215223
ewah_set(si->replace_bitmap, i);
224+
ce->ce_flags |= CE_STRIP_NAME;
216225
ALLOC_GROW(entries, nr_entries+1, nr_alloc);
217226
entries[nr_entries++] = ce;
218227
}
@@ -222,6 +231,7 @@ void prepare_to_write_split_index(struct index_state *istate)
222231
for (i = 0; i < istate->cache_nr; i++) {
223232
ce = istate->cache[i];
224233
if ((!si->base || !ce->index) && !(ce->ce_flags & CE_REMOVE)) {
234+
assert(!(ce->ce_flags & CE_STRIP_NAME));
225235
ALLOC_GROW(entries, nr_entries+1, nr_alloc);
226236
entries[nr_entries++] = ce;
227237
}

0 commit comments

Comments
 (0)