Code

Merge branch 'nd/stream-more'
authorJunio C Hamano <gitster@pobox.com>
Mon, 16 Apr 2012 05:50:38 +0000 (22:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Apr 2012 05:50:39 +0000 (22:50 -0700)
Use API to read blob data in smaller chunks in more places to reduce the
memory footprint.

By Nguyễn Thái Ngọc Duy (6) and Junio C Hamano (1)
* nd/stream-more:
  update-server-info: respect core.bigfilethreshold
  fsck: use streaming API for writing lost-found blobs
  show: use streaming API for showing blobs
  parse_object: avoid putting whole blob in core
  cat-file: use streaming API to print blobs
  Add more large blob test cases
  streaming: make streaming-write-entry to be more reusable

1  2 
builtin/log.c

diff --combined builtin/log.c
index 8a47012b0bd2fefe616c44b918d16a18463b5d2a,d1702e75807a94d75176451e9d8ef6b194263780..690caa7830b2a4549012db5e46794118bc36e989
@@@ -20,6 -20,7 +20,7 @@@
  #include "string-list.h"
  #include "parse-options.h"
  #include "branch.h"
+ #include "streaming.h"
  
  /* Set a default date-time format for git log ("log.date" config variable) */
  static const char *default_date_mode = NULL;
@@@ -77,8 -78,6 +78,8 @@@ static void cmd_log_init_defaults(struc
                get_commit_format(fmt_pretty, rev);
        rev->verbose_header = 1;
        DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
 +      rev->diffopt.stat_width = -1; /* use full terminal width */
 +      rev->diffopt.stat_graph_width = -1; /* respect statGraphWidth config */
        rev->abbrev_commit = default_abbrev_commit;
        rev->show_root_diff = default_show_root;
        rev->subject_prefix = fmt_patch_subject_prefix;
@@@ -383,8 -382,13 +384,13 @@@ static void show_tagger(char *buf, int 
        strbuf_release(&out);
  }
  
- static int show_object(const unsigned char *sha1, int show_tag_object,
-       struct rev_info *rev)
+ static int show_blob_object(const unsigned char *sha1, struct rev_info *rev)
+ {
+       fflush(stdout);
+       return stream_blob_to_fd(1, sha1, NULL, 0);
+ }
+ static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
  {
        unsigned long size;
        enum object_type type;
        if (!buf)
                return error(_("Could not read object %s"), sha1_to_hex(sha1));
  
-       if (show_tag_object)
-               while (offset < size && buf[offset] != '\n') {
-                       int new_offset = offset + 1;
-                       while (new_offset < size && buf[new_offset++] != '\n')
-                               ; /* do nothing */
-                       if (!prefixcmp(buf + offset, "tagger "))
-                               show_tagger(buf + offset + 7,
-                                           new_offset - offset - 7, rev);
-                       offset = new_offset;
-               }
+       assert(type == OBJ_TAG);
+       while (offset < size && buf[offset] != '\n') {
+               int new_offset = offset + 1;
+               while (new_offset < size && buf[new_offset++] != '\n')
+                       ; /* do nothing */
+               if (!prefixcmp(buf + offset, "tagger "))
+                       show_tagger(buf + offset + 7,
+                                   new_offset - offset - 7, rev);
+               offset = new_offset;
+       }
  
        if (offset < size)
                fwrite(buf + offset, size - offset, 1, stdout);
@@@ -449,8 -453,6 +455,8 @@@ int cmd_show(int argc, const char **arg
        rev.diff = 1;
        rev.always_show_header = 1;
        rev.no_walk = 1;
 +      rev.diffopt.stat_width = -1;    /* Scale to real terminal size */
 +
        memset(&opt, 0, sizeof(opt));
        opt.def = "HEAD";
        opt.tweak = show_rev_tweak_rev;
                const char *name = objects[i].name;
                switch (o->type) {
                case OBJ_BLOB:
-                       ret = show_object(o->sha1, 0, NULL);
+                       ret = show_blob_object(o->sha1, NULL);
                        break;
                case OBJ_TAG: {
                        struct tag *t = (struct tag *)o;
                                        diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
                                        t->tag,
                                        diff_get_color_opt(&rev.diffopt, DIFF_RESET));
-                       ret = show_object(o->sha1, 1, &rev);
+                       ret = show_tag_object(o->sha1, &rev);
                        rev.shown_one = 1;
                        if (ret)
                                break;