Slow but steady progress on git pack receive/send
[git/dscho.git] / cat-file.c
blob85a5d4caedec271f6c5e71ec3d7337b33447f581
1 /*
2 * GIT - The information manager from hell
4 * Copyright (C) Linus Torvalds, 2005
5 */
6 #include "cache.h"
8 int main(int argc, char **argv)
10 unsigned char sha1[20];
11 char type[20];
12 void *buf;
13 unsigned long size;
15 if (argc != 3 || get_sha1(argv[2], sha1))
16 usage("git-cat-file [-t | -s | tagname] <sha1>");
18 if (!strcmp("-t", argv[1]) || !strcmp("-s", argv[1])) {
19 if (!sha1_object_info(sha1, type, &size)) {
20 switch (argv[1][1]) {
21 case 't':
22 printf("%s\n", type);
23 break;
24 case 's':
25 printf("%lu\n", size);
26 break;
28 return 0;
30 buf = NULL;
31 } else {
32 buf = read_object_with_reference(sha1, argv[1], &size, NULL);
35 if (!buf)
36 die("git-cat-file %s: bad file", argv[2]);
38 while (size > 0) {
39 long ret = write(1, buf, size);
40 if (ret < 0) {
41 if (errno == EAGAIN)
42 continue;
43 /* Ignore epipe */
44 if (errno == EPIPE)
45 break;
46 die("git-cat-file: %s", strerror(errno));
47 } else if (!ret) {
48 die("git-cat-file: disk full?");
50 size -= ret;
51 buf += ret;
53 return 0;