summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7efeb8f)
raw | patch | inline | side by side (parent: 7efeb8f)
author | Linus Torvalds <torvalds@linux-foundation.org> | |
Fri, 10 Aug 2007 05:21:29 +0000 (22:21 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Fri, 10 Aug 2007 09:30:44 +0000 (02:30 -0700) |
This doesn't actually change any real code, but it changes the interface
to unpack_trees() to take an array of "struct tree_desc" entries, the same
way the tree-walk.c functions do.
The reason for this is that we would be much better off if we can do the
tree-unpacking using the generic "traverse_trees()" functionality instead
of having to the special "unpack" infrastructure.
This really is a pretty minimal diff, just to change the calling
convention. It passes all the tests, and looks sane. There were only two
users of "unpack_trees()": builtin-read-tree and merge-recursive, and I
tried to keep the changes minimal.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
to unpack_trees() to take an array of "struct tree_desc" entries, the same
way the tree-walk.c functions do.
The reason for this is that we would be much better off if we can do the
tree-unpacking using the generic "traverse_trees()" functionality instead
of having to the special "unpack" infrastructure.
This really is a pretty minimal diff, just to change the calling
convention. It passes all the tests, and looks sane. There were only two
users of "unpack_trees()": builtin-read-tree and merge-recursive, and I
tried to keep the changes minimal.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-read-tree.c | patch | blob | history | |
merge-recursive.c | patch | blob | history | |
unpack-trees.c | patch | blob | history | |
unpack-trees.h | patch | blob | history |
diff --git a/builtin-read-tree.c b/builtin-read-tree.c
index a3b17a3bd913d628d70ee625ec8b1808d3b200fa..1967d100f28d70e588fde618aa7ed4a10b76ee1d 100644 (file)
--- a/builtin-read-tree.c
+++ b/builtin-read-tree.c
#include "dir.h"
#include "builtin.h"
-static struct object_list *trees;
+static int nr_trees;
+static struct tree *trees[4];
static int list_tree(unsigned char *sha1)
{
- struct tree *tree = parse_tree_indirect(sha1);
+ struct tree *tree;
+
+ if (nr_trees >= 4)
+ return -1;
+ tree = parse_tree_indirect(sha1);
if (!tree)
return -1;
- object_list_append(&tree->object, &trees);
+ trees[nr_trees++] = tree;
return 0;
}
static void prime_cache_tree(void)
{
- struct tree *tree = (struct tree *)trees->item;
- if (!tree)
+ if (!nr_trees)
return;
active_cache_tree = cache_tree();
- prime_cache_tree_rec(active_cache_tree, tree);
+ prime_cache_tree_rec(active_cache_tree, trees[0]);
}
{
int i, newfd, stage = 0;
unsigned char sha1[20];
+ struct tree_desc t[3];
struct unpack_trees_options opts;
memset(&opts, 0, sizeof(opts));
opts.head_idx = 1;
}
- unpack_trees(trees, &opts);
+ for (i = 0; i < nr_trees; i++) {
+ struct tree *tree = trees[i];
+ parse_tree(tree);
+ init_tree_desc(t+i, tree->buffer, tree->size);
+ }
+ unpack_trees(nr_trees, t, &opts);
/*
* When reading only one tree (either the most basic form,
* valid cache-tree because the index must match exactly
* what came from the tree.
*/
- if (trees && trees->item && !opts.prefix && (!opts.merge || (stage == 2))) {
+ if (nr_trees && !opts.prefix && (!opts.merge || (stage == 2))) {
cache_tree_free(&active_cache_tree);
prime_cache_tree();
}
diff --git a/merge-recursive.c b/merge-recursive.c
index c8539ec0bafce5e238d97d6397a9d08c2c92a09c..f7d1b84999d401887e4a4eba091d53f5fe7294c8 100644 (file)
--- a/merge-recursive.c
+++ b/merge-recursive.c
*/
static int index_only = 0;
+static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
+{
+ parse_tree(tree);
+ init_tree_desc(desc, tree->buffer, tree->size);
+}
+
static int git_merge_trees(int index_only,
struct tree *common,
struct tree *head,
struct tree *merge)
{
int rc;
- struct object_list *trees = NULL;
+ struct tree_desc t[3];
struct unpack_trees_options opts;
memset(&opts, 0, sizeof(opts));
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);
+ init_tree_desc_from_tree(t+0, common);
+ init_tree_desc_from_tree(t+1, head);
+ init_tree_desc_from_tree(t+2, merge);
- rc = unpack_trees(trees, &opts);
+ rc = unpack_trees(3, t, &opts);
cache_tree_free(&active_cache_tree);
return rc;
}
diff --git a/unpack-trees.c b/unpack-trees.c
index dfd985b0ef0193ce311ea77e8c8cb11fc7b1c3e3..5d1ffd1a32a56bdcf4f64b545abd6aa951914ffe 100644 (file)
--- a/unpack-trees.c
+++ b/unpack-trees.c
const unsigned char *sha1;
};
-static struct tree_entry_list *create_tree_entry_list(struct tree *tree)
+static struct tree_entry_list *create_tree_entry_list(struct tree_desc *desc)
{
- struct tree_desc desc;
struct name_entry one;
struct tree_entry_list *ret = NULL;
struct tree_entry_list **list_p = &ret;
- if (!tree->object.parsed)
- parse_tree(tree);
-
- init_tree_desc(&desc, tree->buffer, tree->size);
-
- while (tree_entry(&desc, &one)) {
+ while (tree_entry(desc, &one)) {
struct tree_entry_list *entry;
entry = xmalloc(sizeof(struct tree_entry_list));
if (S_ISDIR(posns[i]->mode)) {
struct tree *tree = lookup_tree(posns[i]->sha1);
+ struct tree_desc t;
any_dirs = 1;
parse_tree(tree);
- subposns[i] = create_tree_entry_list(tree);
+ init_tree_desc(&t, tree->buffer, tree->size);
+ subposns[i] = create_tree_entry_list(&t);
posns[i] = posns[i]->next;
src[i + o->merge] = o->df_conflict_entry;
continue;
stop_progress(&progress);;
}
-int unpack_trees(struct object_list *trees, struct unpack_trees_options *o)
+int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options *o)
{
- unsigned len = object_list_length(trees);
struct tree_entry_list **posns;
int i;
- struct object_list *posn = trees;
struct tree_entry_list df_conflict_list;
static struct cache_entry *dfc;
if (len) {
posns = xmalloc(len * sizeof(struct tree_entry_list *));
- for (i = 0; i < len; i++) {
- posns[i] = create_tree_entry_list((struct tree *) posn->item);
- posn = posn->next;
- }
+ for (i = 0; i < len; i++)
+ posns[i] = create_tree_entry_list(t+i);
+
if (unpack_trees_rec(posns, len, o->prefix ? o->prefix : "",
o, &df_conflict_list))
return -1;
diff --git a/unpack-trees.h b/unpack-trees.h
index fee7da43822b63e5b1f24444e5c51c43d3ff5760..9cd39a28a907ef6f0eedc764bbae586353ec2ca5 100644 (file)
--- a/unpack-trees.h
+++ b/unpack-trees.h
struct cache_entry *df_conflict_entry;
};
-extern int unpack_trees(struct object_list *trees,
+extern int unpack_trees(unsigned n, struct tree_desc *t,
struct unpack_trees_options *options);
int threeway_merge(struct cache_entry **stages, struct unpack_trees_options *o);