diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 12:05:45 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 12:05:45 -0700 |
commit | 7b937ca33142ff5ecc655f2be61678a512352122 (patch) | |
tree | cf88c1fea1b31ac3c7a9606681672c64d4140b79 /read-cache.c | |
parent | 43f91266a493c4888b4ff2a7997ccc4a381e7238 (diff) | |
download | git-7b937ca33142ff5ecc655f2be61678a512352122.tar.gz |
When inserting a index entry of stage 0, remove all old unmerged entries.
This allows you to actually tell git that you've resolved a conflict.
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/read-cache.c b/read-cache.c index acc6e236d3..5b4ab03d27 100644 --- a/read-cache.c +++ b/read-cache.c @@ -355,17 +355,30 @@ int cache_name_pos(const char *name, int namelen) return -first-1; } +/* Remove entry, return true if there are more entries to go.. */ +static int remove_entry_at(int pos) +{ + active_nr--; + if (pos >= active_nr) + return 0; + memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos) * sizeof(struct cache_entry *)); + return 1; +} + int remove_file_from_cache(char *path) { int pos = cache_name_pos(path, strlen(path)); - if (pos >= 0) { - active_nr--; - if (pos < active_nr) - memmove(active_cache + pos, active_cache + pos + 1, (active_nr - pos) * sizeof(struct cache_entry *)); - } + if (pos >= 0) + remove_entry_at(pos); return 0; } +static int same_name(struct cache_entry *a, struct cache_entry *b) +{ + int len = ce_namelen(a); + return ce_namelen(b) == len && !memcmp(a->name, b->name, len); +} + int add_cache_entry(struct cache_entry *ce, int ok_to_add) { int pos; @@ -379,6 +392,19 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add) } pos = -pos-1; + /* + * Inserting a merged entry ("stage 0") into the index + * will always replace all non-merged entries.. + */ + if (pos < active_nr && ce_stage(ce) == 0) { + while (same_name(active_cache[pos], ce)) { + ok_to_add = 1; + active_nr--; + if (!remove_entry_at(pos)) + break; + } + } + if (!ok_to_add) return -1; |