Merge with master for gitk and doc updates.
[git/git-svn.git] / cat-file.c
blobef58970d82ae9d6e62ec43c496ac1677aedeee3f
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 | <type>] <sha1>");
18 if (!strcmp("-t", argv[1]) || !strcmp("-s", argv[1])) {
19 if (!sha1_object_info(sha1, type,
20 argv[1][1] == 's' ? &size : NULL)) {
21 switch (argv[1][1]) {
22 case 't':
23 printf("%s\n", type);
24 break;
25 case 's':
26 printf("%lu\n", size);
27 break;
29 return 0;
31 buf = NULL;
32 } else {
33 buf = read_object_with_reference(sha1, argv[1], &size, NULL);
36 if (!buf)
37 die("git-cat-file %s: bad file", argv[2]);
39 while (size > 0) {
40 long ret = write(1, buf, size);
41 if (ret < 0) {
42 if (errno == EAGAIN)
43 continue;
44 /* Ignore epipe */
45 if (errno == EPIPE)
46 break;
47 die("git-cat-file: %s", strerror(errno));
48 } else if (!ret) {
49 die("git-cat-file: disk full?");
51 size -= ret;
52 buf += ret;
54 return 0;