1
0
mirror of https://github.com/git/git synced 2024-07-05 00:58:49 +00:00

Use strbuf API in cache-tree.c

Should even be marginally faster.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Pierre Habouzit 2007-09-06 13:20:11 +02:00 committed by Junio C Hamano
parent 19b358e8da
commit 5242bcbb63

View File

@ -1,4 +1,5 @@
#include "cache.h" #include "cache.h"
#include "strbuf.h"
#include "tree.h" #include "tree.h"
#include "cache-tree.h" #include "cache-tree.h"
@ -235,8 +236,7 @@ static int update_one(struct cache_tree *it,
int missing_ok, int missing_ok,
int dryrun) int dryrun)
{ {
unsigned long size, offset; struct strbuf buffer;
char *buffer;
int i; int i;
if (0 <= it->entry_count && has_sha1_file(it->sha1)) if (0 <= it->entry_count && has_sha1_file(it->sha1))
@ -293,9 +293,8 @@ static int update_one(struct cache_tree *it,
/* /*
* Then write out the tree object for this level. * Then write out the tree object for this level.
*/ */
size = 8192; strbuf_init(&buffer);
buffer = xmalloc(size); strbuf_grow(&buffer, 8192);
offset = 0;
for (i = 0; i < entries; i++) { for (i = 0; i < entries; i++) {
struct cache_entry *ce = cache[i]; struct cache_entry *ce = cache[i];
@ -332,15 +331,9 @@ static int update_one(struct cache_tree *it,
if (!ce->ce_mode) if (!ce->ce_mode)
continue; /* entry being removed */ continue; /* entry being removed */
if (size < offset + entlen + 100) { strbuf_grow(&buffer, entlen + 100);
size = alloc_nr(offset + entlen + 100); strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
buffer = xrealloc(buffer, size); strbuf_add(&buffer, sha1, 20);
}
offset += sprintf(buffer + offset,
"%o %.*s", mode, entlen, path + baselen);
buffer[offset++] = 0;
hashcpy((unsigned char*)buffer + offset, sha1);
offset += 20;
#if DEBUG #if DEBUG
fprintf(stderr, "cache-tree update-one %o %.*s\n", fprintf(stderr, "cache-tree update-one %o %.*s\n",
@ -349,10 +342,10 @@ static int update_one(struct cache_tree *it,
} }
if (dryrun) if (dryrun)
hash_sha1_file(buffer, offset, tree_type, it->sha1); hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
else else
write_sha1_file(buffer, offset, tree_type, it->sha1); write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
free(buffer); strbuf_release(&buffer);
it->entry_count = i; it->entry_count = i;
#if DEBUG #if DEBUG
fprintf(stderr, "cache-tree update-one (%d ent, %d subtree) %s\n", fprintf(stderr, "cache-tree update-one (%d ent, %d subtree) %s\n",
@ -378,12 +371,10 @@ int cache_tree_update(struct cache_tree *it,
return 0; return 0;
} }
static void *write_one(struct cache_tree *it, static void write_one(struct cache_tree *it,
char *path, char *path,
int pathlen, int pathlen,
char *buffer, struct strbuf *buffer)
unsigned long *size,
unsigned long *offset)
{ {
int i; int i;
@ -393,13 +384,9 @@ static void *write_one(struct cache_tree *it,
* tree-sha1 (missing if invalid) * tree-sha1 (missing if invalid)
* subtree_nr "cache-tree" entries for subtrees. * subtree_nr "cache-tree" entries for subtrees.
*/ */
if (*size < *offset + pathlen + 100) { strbuf_grow(buffer, pathlen + 100);
*size = alloc_nr(*offset + pathlen + 100); strbuf_add(buffer, path, pathlen);
buffer = xrealloc(buffer, *size); strbuf_addf(buffer, "%c%d %d\n", 0, it->entry_count, it->subtree_nr);
}
*offset += sprintf(buffer + *offset, "%.*s%c%d %d\n",
pathlen, path, 0,
it->entry_count, it->subtree_nr);
#if DEBUG #if DEBUG
if (0 <= it->entry_count) if (0 <= it->entry_count)
@ -412,8 +399,7 @@ static void *write_one(struct cache_tree *it,
#endif #endif
if (0 <= it->entry_count) { if (0 <= it->entry_count) {
hashcpy((unsigned char*)buffer + *offset, it->sha1); strbuf_add(buffer, it->sha1, 20);
*offset += 20;
} }
for (i = 0; i < it->subtree_nr; i++) { for (i = 0; i < it->subtree_nr; i++) {
struct cache_tree_sub *down = it->down[i]; struct cache_tree_sub *down = it->down[i];
@ -423,21 +409,20 @@ static void *write_one(struct cache_tree *it,
prev->name, prev->namelen) <= 0) prev->name, prev->namelen) <= 0)
die("fatal - unsorted cache subtree"); die("fatal - unsorted cache subtree");
} }
buffer = write_one(down->cache_tree, down->name, down->namelen, write_one(down->cache_tree, down->name, down->namelen, buffer);
buffer, size, offset);
} }
return buffer;
} }
void *cache_tree_write(struct cache_tree *root, unsigned long *size_p) void *cache_tree_write(struct cache_tree *root, unsigned long *size_p)
{ {
char path[PATH_MAX]; char path[PATH_MAX];
unsigned long size = 8192; struct strbuf buffer;
char *buffer = xmalloc(size);
*size_p = 0;
path[0] = 0; path[0] = 0;
return write_one(root, path, 0, buffer, &size, size_p); strbuf_init(&buffer);
write_one(root, path, 0, &buffer);
*size_p = buffer.len;
return strbuf_detach(&buffer);
} }
static struct cache_tree *read_one(const char **buffer, unsigned long *size_p) static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)