コード例 #1
0
ファイル: merge-recursive.c プロジェクト: emk/git
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;
}
コード例 #2
0
ファイル: merge-recursive.c プロジェクト: asukaliy/seafile
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;
}