Merge branch 'master' of .
[git/dscho.git] / cat-file.c
blobd775a1545beb84caf05cae8980fb2d839240fdea
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 setup_git_directory();
16 if (argc != 3 || get_sha1(argv[2], sha1))
17 usage("git-cat-file [-t | -s | <type>] <sha1>");
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;
30 return 0;
32 buf = NULL;
33 } else {
34 buf = read_object_with_reference(sha1, argv[1], &size, NULL);
37 if (!buf)
38 die("git-cat-file %s: bad file", argv[2]);
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?");
52 size -= ret;
53 buf += ret;
55 return 0;