From: Junio C Hamano Date: Mon, 16 Apr 2012 05:50:38 +0000 (-0700) Subject: Merge branch 'nd/stream-more' X-Git-Url: https://git.tokkee.org/?p=git.git;a=commitdiff_plain;h=47de6b0425c79081e64756dcc019bb26344bf7ad;hp=-c Merge branch 'nd/stream-more' 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 --- 47de6b0425c79081e64756dcc019bb26344bf7ad diff --combined builtin/log.c index 8a47012b0,d1702e758..690caa783 --- a/builtin/log.c +++ b/builtin/log.c @@@ -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; @@@ -394,16 -398,16 +400,16 @@@ 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; @@@ -463,7 -465,7 +469,7 @@@ 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; @@@ -474,7 -476,7 +480,7 @@@ 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;