[PATCH] Finish initial cut of git-pack-object/git-unpack-object pair.
[git] / cat-file.c
1 /*
2  * GIT - The information manager from hell
3  *
4  * Copyright (C) Linus Torvalds, 2005
5  */
6 #include "cache.h"
7
8 int main(int argc, char **argv)
9 {
10         unsigned char sha1[20];
11         char type[20];
12         void *buf;
13         unsigned long size;
14
15         if (argc != 3 || get_sha1(argv[2], sha1))
16                 usage("git-cat-file [-t | tagname] <sha1>");
17
18         if (!strcmp("-t", argv[1])) {
19                 buf = read_sha1_file(sha1, type, &size);
20                 if (buf) {
21                         buf = type;
22                         size = strlen(type);
23                         type[size] = '\n';
24                         size++;
25                 }
26         } else {
27                 buf = read_object_with_reference(sha1, argv[1], &size, NULL);
28         }
29
30         if (!buf)
31                 die("git-cat-file %s: bad file", argv[2]);
32
33         while (size > 0) {
34                 long ret = write(1, buf, size);
35                 if (ret < 0) {
36                         if (errno == EAGAIN)
37                                 continue;
38                         /* Ignore epipe */
39                         if (errno == EPIPE)
40                                 break;
41                         die("git-cat-file: %s", strerror(errno));
42                 } else if (!ret) {
43                         die("git-cat-file: disk full?");
44                 }
45                 size -= ret;
46                 buf += ret;
47         }
48         return 0;
49 }