summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorJaime Soriano Pastor <jsorianopastor@gmail.com>2014-08-29 08:54:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-08-29 17:05:14 (GMT)
commit15999d0be8179fb7a2e6eafb931d25ed65df50aa (patch)
tree0b83f9709af847397e90d505c774b97397d523d4 /read-cache.c
parent32f56600bb6ac6fc57183e79d2c1515dfa56672f (diff)
downloadgit-15999d0be8179fb7a2e6eafb931d25ed65df50aa.zip
git-15999d0be8179fb7a2e6eafb931d25ed65df50aa.tar.gz
git-15999d0be8179fb7a2e6eafb931d25ed65df50aa.tar.bz2
read_index_from(): catch out of order entries when reading an index file
Signed-off-by: Jaime Soriano Pastor <jsorianopastor@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c
index 7f5645e..22b0add 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1438,6 +1438,21 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk,
return ce;
}
+static void check_ce_order(struct cache_entry *ce, struct cache_entry *next_ce)
+{
+ int name_compare = strcmp(ce->name, next_ce->name);
+ if (0 < name_compare)
+ die("unordered stage entries in index");
+ if (!name_compare) {
+ if (!ce_stage(ce))
+ die("multiple stage entries for merged file '%s'",
+ ce->name);
+ if (ce_stage(ce) > ce_stage(next_ce))
+ die("unordered stage entries for '%s'",
+ ce->name);
+ }
+}
+
/* remember to discard_cache() before reading a different cache! */
int read_index_from(struct index_state *istate, const char *path)
{
@@ -1499,6 +1514,9 @@ int read_index_from(struct index_state *istate, const char *path)
ce = create_from_disk(disk_ce, &consumed, previous_name);
set_index_entry(istate, i, ce);
+ if (i > 0)
+ check_ce_order(istate->cache[i - 1], ce);
+
src_offset += consumed;
}
strbuf_release(&previous_name_buf);