/* * The merge_rr list is meant to hold outstanding conflicted paths * that rerere could handle. Abuse the list by adding other types of * entries to allow the caller to show "rerere remaining". * * - Conflicted paths that rerere does not handle are added * - Conflicted paths that have been resolved are marked as such * by storing RERERE_RESOLVED to .util field (where conflict ID * is expected to be stored). * * Do *not* write MERGE_RR file out after calling this function. * * NEEDSWORK: we may want to fix the caller that implements "rerere * remaining" to do this without abusing merge_rr. */ int rerere_remaining(struct string_list *merge_rr) { int i; if (setup_rerere(merge_rr, RERERE_READONLY)) return 0; if (read_cache() < 0) return error(_("index file corrupt")); for (i = 0; i < active_nr;) { int conflict_type; const struct cache_entry *e = active_cache[i]; i = check_one_conflict(i, &conflict_type); if (conflict_type == PUNTED) string_list_insert(merge_rr, (const char *)e->name); else if (conflict_type == RESOLVED) { struct string_list_item *it; it = string_list_lookup(merge_rr, (const char *)e->name); if (it != NULL) { free_rerere_id(it); it->util = RERERE_RESOLVED; } } } return 0; }
/* * Scan the index and find paths that have conflicts that rerere can * handle, i.e. the ones that has both stages #2 and #3. * * NEEDSWORK: we do not record or replay a previous "resolve by * deletion" for a delete-modify conflict, as that is inherently risky * without knowing what modification is being discarded. The only * safe case, i.e. both side doing the deletion and modification that * are identical to the previous round, might want to be handled, * though. */ static int find_conflict(struct string_list *conflict) { int i; if (read_cache() < 0) return error(_("index file corrupt")); for (i = 0; i < active_nr;) { int conflict_type; const struct cache_entry *e = active_cache[i]; i = check_one_conflict(i, &conflict_type); if (conflict_type == THREE_STAGED) string_list_insert(conflict, (const char *)e->name); } return 0; }
/* * Scan the index and find paths that have conflicts that rerere can * handle, i.e. the ones that has both stages #2 and #3. * * NEEDSWORK: we do not record or replay a previous "resolve by * deletion" for a delete-modify conflict, as that is inherently risky * without knowing what modification is being discarded. The only * safe case, i.e. both side doing the deletion and modification that * are identical to the previous round, might want to be handled, * though. */ static int find_conflict(struct repository *r, struct string_list *conflict) { int i; if (repo_read_index(r) < 0) return error(_("index file corrupt")); for (i = 0; i < r->index->cache_nr;) { int conflict_type; const struct cache_entry *e = r->index->cache[i]; i = check_one_conflict(r->index, i, &conflict_type); if (conflict_type == THREE_STAGED) string_list_insert(conflict, (const char *)e->name); } return 0; }
int rerere_remaining(struct string_list *merge_rr) { int i; if (read_cache() < 0) return error("Could not read index"); for (i = 0; i < active_nr;) { int conflict_type; struct cache_entry *e = active_cache[i]; i = check_one_conflict(i, &conflict_type); if (conflict_type == PUNTED) string_list_insert(merge_rr, (const char *)e->name); else if (conflict_type == RESOLVED) { struct string_list_item *it; it = string_list_lookup(merge_rr, (const char *)e->name); if (it != NULL) { free(it->util); it->util = RERERE_RESOLVED; } } } return 0; }