From 5242bcbb638f031818e9ebd4467c8e55d5a06bfb Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Thu, 6 Sep 2007 13:20:11 +0200 Subject: Use strbuf API in cache-tree.c Should even be marginally faster. Signed-off-by: Pierre Habouzit Signed-off-by: Junio C Hamano --- cache-tree.c | 59 ++++++++++++++++++++++------------------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) (limited to 'cache-tree.c') diff --git a/cache-tree.c b/cache-tree.c index 077f034369..76af6f5d99 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "strbuf.h" #include "tree.h" #include "cache-tree.h" @@ -235,8 +236,7 @@ static int update_one(struct cache_tree *it, int missing_ok, int dryrun) { - unsigned long size, offset; - char *buffer; + struct strbuf buffer; int i; 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. */ - size = 8192; - buffer = xmalloc(size); - offset = 0; + strbuf_init(&buffer); + strbuf_grow(&buffer, 8192); for (i = 0; i < entries; i++) { struct cache_entry *ce = cache[i]; @@ -332,15 +331,9 @@ static int update_one(struct cache_tree *it, if (!ce->ce_mode) continue; /* entry being removed */ - if (size < offset + entlen + 100) { - size = alloc_nr(offset + entlen + 100); - buffer = xrealloc(buffer, size); - } - offset += sprintf(buffer + offset, - "%o %.*s", mode, entlen, path + baselen); - buffer[offset++] = 0; - hashcpy((unsigned char*)buffer + offset, sha1); - offset += 20; + strbuf_grow(&buffer, entlen + 100); + strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0'); + strbuf_add(&buffer, sha1, 20); #if DEBUG fprintf(stderr, "cache-tree update-one %o %.*s\n", @@ -349,10 +342,10 @@ static int update_one(struct cache_tree *it, } if (dryrun) - hash_sha1_file(buffer, offset, tree_type, it->sha1); + hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1); else - write_sha1_file(buffer, offset, tree_type, it->sha1); - free(buffer); + write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1); + strbuf_release(&buffer); it->entry_count = i; #if DEBUG 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; } -static void *write_one(struct cache_tree *it, +static void write_one(struct cache_tree *it, char *path, int pathlen, - char *buffer, - unsigned long *size, - unsigned long *offset) + struct strbuf *buffer) { int i; @@ -393,13 +384,9 @@ static void *write_one(struct cache_tree *it, * tree-sha1 (missing if invalid) * subtree_nr "cache-tree" entries for subtrees. */ - if (*size < *offset + pathlen + 100) { - *size = alloc_nr(*offset + pathlen + 100); - buffer = xrealloc(buffer, *size); - } - *offset += sprintf(buffer + *offset, "%.*s%c%d %d\n", - pathlen, path, 0, - it->entry_count, it->subtree_nr); + strbuf_grow(buffer, pathlen + 100); + strbuf_add(buffer, path, pathlen); + strbuf_addf(buffer, "%c%d %d\n", 0, it->entry_count, it->subtree_nr); #if DEBUG if (0 <= it->entry_count) @@ -412,8 +399,7 @@ static void *write_one(struct cache_tree *it, #endif if (0 <= it->entry_count) { - hashcpy((unsigned char*)buffer + *offset, it->sha1); - *offset += 20; + strbuf_add(buffer, it->sha1, 20); } for (i = 0; i < it->subtree_nr; 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) die("fatal - unsorted cache subtree"); } - buffer = write_one(down->cache_tree, down->name, down->namelen, - buffer, size, offset); + write_one(down->cache_tree, down->name, down->namelen, buffer); } - return buffer; } void *cache_tree_write(struct cache_tree *root, unsigned long *size_p) { char path[PATH_MAX]; - unsigned long size = 8192; - char *buffer = xmalloc(size); + struct strbuf buffer; - *size_p = 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) -- cgit v1.3 From f1696ee398e92bcea3cdc7b3da85d8e0f77f6c50 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Mon, 10 Sep 2007 12:35:04 +0200 Subject: Strbuf API extensions and fixes. * Add strbuf_rtrim to remove trailing spaces. * Add strbuf_insert to insert data at a given position. * Off-by one fix in strbuf_addf: strbuf_avail() does not counts the final \0 so the overflow test for snprintf is the strict comparison. This is not critical as the growth mechanism chosen will always allocate _more_ memory than asked, so the second test will not fail. It's some kind of miracle though. * Add size extension hints for strbuf_init and strbuf_read. If 0, default applies, else: + initial buffer has the given size for strbuf_init. + first growth checks it has at least this size rather than the default 8192. Signed-off-by: Pierre Habouzit Signed-off-by: Junio C Hamano --- archive-tar.c | 4 ++-- builtin-apply.c | 4 ++-- builtin-blame.c | 6 +++--- builtin-checkout-index.c | 2 +- builtin-commit-tree.c | 5 ++--- builtin-rerere.c | 4 ++-- builtin-update-index.c | 4 ++-- cache-tree.c | 5 ++--- diff.c | 4 ++-- fast-import.c | 4 ++-- fetch.c | 2 +- mktree.c | 5 ++--- strbuf.c | 33 +++++++++++++++++++++++++++------ strbuf.h | 10 ++++++++-- 14 files changed, 58 insertions(+), 34 deletions(-) (limited to 'cache-tree.c') diff --git a/archive-tar.c b/archive-tar.c index 0612bb6051..cc94cf3672 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -132,7 +132,7 @@ static void write_entry(const unsigned char *sha1, struct strbuf *path, struct strbuf ext_header; memset(&header, 0, sizeof(header)); - strbuf_init(&ext_header); + strbuf_init(&ext_header, 0); if (!sha1) { *header.typeflag = TYPEFLAG_GLOBAL_HEADER; @@ -214,7 +214,7 @@ static void write_global_extended_header(const unsigned char *sha1) { struct strbuf ext_header; - strbuf_init(&ext_header); + strbuf_init(&ext_header, 0); strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40); write_entry(NULL, NULL, 0, ext_header.buf, ext_header.len); strbuf_release(&ext_header); diff --git a/builtin-apply.c b/builtin-apply.c index 90e328ef91..988e85f1e5 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -184,8 +184,8 @@ static void *read_patch_file(int fd, unsigned long *sizep) { struct strbuf buf; - strbuf_init(&buf); - if (strbuf_read(&buf, fd) < 0) + strbuf_init(&buf, 0); + if (strbuf_read(&buf, fd, 0) < 0) die("git-apply: read returned %s", strerror(errno)); *sizep = buf.len; diff --git a/builtin-blame.c b/builtin-blame.c index 1b1e6da853..b004f06cd8 100644 --- a/builtin-blame.c +++ b/builtin-blame.c @@ -2023,7 +2023,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con origin = make_origin(commit, path); - strbuf_init(&buf); + strbuf_init(&buf, 0); if (!contents_from || strcmp("-", contents_from)) { struct stat st; const char *read_from; @@ -2046,7 +2046,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con fd = open(read_from, O_RDONLY); if (fd < 0) die("cannot open %s", read_from); - if (strbuf_read(&buf, fd) != xsize_t(st.st_size)) + if (strbuf_read(&buf, fd, 0) != xsize_t(st.st_size)) die("cannot read %s", read_from); break; case S_IFLNK: @@ -2062,7 +2062,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con /* Reading from stdin */ contents_from = "standard input"; mode = 0; - if (strbuf_read(&buf, 0) < 0) + if (strbuf_read(&buf, 0, 0) < 0) die("read error %s from stdin", strerror(errno)); } origin->file.ptr = buf.buf; diff --git a/builtin-checkout-index.c b/builtin-checkout-index.c index 75377b9cab..153ba7dc12 100644 --- a/builtin-checkout-index.c +++ b/builtin-checkout-index.c @@ -274,7 +274,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) struct strbuf buf; if (all) die("git-checkout-index: don't mix '--all' and '--stdin'"); - strbuf_init(&buf); + strbuf_init(&buf, 0); while (1) { char *path_name; const char *p; diff --git a/builtin-commit-tree.c b/builtin-commit-tree.c index bc9502c135..325334fd65 100644 --- a/builtin-commit-tree.c +++ b/builtin-commit-tree.c @@ -87,8 +87,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix) /* Not having i18n.commitencoding is the same as having utf-8 */ encoding_is_utf8 = is_encoding_utf8(git_commit_encoding); - strbuf_init(&buffer); - strbuf_grow(&buffer, 8192); /* should avoid reallocs for the headers */ + strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */ strbuf_addf(&buffer, "tree %s\n", sha1_to_hex(tree_sha1)); /* @@ -107,7 +106,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix) strbuf_addch(&buffer, '\n'); /* And add the comment */ - if (strbuf_read(&buffer, 0) < 0) + if (strbuf_read(&buffer, 0, 0) < 0) die("git-commit-tree: read returned %s", strerror(errno)); /* And check the encoding */ diff --git a/builtin-rerere.c b/builtin-rerere.c index 98d7702168..826d346fbc 100644 --- a/builtin-rerere.c +++ b/builtin-rerere.c @@ -78,8 +78,8 @@ static int handle_file(const char *path, FILE *f = fopen(path, "r"); FILE *out; - strbuf_init(&minus); - strbuf_init(&plus); + strbuf_init(&minus, 0); + strbuf_init(&plus, 0); if (!f) return error("Could not open %s", path); diff --git a/builtin-update-index.c b/builtin-update-index.c index a7a4574f2b..9240a288a7 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -303,7 +303,7 @@ static void update_one(const char *path, const char *prefix, int prefix_length) static void read_index_info(int line_termination) { struct strbuf buf; - strbuf_init(&buf); + strbuf_init(&buf, 0); while (1) { char *ptr, *tab; char *path_name; @@ -716,7 +716,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } if (read_from_stdin) { struct strbuf buf; - strbuf_init(&buf); + strbuf_init(&buf, 0); while (1) { char *path_name; const char *p; diff --git a/cache-tree.c b/cache-tree.c index 76af6f5d99..8f53c99f15 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -293,8 +293,7 @@ static int update_one(struct cache_tree *it, /* * Then write out the tree object for this level. */ - strbuf_init(&buffer); - strbuf_grow(&buffer, 8192); + strbuf_init(&buffer, 8192); for (i = 0; i < entries; i++) { struct cache_entry *ce = cache[i]; @@ -419,7 +418,7 @@ void *cache_tree_write(struct cache_tree *root, unsigned long *size_p) struct strbuf buffer; path[0] = 0; - strbuf_init(&buffer); + strbuf_init(&buffer, 0); write_one(root, path, 0, &buffer); *size_p = buffer.len; return strbuf_detach(&buffer); diff --git a/diff.c b/diff.c index 26d7bb96bc..7290309ea9 100644 --- a/diff.c +++ b/diff.c @@ -1548,8 +1548,8 @@ static int populate_from_stdin(struct diff_filespec *s) { struct strbuf buf; - strbuf_init(&buf); - if (strbuf_read(&buf, 0) < 0) + strbuf_init(&buf, 0); + if (strbuf_read(&buf, 0, 0) < 0) return error("error while reading from stdin %s", strerror(errno)); diff --git a/fast-import.c b/fast-import.c index 74ff0fdadd..2c0bfb9fab 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1640,7 +1640,7 @@ static void *cmd_data (size_t *size) { struct strbuf buffer; - strbuf_init(&buffer); + strbuf_init(&buffer, 0); if (prefixcmp(command_buf.buf, "data ")) die("Expected 'data n' command, found: %s", command_buf.buf); @@ -2318,7 +2318,7 @@ int main(int argc, const char **argv) git_config(git_default_config); alloc_objects(object_entry_alloc); - strbuf_init(&command_buf); + strbuf_init(&command_buf, 0); atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*)); branch_table = xcalloc(branch_table_sz, sizeof(struct branch*)); avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*)); diff --git a/fetch.c b/fetch.c index 811be87a3c..dd6ed9e41c 100644 --- a/fetch.c +++ b/fetch.c @@ -218,7 +218,7 @@ int pull_targets_stdin(char ***target, const char ***write_ref) int targets = 0, targets_alloc = 0; struct strbuf buf; *target = NULL; *write_ref = NULL; - strbuf_init(&buf); + strbuf_init(&buf, 0); while (1) { char *rf_one = NULL; char *tg_one; diff --git a/mktree.c b/mktree.c index 2e84889c02..3891cd9fb3 100644 --- a/mktree.c +++ b/mktree.c @@ -51,9 +51,8 @@ static void write_tree(unsigned char *sha1) qsort(entries, used, sizeof(*entries), ent_compare); for (size = i = 0; i < used; i++) size += 32 + entries[i]->len; - strbuf_init(&buf); - strbuf_grow(&buf, size); + strbuf_init(&buf, size); for (i = 0; i < used; i++) { struct treeent *ent = entries[i]; strbuf_addf(&buf, "%o %s%c", ent->mode, ent->name, '\0'); @@ -83,7 +82,7 @@ int main(int ac, char **av) av++; } - strbuf_init(&sb); + strbuf_init(&sb, 0); while (1) { char *ptr, *ntr; unsigned mode; diff --git a/strbuf.c b/strbuf.c index 7136de14c6..d9190477e6 100644 --- a/strbuf.c +++ b/strbuf.c @@ -1,8 +1,10 @@ #include "cache.h" #include "strbuf.h" -void strbuf_init(struct strbuf *sb) { +void strbuf_init(struct strbuf *sb, size_t hint) { memset(sb, 0, sizeof(*sb)); + if (hint) + strbuf_grow(sb, hint); } void strbuf_release(struct strbuf *sb) { @@ -18,7 +20,7 @@ void strbuf_reset(struct strbuf *sb) { char *strbuf_detach(struct strbuf *sb) { char *res = sb->buf; - strbuf_init(sb); + strbuf_init(sb, 0); return res; } @@ -28,6 +30,24 @@ void strbuf_grow(struct strbuf *sb, size_t extra) { ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc); } +void strbuf_rtrim(struct strbuf *sb) +{ + while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1])) + sb->len--; + sb->buf[sb->len] = '\0'; +} + +void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len) { + strbuf_grow(sb, len); + if (pos >= sb->len) { + pos = sb->len; + } else { + memmove(sb->buf + pos + len, sb->buf + pos, sb->len - pos); + } + memcpy(sb->buf + pos, data, len); + strbuf_setlen(sb, sb->len + len); +} + void strbuf_add(struct strbuf *sb, const void *data, size_t len) { strbuf_grow(sb, len); memcpy(sb->buf + sb->len, data, len); @@ -44,12 +64,12 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...) { if (len < 0) { len = 0; } - if (len >= strbuf_avail(sb)) { + if (len > strbuf_avail(sb)) { strbuf_grow(sb, len); va_start(ap, fmt); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); va_end(ap); - if (len >= strbuf_avail(sb)) { + if (len > strbuf_avail(sb)) { die("this should not happen, your snprintf is broken"); } } @@ -67,14 +87,14 @@ size_t strbuf_fread(struct strbuf *sb, size_t size, FILE *f) { return res; } -ssize_t strbuf_read(struct strbuf *sb, int fd) +ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint) { size_t oldlen = sb->len; + strbuf_grow(sb, hint ? hint : 8192); for (;;) { ssize_t cnt; - strbuf_grow(sb, 8192); cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); if (cnt < 0) { strbuf_setlen(sb, oldlen); @@ -83,6 +103,7 @@ ssize_t strbuf_read(struct strbuf *sb, int fd) if (!cnt) break; sb->len += cnt; + strbuf_grow(sb, 8192); } sb->buf[sb->len] = '\0'; diff --git a/strbuf.h b/strbuf.h index b40dc99fd0..21fc111f9d 100644 --- a/strbuf.h +++ b/strbuf.h @@ -51,7 +51,7 @@ struct strbuf { #define STRBUF_INIT { 0, 0, 0, NULL } /*----- strbuf life cycle -----*/ -extern void strbuf_init(struct strbuf *); +extern void strbuf_init(struct strbuf *, size_t); extern void strbuf_release(struct strbuf *); extern void strbuf_reset(struct strbuf *); extern char *strbuf_detach(struct strbuf *); @@ -68,6 +68,9 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len) { extern void strbuf_grow(struct strbuf *, size_t); +/*----- content related -----*/ +extern void strbuf_rtrim(struct strbuf *); + /*----- add data in your buffer -----*/ static inline void strbuf_addch(struct strbuf *sb, int c) { strbuf_grow(sb, 1); @@ -75,6 +78,9 @@ static inline void strbuf_addch(struct strbuf *sb, int c) { sb->buf[sb->len] = '\0'; } +/* inserts after pos, or appends if pos >= sb->len */ +extern void strbuf_insert(struct strbuf *, size_t pos, const void *, size_t); + extern void strbuf_add(struct strbuf *, const void *, size_t); static inline void strbuf_addstr(struct strbuf *sb, const char *s) { strbuf_add(sb, s, strlen(s)); @@ -88,7 +94,7 @@ extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...); extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); /* XXX: if read fails, any partial read is undone */ -extern ssize_t strbuf_read(struct strbuf *, int fd); +extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); extern void read_line(struct strbuf *, FILE *, int); -- cgit v1.3 From ba3ed09728cb25e004d3b732de14fca8aeb602f6 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Sat, 15 Sep 2007 15:56:50 +0200 Subject: Now that cache.h needs strbuf.h, remove useless includes. Signed-off-by: Pierre Habouzit Acked-by: Linus Torvalds Signed-off-by: Junio C Hamano --- archive-tar.c | 1 - builtin-apply.c | 1 - builtin-blame.c | 1 - builtin-checkout-index.c | 1 - builtin-commit-tree.c | 1 - builtin-fetch--tool.c | 1 - builtin-rerere.c | 1 - builtin-stripspace.c | 1 - builtin-tag.c | 1 - builtin-update-index.c | 1 - cache-tree.c | 1 - convert.c | 1 - diff.c | 1 - fast-import.c | 1 - fetch.c | 1 - imap-send.c | 1 - mktag.c | 1 - mktree.c | 1 - sha1_file.c | 1 - strbuf.c | 1 - 20 files changed, 20 deletions(-) (limited to 'cache-tree.c') diff --git a/archive-tar.c b/archive-tar.c index cc94cf3672..a87bc4b83e 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -3,7 +3,6 @@ */ #include "cache.h" #include "commit.h" -#include "strbuf.h" #include "tar.h" #include "builtin.h" #include "archive.h" diff --git a/builtin-apply.c b/builtin-apply.c index e5c29ebf35..1256716aec 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -12,7 +12,6 @@ #include "blob.h" #include "delta.h" #include "builtin.h" -#include "strbuf.h" /* * --check turns on checking that the working tree matches the diff --git a/builtin-blame.c b/builtin-blame.c index b004f06cd8..e364b6c6c0 100644 --- a/builtin-blame.c +++ b/builtin-blame.c @@ -18,7 +18,6 @@ #include "cache-tree.h" #include "path-list.h" #include "mailmap.h" -#include "strbuf.h" static char blame_usage[] = "git-blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [-L n,m] [-S ] [-M] [-C] [-C] [--contents ] [--incremental] [commit] [--] file\n" diff --git a/builtin-checkout-index.c b/builtin-checkout-index.c index 153ba7dc12..85e8efe22f 100644 --- a/builtin-checkout-index.c +++ b/builtin-checkout-index.c @@ -38,7 +38,6 @@ */ #include "builtin.h" #include "cache.h" -#include "strbuf.h" #include "quote.h" #include "cache-tree.h" diff --git a/builtin-commit-tree.c b/builtin-commit-tree.c index 325334fd65..88b0ab36eb 100644 --- a/builtin-commit-tree.c +++ b/builtin-commit-tree.c @@ -8,7 +8,6 @@ #include "tree.h" #include "builtin.h" #include "utf8.h" -#include "strbuf.h" #define BLOCKING (1ul << 14) diff --git a/builtin-fetch--tool.c b/builtin-fetch--tool.c index 90bdc32d13..514a3cc018 100644 --- a/builtin-fetch--tool.c +++ b/builtin-fetch--tool.c @@ -2,7 +2,6 @@ #include "cache.h" #include "refs.h" #include "commit.h" -#include "strbuf.h" static char *get_stdin(void) { diff --git a/builtin-rerere.c b/builtin-rerere.c index 826d346fbc..58288f61a3 100644 --- a/builtin-rerere.c +++ b/builtin-rerere.c @@ -1,7 +1,6 @@ #include "builtin.h" #include "cache.h" #include "path-list.h" -#include "strbuf.h" #include "xdiff/xdiff.h" #include "xdiff-interface.h" diff --git a/builtin-stripspace.c b/builtin-stripspace.c index c4cf2f05ca..1ce284710c 100644 --- a/builtin-stripspace.c +++ b/builtin-stripspace.c @@ -1,6 +1,5 @@ #include "builtin.h" #include "cache.h" -#include "strbuf.h" /* * Returns the length of a line, without trailing spaces. diff --git a/builtin-tag.c b/builtin-tag.c index 9f293421da..82ebda11b0 100644 --- a/builtin-tag.c +++ b/builtin-tag.c @@ -8,7 +8,6 @@ #include "cache.h" #include "builtin.h" -#include "strbuf.h" #include "refs.h" #include "tag.h" #include "run-command.h" diff --git a/builtin-update-index.c b/builtin-update-index.c index 9240a288a7..1091f1b26f 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -4,7 +4,6 @@ * Copyright (C) Linus Torvalds, 2005 */ #include "cache.h" -#include "strbuf.h" #include "quote.h" #include "cache-tree.h" #include "tree-walk.h" diff --git a/cache-tree.c b/cache-tree.c index 8f53c99f15..5471844af6 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -1,5 +1,4 @@ #include "cache.h" -#include "strbuf.h" #include "tree.h" #include "cache-tree.h" diff --git a/convert.c b/convert.c index 00a341c595..508d30b2f1 100644 --- a/convert.c +++ b/convert.c @@ -1,7 +1,6 @@ #include "cache.h" #include "attr.h" #include "run-command.h" -#include "strbuf.h" /* * convert.c - convert a file when checking it out and checking it in. diff --git a/diff.c b/diff.c index f41bcd94ab..56b672c4f0 100644 --- a/diff.c +++ b/diff.c @@ -9,7 +9,6 @@ #include "xdiff-interface.h" #include "color.h" #include "attr.h" -#include "strbuf.h" #ifdef NO_FAST_WORKING_DIRECTORY #define FAST_WORKING_DIRECTORY 0 diff --git a/fast-import.c b/fast-import.c index 2c0bfb9fab..1866d346bf 100644 --- a/fast-import.c +++ b/fast-import.c @@ -149,7 +149,6 @@ Format of STDIN stream: #include "pack.h" #include "refs.h" #include "csum-file.h" -#include "strbuf.h" #include "quote.h" #define PACK_ID_BITS 16 diff --git a/fetch.c b/fetch.c index dd6ed9e41c..c256e6f6b4 100644 --- a/fetch.c +++ b/fetch.c @@ -6,7 +6,6 @@ #include "tag.h" #include "blob.h" #include "refs.h" -#include "strbuf.h" int get_tree = 0; int get_history = 0; diff --git a/imap-send.c b/imap-send.c index ecd4216a56..86e4a0f6a0 100644 --- a/imap-send.c +++ b/imap-send.c @@ -23,7 +23,6 @@ */ #include "cache.h" -#include "strbuf.h" typedef struct store_conf { char *name; diff --git a/mktag.c b/mktag.c index 7567f9ec29..b05260c83f 100644 --- a/mktag.c +++ b/mktag.c @@ -1,5 +1,4 @@ #include "cache.h" -#include "strbuf.h" #include "tag.h" /* diff --git a/mktree.c b/mktree.c index 3891cd9fb3..5dab4bd367 100644 --- a/mktree.c +++ b/mktree.c @@ -4,7 +4,6 @@ * Copyright (c) Junio C Hamano, 2006 */ #include "cache.h" -#include "strbuf.h" #include "quote.h" #include "tree.h" diff --git a/sha1_file.c b/sha1_file.c index 64b5b46698..59325d46be 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -14,7 +14,6 @@ #include "tag.h" #include "tree.h" #include "refs.h" -#include "strbuf.h" #ifndef O_NOATIME #if defined(__linux__) && (defined(__i386__) || defined(__PPC__)) diff --git a/strbuf.c b/strbuf.c index ff551ac9ff..c5f9e2a28f 100644 --- a/strbuf.c +++ b/strbuf.c @@ -1,5 +1,4 @@ #include "cache.h" -#include "strbuf.h" void strbuf_init(struct strbuf *sb, size_t hint) { -- cgit v1.3 From 1dffb8fa8056860e769f3a0c6e232d436f5a5c17 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Tue, 25 Sep 2007 10:22:44 +0200 Subject: Small cache_tree_write refactor. This function cannot fail, make it void. Also make write_one act on a const char* instead of a char*. Signed-off-by: Pierre Habouzit Signed-off-by: Junio C Hamano --- cache-tree.c | 19 +++++-------------- cache-tree.h | 2 +- read-cache.c | 19 +++++++++---------- 3 files changed, 15 insertions(+), 25 deletions(-) (limited to 'cache-tree.c') diff --git a/cache-tree.c b/cache-tree.c index 5471844af6..50b35264fd 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -369,10 +369,8 @@ int cache_tree_update(struct cache_tree *it, return 0; } -static void write_one(struct cache_tree *it, - char *path, - int pathlen, - struct strbuf *buffer) +static void write_one(struct strbuf *buffer, struct cache_tree *it, + const char *path, int pathlen) { int i; @@ -407,20 +405,13 @@ static void write_one(struct cache_tree *it, prev->name, prev->namelen) <= 0) die("fatal - unsorted cache subtree"); } - write_one(down->cache_tree, down->name, down->namelen, buffer); + write_one(buffer, down->cache_tree, down->name, down->namelen); } } -void *cache_tree_write(struct cache_tree *root, unsigned long *size_p) +void cache_tree_write(struct strbuf *sb, struct cache_tree *root) { - char path[PATH_MAX]; - struct strbuf buffer; - - path[0] = 0; - strbuf_init(&buffer, 0); - write_one(root, path, 0, &buffer); - *size_p = buffer.len; - return strbuf_detach(&buffer); + write_one(sb, root, "", 0); } static struct cache_tree *read_one(const char **buffer, unsigned long *size_p) diff --git a/cache-tree.h b/cache-tree.h index 119407e3a1..8243228e49 100644 --- a/cache-tree.h +++ b/cache-tree.h @@ -22,7 +22,7 @@ void cache_tree_free(struct cache_tree **); void cache_tree_invalidate_path(struct cache_tree *, const char *); struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *); -void *cache_tree_write(struct cache_tree *root, unsigned long *size_p); +void cache_tree_write(struct strbuf *, struct cache_tree *root); struct cache_tree *cache_tree_read(const char *buffer, unsigned long size); int cache_tree_fully_valid(struct cache_tree *); diff --git a/read-cache.c b/read-cache.c index 2e40a34420..56202d13df 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1136,7 +1136,7 @@ int write_index(struct index_state *istate, int newfd) { SHA_CTX c; struct cache_header hdr; - int i, removed; + int i, err, removed; struct cache_entry **cache = istate->cache; int entries = istate->cache_nr; @@ -1165,16 +1165,15 @@ int write_index(struct index_state *istate, int newfd) /* Write extension data here */ if (istate->cache_tree) { - unsigned long sz; - void *data = cache_tree_write(istate->cache_tree, &sz); - if (data && - !write_index_ext_header(&c, newfd, CACHE_EXT_TREE, sz) && - !ce_write(&c, newfd, data, sz)) - free(data); - else { - free(data); + struct strbuf sb; + + strbuf_init(&sb, 0); + cache_tree_write(&sb, istate->cache_tree); + err = write_index_ext_header(&c, newfd, CACHE_EXT_TREE, sb.len) < 0 + || ce_write(&c, newfd, sb.buf, sb.len) < 0; + strbuf_release(&sb); + if (err) return -1; - } } return ce_flush(&c, newfd); } -- cgit v1.3