show: use streaming API for showing blobs

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy
2012-03-07 17:54:19 +07:00
committed by Junio C Hamano
parent 090ea12671
commit 74775a09b1
2 changed files with 21 additions and 15 deletions

View File

@ -20,6 +20,7 @@
#include "string-list.h" #include "string-list.h"
#include "parse-options.h" #include "parse-options.h"
#include "branch.h" #include "branch.h"
#include "streaming.h"
/* Set a default date-time format for git log ("log.date" config variable) */ /* Set a default date-time format for git log ("log.date" config variable) */
static const char *default_date_mode = NULL; static const char *default_date_mode = NULL;
@ -381,8 +382,13 @@ static void show_tagger(char *buf, int len, struct rev_info *rev)
strbuf_release(&out); strbuf_release(&out);
} }
static int show_object(const unsigned char *sha1, int show_tag_object, static int show_blob_object(const unsigned char *sha1, struct rev_info *rev)
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; unsigned long size;
enum object_type type; enum object_type type;
@ -392,16 +398,16 @@ static int show_object(const unsigned char *sha1, int show_tag_object,
if (!buf) if (!buf)
return error(_("Could not read object %s"), sha1_to_hex(sha1)); return error(_("Could not read object %s"), sha1_to_hex(sha1));
if (show_tag_object) assert(type == OBJ_TAG);
while (offset < size && buf[offset] != '\n') { while (offset < size && buf[offset] != '\n') {
int new_offset = offset + 1; int new_offset = offset + 1;
while (new_offset < size && buf[new_offset++] != '\n') while (new_offset < size && buf[new_offset++] != '\n')
; /* do nothing */ ; /* do nothing */
if (!prefixcmp(buf + offset, "tagger ")) if (!prefixcmp(buf + offset, "tagger "))
show_tagger(buf + offset + 7, show_tagger(buf + offset + 7,
new_offset - offset - 7, rev); new_offset - offset - 7, rev);
offset = new_offset; offset = new_offset;
} }
if (offset < size) if (offset < size)
fwrite(buf + offset, size - offset, 1, stdout); fwrite(buf + offset, size - offset, 1, stdout);
@ -459,7 +465,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
const char *name = objects[i].name; const char *name = objects[i].name;
switch (o->type) { switch (o->type) {
case OBJ_BLOB: case OBJ_BLOB:
ret = show_object(o->sha1, 0, NULL); ret = show_blob_object(o->sha1, NULL);
break; break;
case OBJ_TAG: { case OBJ_TAG: {
struct tag *t = (struct tag *)o; struct tag *t = (struct tag *)o;
@ -470,7 +476,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
diff_get_color_opt(&rev.diffopt, DIFF_COMMIT), diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
t->tag, t->tag,
diff_get_color_opt(&rev.diffopt, DIFF_RESET)); 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; rev.shown_one = 1;
if (ret) if (ret)
break; break;

View File

@ -125,7 +125,7 @@ test_expect_success 'cat-file a large file from a tag' '
git cat-file blob largefiletag >/dev/null git cat-file blob largefiletag >/dev/null
' '
test_expect_failure 'git-show a large file' ' test_expect_success 'git-show a large file' '
git show :large1 >/dev/null git show :large1 >/dev/null
' '