Merge branch 'jk/cat-file-buffered-batch-all'
authorJunio C Hamano <gitster@pobox.com>
Tue, 31 May 2016 19:40:54 +0000 (12:40 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 31 May 2016 19:40:54 +0000 (12:40 -0700)
"git cat-file --batch-all" has been sped up, by taking advantage
of the fact that it does not have to read a list of objects, in two
ways.

* jk/cat-file-buffered-batch-all:
cat-file: default to --buffer when --batch-all-objects is used
cat-file: avoid noop calls to sha1_object_info_extended

1  2 
builtin/cat-file.c
diff --combined builtin/cat-file.c
index 54db1184a003897294b6aaa46bc6bf29faa919bc,8f114add3874045ef35702d8965ce661309c508c..618103fdeeb7f7b35911ebd12d0d811cc4a5297a
@@@ -154,6 -154,13 +154,13 @@@ struct expand_data 
         * elements above, so you can retrieve the response from there.
         */
        struct object_info info;
+       /*
+        * This flag will be true if the requested batch format and options
+        * don't require us to call sha1_object_info, which can then be
+        * optimized out.
+        */
+       unsigned skip_object_info : 1;
  };
  
  static int is_atom(const char *atom, const char *s, int slen)
@@@ -258,7 -265,8 +265,8 @@@ static void batch_object_write(const ch
  {
        struct strbuf buf = STRBUF_INIT;
  
-       if (sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
+       if (!data->skip_object_info &&
+           sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
                printf("%s missing\n", obj_name ? obj_name : sha1_to_hex(data->sha1));
                fflush(stdout);
                return;
@@@ -369,6 -377,13 +377,13 @@@ static int batch_objects(struct batch_o
        strbuf_expand(&buf, opt->format, expand_format, &data);
        data.mark_query = 0;
  
+       if (opt->all_objects) {
+               struct object_info empty;
+               memset(&empty, 0, sizeof(empty));
+               if (!memcmp(&data.info, &empty, sizeof(empty)))
+                       data.skip_object_info = 1;
+       }
        /*
         * If we are printing out the object, then always fill in the type,
         * since we will want to decide whether or not to stream.
        save_warning = warn_on_object_refname_ambiguity;
        warn_on_object_refname_ambiguity = 0;
  
 -      while (strbuf_getline(&buf, stdin, '\n') != EOF) {
 +      while (strbuf_getline(&buf, stdin) != EOF) {
                if (data.split_on_whitespace) {
                        /*
                         * Split at first whitespace, tying off the beginning
@@@ -489,6 -504,7 +504,7 @@@ int cmd_cat_file(int argc, const char *
  
        git_config(git_cat_file_config, NULL);
  
+       batch.buffer_output = -1;
        argc = parse_options(argc, argv, prefix, options, cat_file_usage, 0);
  
        if (opt) {
                usage_with_options(cat_file_usage, options);
        }
  
+       if (batch.buffer_output < 0)
+               batch.buffer_output = batch.all_objects;
        if (batch.enabled)
                return batch_objects(&batch);