int merge_trees(struct merge_options *o, struct tree *head, struct tree *merge, struct tree *common, struct tree **result) { int code, clean; if (o->subtree_merge) { merge = shift_tree_object(head, merge); common = shift_tree_object(head, common); } if (sha_eq(common->object.sha1, merge->object.sha1)) { output(o, 0, "Already uptodate!"); *result = head; return 1; } code = git_merge_trees(o->call_depth, common, head, merge); if (code != 0) die("merging of trees %s and %s failed", sha1_to_hex(head->object.sha1), sha1_to_hex(merge->object.sha1)); if (unmerged_cache()) { struct string_list *entries, *re_head, *re_merge; int i; string_list_clear(&o->current_file_set, 1); string_list_clear(&o->current_directory_set, 1); get_files_dirs(o, head); get_files_dirs(o, merge); entries = get_unmerged(); re_head = get_renames(o, head, common, head, merge, entries); re_merge = get_renames(o, merge, common, head, merge, entries); clean = process_renames(o, re_head, re_merge); for (i = 0; i < entries->nr; i++) { const char *path = entries->items[i].string; struct stage_data *e = entries->items[i].util; if (!e->processed && !process_entry(o, path, e)) clean = 0; } string_list_clear(re_merge, 0); string_list_clear(re_head, 0); string_list_clear(entries, 1); } else clean = 1; if (o->call_depth) *result = write_tree_from_memory(o); return clean; }
static int process_unmerged_entries (struct merge_options *o, SeafDir *head, SeafDir *merge) { int clean = 1; if (unmerged_index(o->index)) { GList *entries, *p; g_hash_table_remove_all(o->current_file_set); g_hash_table_remove_all(o->current_directory_set); get_files_dirs(o, head); get_files_dirs(o, merge); entries = get_unmerged(o->index); /* We don't want to remove any existing file. */ /* make_room_for_directories_of_df_conflicts(o, entries); */ for (p = entries; p != NULL; p = p->next) { struct stage_data *e = p->data; if (!e->processed && !process_entry(o, e->path, e)) clean = 0; } for (p = entries; p != NULL; p = p->next) { struct stage_data *e = p->data; if (!e->processed && !process_df_entry(o, e->path, e)) clean = 0; } for (p = entries; p != NULL; p = p->next) { struct stage_data *e = p->data; if (!e->processed) { g_warning("Unprocessed path??? %s", e->path); return 0; } g_free(e->path); free(e); } g_list_free(entries); } return clean; }