daemon.c: fix arg parsing bugs
[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         setup_git_directory();
16         if (argc != 3 || get_sha1(argv[2], sha1))
17                 usage("git-cat-file [-t | -s | <type>] <sha1>");
18
19         if (!strcmp("-t", argv[1]) || !strcmp("-s", argv[1])) {
20                 if (!sha1_object_info(sha1, type,
21                                       argv[1][1] == 's' ? &size : NULL)) {
22                         switch (argv[1][1]) {
23                         case 't':
24                                 printf("%s\n", type);
25                                 break;
26                         case 's':
27                                 printf("%lu\n", size);
28                                 break;
29                         }
30                         return 0;
31                 }
32                 buf = NULL;
33         } else {
34                 buf = read_object_with_reference(sha1, argv[1], &size, NULL);
35         }
36
37         if (!buf)
38                 die("git-cat-file %s: bad file", argv[2]);
39
40         while (size > 0) {
41                 long ret = write(1, buf, size);
42                 if (ret < 0) {
43                         if (errno == EAGAIN)
44                                 continue;
45                         /* Ignore epipe */
46                         if (errno == EPIPE)
47                                 break;
48                         die("git-cat-file: %s", strerror(errno));
49                 } else if (!ret) {
50                         die("git-cat-file: disk full?");
51                 }
52                 size -= ret;
53                 buf += ret;
54         }
55         return 0;
56 }