Rework pretty_print_commit to use strbufs instead of custom buffers.
[gitweb.git] / mktree.c
index 56205d1e0053cdcb7236bde199817a5529d3f433..3891cd9fb31bf9aa84a339a70c474c38569affa5 100644 (file)
--- a/mktree.c
+++ b/mktree.c
@@ -44,30 +44,22 @@ static int ent_compare(const void *a_, const void *b_)
 
 static void write_tree(unsigned char *sha1)
 {
-       char *buffer;
-       unsigned long size, offset;
+       struct strbuf buf;
+       size_t size;
        int i;
 
        qsort(entries, used, sizeof(*entries), ent_compare);
        for (size = i = 0; i < used; i++)
                size += 32 + entries[i]->len;
-       buffer = xmalloc(size);
-       offset = 0;
 
+       strbuf_init(&buf, size);
        for (i = 0; i < used; i++) {
                struct treeent *ent = entries[i];
-
-               if (offset + ent->len + 100 < size) {
-                       size = alloc_nr(offset + ent->len + 100);
-                       buffer = xrealloc(buffer, size);
-               }
-               offset += sprintf(buffer + offset, "%o ", ent->mode);
-               offset += sprintf(buffer + offset, "%s", ent->name);
-               buffer[offset++] = 0;
-               hashcpy((unsigned char*)buffer + offset, ent->sha1);
-               offset += 20;
+               strbuf_addf(&buf, "%o %s%c", ent->mode, ent->name, '\0');
+               strbuf_add(&buf, ent->sha1, 20);
        }
-       write_sha1_file(buffer, offset, tree_type, sha1);
+
+       write_sha1_file(buf.buf, buf.len, tree_type, sha1);
 }
 
 static const char mktree_usage[] = "git-mktree [-z]";
@@ -90,18 +82,16 @@ int main(int ac, char **av)
                av++;
        }
 
-       strbuf_init(&sb);
+       strbuf_init(&sb, 0);
        while (1) {
-               int len;
                char *ptr, *ntr;
                unsigned mode;
-               char type[20];
+               enum object_type type;
                char *path;
 
                read_line(&sb, stdin, line_termination);
                if (sb.eof)
                        break;
-               len = sb.len;
                ptr = sb.buf;
                /* Input is non-recursive ls-tree output format
                 * mode SP type SP sha1 TAB name
@@ -111,15 +101,16 @@ int main(int ac, char **av)
                        die("input format error: %s", sb.buf);
                ptr = ntr + 1; /* type */
                ntr = strchr(ptr, ' ');
-               if (!ntr || sb.buf + len <= ntr + 41 ||
+               if (!ntr || sb.buf + sb.len <= ntr + 40 ||
                    ntr[41] != '\t' ||
                    get_sha1_hex(ntr + 1, sha1))
                        die("input format error: %s", sb.buf);
-               if (sha1_object_info(sha1, type, NULL))
+               type = sha1_object_info(sha1, NULL);
+               if (type < 0)
                        die("object %s unavailable", sha1_to_hex(sha1));
                *ntr++ = 0; /* now at the beginning of SHA1 */
-               if (strcmp(ptr, type))
-                       die("object type %s mismatch (%s)", ptr, type);
+               if (type != type_from_string(ptr))
+                       die("object type %s mismatch (%s)", ptr, typename(type));
                ntr += 41; /* at the beginning of name */
                if (line_termination && ntr[0] == '"')
                        path = unquote_c_style(ntr, NULL);