fsck.c:fsck_ident(): ident points at a const string
[gitweb.git] / builtin / cat-file.c
index 1434afbd4dab33c2a552fcd1bbd79655c632a13f..d5a93e0e911ccbe4560a03ed78436bfb174e0f68 100644 (file)
@@ -118,6 +118,7 @@ struct expand_data {
        unsigned long size;
        unsigned long disk_size;
        const char *rest;
+       unsigned char delta_base_sha1[20];
 
        /*
         * If mark_query is true, we do not expand anything, but rather
@@ -174,6 +175,11 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
                        data->split_on_whitespace = 1;
                else if (data->rest)
                        strbuf_addstr(sb, data->rest);
+       } else if (is_atom("deltabase", atom, len)) {
+               if (data->mark_query)
+                       data->info.delta_base_sha1 = data->delta_base_sha1;
+               else
+                       strbuf_addstr(sb, sha1_to_hex(data->delta_base_sha1));
        } else
                die("unknown format element: %.*s", len, atom);
 }
@@ -197,6 +203,8 @@ static void print_object_or_die(int fd, struct expand_data *data)
 {
        const unsigned char *sha1 = data->sha1;
 
+       assert(data->info.typep);
+
        if (data->type == OBJ_BLOB) {
                if (stream_blob_to_fd(fd, sha1, NULL, 0) < 0)
                        die("unable to stream %s to stdout", sha1_to_hex(sha1));
@@ -211,7 +219,7 @@ static void print_object_or_die(int fd, struct expand_data *data)
                        die("object %s disappeared", sha1_to_hex(sha1));
                if (type != data->type)
                        die("object %s changed type!?", sha1_to_hex(sha1));
-               if (size != data->size)
+               if (data->info.sizep && size != data->size)
                        die("object %s changed size!?", sha1_to_hex(sha1));
 
                write_or_die(fd, contents, size);
@@ -239,7 +247,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt,
                return 0;
        }
 
-       if (sha1_object_info_extended(data->sha1, &data->info) < 0) {
+       if (sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
                printf("%s missing\n", obj_name);
                fflush(stdout);
                return 0;
@@ -275,6 +283,13 @@ static int batch_objects(struct batch_options *opt)
        strbuf_expand(&buf, opt->format, expand_format, &data);
        data.mark_query = 0;
 
+       /*
+        * If we are printing out the object, then always fill in the type,
+        * since we will want to decide whether or not to stream.
+        */
+       if (opt->print_contents)
+               data.info.typep = &data.type;
+
        /*
         * We are going to call get_sha1 on a potentially very large number of
         * objects. In most large cases, these will be actual object sha1s. The