X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=merge.c;h=e30e03fb84a7677520d208a5688bb7170c22bf8e;hb=4a1ab0f3898633edd60f3f3ca31d09ae46d63029;hp=74ced7f70b5beec045c134b5719c926fc791f1e2;hpb=5ff6a8462f7461075fb39cd0d6d76e6c51ffbc9f;p=platform%2Fupstream%2Fgit.git diff --git a/merge.c b/merge.c index 74ced7f..e30e03f 100644 --- a/merge.c +++ b/merge.c @@ -1,4 +1,7 @@ #include "cache.h" +#include "diff.h" +#include "diffcore.h" +#include "lockfile.h" #include "commit.h" #include "run-command.h" #include "resolve-undo.h" @@ -8,10 +11,7 @@ static const char *merge_argument(struct commit *commit) { - if (commit) - return sha1_to_hex(commit->object.sha1); - else - return EMPTY_TREE_SHA1_HEX; + return oid_to_hex(commit ? &commit->object.oid : the_hash_algo->empty_tree); } int try_merge_command(const char *strategy, size_t xopts_nr, @@ -43,8 +43,8 @@ int try_merge_command(const char *strategy, size_t xopts_nr, return ret; } -int checkout_fast_forward(const unsigned char *head, - const unsigned char *remote, +int checkout_fast_forward(const struct object_id *head, + const struct object_id *remote, int overwrite_ignore) { struct tree *trees[MAX_UNPACK_TREES]; @@ -52,15 +52,32 @@ int checkout_fast_forward(const unsigned char *head, struct tree_desc t[MAX_UNPACK_TREES]; int i, nr_trees = 0; struct dir_struct dir; - struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); + struct lock_file lock_file = LOCK_INIT; refresh_cache(REFRESH_QUIET); - hold_locked_index(lock_file, 1); + if (hold_locked_index(&lock_file, LOCK_REPORT_ON_ERROR) < 0) + return -1; memset(&trees, 0, sizeof(trees)); - memset(&opts, 0, sizeof(opts)); memset(&t, 0, sizeof(t)); + + trees[nr_trees] = parse_tree_indirect(head); + if (!trees[nr_trees++]) { + rollback_lock_file(&lock_file); + return -1; + } + trees[nr_trees] = parse_tree_indirect(remote); + if (!trees[nr_trees++]) { + rollback_lock_file(&lock_file); + return -1; + } + for (i = 0; i < nr_trees; i++) { + parse_tree(trees[i]); + init_tree_desc(t+i, trees[i]->buffer, trees[i]->size); + } + + memset(&opts, 0, sizeof(opts)); if (overwrite_ignore) { memset(&dir, 0, sizeof(dir)); dir.flags |= DIR_SHOW_IGNORED; @@ -77,19 +94,14 @@ int checkout_fast_forward(const unsigned char *head, opts.fn = twoway_merge; setup_unpack_trees_porcelain(&opts, "merge"); - trees[nr_trees] = parse_tree_indirect(head); - if (!trees[nr_trees++]) - return -1; - trees[nr_trees] = parse_tree_indirect(remote); - if (!trees[nr_trees++]) + if (unpack_trees(nr_trees, t, &opts)) { + rollback_lock_file(&lock_file); + clear_unpack_trees_porcelain(&opts); return -1; - for (i = 0; i < nr_trees; i++) { - parse_tree(trees[i]); - init_tree_desc(t+i, trees[i]->buffer, trees[i]->size); } - if (unpack_trees(nr_trees, t, &opts)) - return -1; - if (write_locked_index(&the_index, lock_file, COMMIT_LOCK)) - die(_("unable to write new index file")); + clear_unpack_trees_porcelain(&opts); + + if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) + return error(_("unable to write new index file")); return 0; }