mirror of
https://github.com/git/git.git
synced 2024-10-28 12:59:41 +01:00
merge-recur: use the unpack_trees() interface instead of exec()ing read-tree
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
c1a788acee
commit
7a85b848ad
1 changed files with 52 additions and 28 deletions
|
@ -19,7 +19,7 @@
|
||||||
#include "diffcore.h"
|
#include "diffcore.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
#include "unpack-trees.h"
|
||||||
#include "path-list.h"
|
#include "path-list.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -124,7 +124,7 @@ static int flush_cache(void)
|
||||||
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
|
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
|
||||||
int fd = hold_lock_file_for_update(lock, getenv("GIT_INDEX_FILE"));
|
int fd = hold_lock_file_for_update(lock, getenv("GIT_INDEX_FILE"));
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
die("could not lock %s", temporary_index_file);
|
die("could not lock %s", lock->filename);
|
||||||
if (write_cache(fd, active_cache, active_nr) ||
|
if (write_cache(fd, active_cache, active_nr) ||
|
||||||
close(fd) || commit_lock_file(lock))
|
close(fd) || commit_lock_file(lock))
|
||||||
die ("unable to write %s", getenv("GIT_INDEX_FILE"));
|
die ("unable to write %s", getenv("GIT_INDEX_FILE"));
|
||||||
|
@ -191,41 +191,59 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
|
||||||
*/
|
*/
|
||||||
static int index_only = 0;
|
static int index_only = 0;
|
||||||
|
|
||||||
/*
|
static int git_read_tree(struct tree *tree)
|
||||||
* TODO: this can be streamlined by refactoring builtin-read-tree.c
|
|
||||||
*/
|
|
||||||
static int git_read_tree(const struct tree *tree)
|
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
const char *argv[] = { "git-read-tree", NULL, NULL, };
|
struct object_list *trees = NULL;
|
||||||
|
struct unpack_trees_options opts;
|
||||||
|
|
||||||
if (cache_dirty)
|
if (cache_dirty)
|
||||||
die("read-tree with dirty cache");
|
die("read-tree with dirty cache");
|
||||||
argv[1] = sha1_to_hex(tree->object.sha1);
|
|
||||||
rc = run_command_v(2, argv);
|
memset(&opts, 0, sizeof(opts));
|
||||||
return rc < 0 ? -1: rc;
|
object_list_append(&tree->object, &trees);
|
||||||
|
rc = unpack_trees(trees, &opts);
|
||||||
|
cache_tree_free(&active_cache_tree);
|
||||||
|
|
||||||
|
if (rc == 0)
|
||||||
|
cache_dirty = 1;
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int git_merge_trees(int index_only,
|
||||||
* TODO: this can be streamlined by refactoring builtin-read-tree.c
|
|
||||||
*/
|
|
||||||
static int git_merge_trees(const char *update_arg,
|
|
||||||
struct tree *common,
|
struct tree *common,
|
||||||
struct tree *head,
|
struct tree *head,
|
||||||
struct tree *merge)
|
struct tree *merge)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
const char *argv[] = {
|
struct object_list *trees = NULL;
|
||||||
"git-read-tree", NULL, "-m", NULL, NULL, NULL,
|
struct unpack_trees_options opts;
|
||||||
NULL,
|
|
||||||
};
|
if (!cache_dirty) {
|
||||||
if (cache_dirty)
|
read_cache_from(getenv("GIT_INDEX_FILE"));
|
||||||
flush_cache();
|
cache_dirty = 1;
|
||||||
argv[1] = update_arg;
|
}
|
||||||
argv[3] = sha1_to_hex(common->object.sha1);
|
|
||||||
argv[4] = sha1_to_hex(head->object.sha1);
|
memset(&opts, 0, sizeof(opts));
|
||||||
argv[5] = sha1_to_hex(merge->object.sha1);
|
if (index_only)
|
||||||
rc = run_command_v(6, argv);
|
opts.index_only = 1;
|
||||||
return rc < 0 ? -1: rc;
|
else
|
||||||
|
opts.update = 1;
|
||||||
|
opts.merge = 1;
|
||||||
|
opts.head_idx = 2;
|
||||||
|
opts.fn = threeway_merge;
|
||||||
|
|
||||||
|
object_list_append(&common->object, &trees);
|
||||||
|
object_list_append(&head->object, &trees);
|
||||||
|
object_list_append(&merge->object, &trees);
|
||||||
|
|
||||||
|
rc = unpack_trees(trees, &opts);
|
||||||
|
cache_tree_free(&active_cache_tree);
|
||||||
|
|
||||||
|
cache_dirty = 1;
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -239,8 +257,14 @@ static struct tree *git_write_tree(void)
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
int ch;
|
int ch;
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
if (cache_dirty)
|
if (cache_dirty) {
|
||||||
|
for (i = 0; i < active_nr; i++) {
|
||||||
|
struct cache_entry *ce = active_cache[i];
|
||||||
|
if (ce_stage(ce))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
flush_cache();
|
flush_cache();
|
||||||
|
}
|
||||||
fp = popen("git-write-tree 2>/dev/null", "r");
|
fp = popen("git-write-tree 2>/dev/null", "r");
|
||||||
while ((ch = fgetc(fp)) != EOF)
|
while ((ch = fgetc(fp)) != EOF)
|
||||||
if (i < sizeof(buf)-1 && ch >= '0' && ch <= 'f')
|
if (i < sizeof(buf)-1 && ch >= '0' && ch <= 'f')
|
||||||
|
@ -1121,7 +1145,7 @@ static int merge_trees(struct tree *head,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = git_merge_trees(index_only ? "-i": "-u", common, head, merge);
|
code = git_merge_trees(index_only, common, head, merge);
|
||||||
|
|
||||||
if (code != 0)
|
if (code != 0)
|
||||||
die("merging of trees %s and %s failed",
|
die("merging of trees %s and %s failed",
|
||||||
|
|
Loading…
Reference in a new issue