configure.ac: link with -liconv for locale_charset()
[gitweb.git] / builtin / cat-file.c
index 0e64b4159c4f8a81ed1d346631f6c3894297ceeb..425346048bbba66874eb857985bed9937c44e1d6 100644 (file)
@@ -119,7 +119,6 @@ struct expand_data {
        enum object_type type;
        unsigned long size;
        unsigned long disk_size;
-       const char *rest;
 
        /*
         * If mark_query is true, we do not expand anything, but rather
@@ -150,7 +149,9 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
                if (!data->mark_query)
                        strbuf_addstr(sb, sha1_to_hex(data->sha1));
        } else if (is_atom("objecttype", atom, len)) {
-               if (!data->mark_query)
+               if (data->mark_query)
+                       data->info.typep = &data->type;
+               else
                        strbuf_addstr(sb, typename(data->type));
        } else if (is_atom("objectsize", atom, len)) {
                if (data->mark_query)
@@ -162,9 +163,6 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
                        data->info.disk_sizep = &data->disk_size;
                else
                        strbuf_addf(sb, "%lu", data->disk_size);
-       } else if (is_atom("rest", atom, len)) {
-               if (!data->mark_query && data->rest)
-                       strbuf_addstr(sb, data->rest);
        } else
                die("unknown format element: %.*s", len, atom);
 }
@@ -229,8 +227,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt,
                return 0;
        }
 
-       data->type = sha1_object_info_extended(data->sha1, &data->info);
-       if (data->type <= 0) {
+       if (sha1_object_info_extended(data->sha1, &data->info) < 0) {
                printf("%s missing\n", obj_name);
                fflush(stdout);
                return 0;
@@ -266,22 +263,17 @@ static int batch_objects(struct batch_options *opt)
        strbuf_expand(&buf, opt->format, expand_format, &data);
        data.mark_query = 0;
 
-       while (strbuf_getline(&buf, stdin, '\n') != EOF) {
-               char *p;
-               int error;
-
-               /*
-                * Split at first whitespace, tying off the beginning of the
-                * string and saving the remainder (or NULL) in data.rest.
-                */
-               p = strpbrk(buf.buf, " \t");
-               if (p) {
-                       while (*p && strchr(" \t", *p))
-                               *p++ = '\0';
-               }
-               data.rest = p;
+       /*
+        * 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
+        * cost to double-check that each one is not also a ref (just so we can
+        * warn) ends up dwarfing the actual cost of the object lookups
+        * themselves. We can work around it by just turning off the warning.
+        */
+       warn_on_object_refname_ambiguity = 0;
 
-               error = batch_one_object(buf.buf, opt, &data);
+       while (strbuf_getline(&buf, stdin, '\n') != EOF) {
+               int error = batch_one_object(buf.buf, opt, &data);
                if (error)
                        return error;
        }