Code

commit, merge: initialize static strbuf
[git.git] / fsck.c
diff --git a/fsck.c b/fsck.c
index 06808621517fe7134893018dff66a4295716780e..797e3178ae279f444d2efa7e3758652ad0898dd7 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -155,8 +155,6 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
        o_mode = 0;
        o_name = NULL;
        o_sha1 = NULL;
-       if (!desc.size)
-               return error_func(&item->object, FSCK_ERROR, "empty tree");
 
        while (desc.size) {
                unsigned mode;
@@ -304,3 +302,32 @@ int fsck_object(struct object *obj, int strict, fsck_error error_func)
        return error_func(obj, FSCK_ERROR, "unknown type '%d' (internal fsck error)",
                          obj->type);
 }
+
+int fsck_error_function(struct object *obj, int type, const char *fmt, ...)
+{
+       va_list ap;
+       int len;
+       struct strbuf sb;
+
+       strbuf_init(&sb, 0);
+       strbuf_addf(&sb, "object %s:", obj->sha1?sha1_to_hex(obj->sha1):"(null)");
+
+       va_start(ap, fmt);
+       len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap);
+       va_end(ap);
+
+       if (len < 0)
+               len = 0;
+       if (len >= strbuf_avail(&sb)) {
+               strbuf_grow(&sb, len + 2);
+               va_start(ap, fmt);
+               len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap);
+               va_end(ap);
+               if (len >= strbuf_avail(&sb))
+                       die("this should not happen, your snprintf is broken");
+       }
+
+       error(sb.buf);
+       strbuf_release(&sb);
+       return 1;
+}