diff options
author | Junio C Hamano <junkio@cox.net> | 2006-03-29 22:55:43 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-03-29 23:54:13 -0800 |
commit | 1b0c7174a17de801051402ed35ac085ebd91e88c (patch) | |
tree | 31a806fd8bf26fe1ecf42f62c82bb68f16fbc150 /merge-tree.c | |
parent | e464f4c3119b04712ab87329f3dd4d4f21b0a8a7 (diff) | |
download | git-1b0c7174a17de801051402ed35ac085ebd91e88c.tar.gz |
tree/diff header cleanup.
Introduce tree-walk.[ch] and move "struct tree_desc" and
associated functions from various places.
Rename DIFF_FILE_CANON_MODE(mode) macro to canon_mode(mode) and
move it to cache.h. This macro returns the canonicalized
st_mode value in the host byte order for files, symlinks and
directories -- to be compared with a tree_desc entry.
create_ce_mode(mode) in cache.h is similar but is intended to be
used for index entries (so it does not work for directories) and
returns the value in the network byte order.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'merge-tree.c')
-rw-r--r-- | merge-tree.c | 96 |
1 files changed, 1 insertions, 95 deletions
diff --git a/merge-tree.c b/merge-tree.c index 768d83a7c2..50528d5e43 100644 --- a/merge-tree.c +++ b/merge-tree.c @@ -1,51 +1,11 @@ #include "cache.h" -#include "diff.h" +#include "tree-walk.h" static const char merge_tree_usage[] = "git-merge-tree <base-tree> <branch1> <branch2>"; static int resolve_directories = 1; static void merge_trees(struct tree_desc t[3], const char *base); -static void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1) -{ - unsigned long size = 0; - void *buf = NULL; - - if (sha1) { - buf = read_object_with_reference(sha1, "tree", &size, NULL); - if (!buf) - die("unable to read tree %s", sha1_to_hex(sha1)); - } - desc->size = size; - desc->buf = buf; - return buf; -} - -struct name_entry { - const unsigned char *sha1; - const char *path; - unsigned int mode; - int pathlen; -}; - -static void entry_clear(struct name_entry *a) -{ - memset(a, 0, sizeof(*a)); -} - -static int entry_compare(struct name_entry *a, struct name_entry *b) -{ - return base_name_compare( - a->path, a->pathlen, a->mode, - b->path, b->pathlen, b->mode); -} - -static void entry_extract(struct tree_desc *t, struct name_entry *a) -{ - a->sha1 = tree_entry_extract(t, &a->path, &a->mode); - a->pathlen = strlen(a->path); -} - /* An empty entry never compares same, not even to another empty entry */ static int same_entry(struct name_entry *a, struct name_entry *b) { @@ -125,60 +85,6 @@ static void unresolved(const char *base, struct name_entry n[3]) printf("3 %06o %s %s%s\n", n[2].mode, sha1_to_hex(n[2].sha1), base, n[2].path); } -typedef void (*traverse_callback_t)(int n, unsigned long mask, struct name_entry *entry, const char *base); - -static void traverse_trees(int n, struct tree_desc *t, const char *base, traverse_callback_t callback) -{ - struct name_entry *entry = xmalloc(n*sizeof(*entry)); - - for (;;) { - struct name_entry entry[3]; - unsigned long mask = 0; - int i, last; - - last = -1; - for (i = 0; i < n; i++) { - if (!t[i].size) - continue; - entry_extract(t+i, entry+i); - if (last >= 0) { - int cmp = entry_compare(entry+i, entry+last); - - /* - * Is the new name bigger than the old one? - * Ignore it - */ - if (cmp > 0) - continue; - /* - * Is the new name smaller than the old one? - * Ignore all old ones - */ - if (cmp < 0) - mask = 0; - } - mask |= 1ul << i; - last = i; - } - if (!mask) - break; - - /* - * Update the tree entries we've walked, and clear - * all the unused name-entries. - */ - for (i = 0; i < n; i++) { - if (mask & (1ul << i)) { - update_tree_entry(t+i); - continue; - } - entry_clear(entry + i); - } - callback(n, mask, entry, base); - } - free(entry); -} - /* * Merge two trees together (t[1] and t[2]), using a common base (t[0]) * as the origin. |