cat-file.con commit Add support for pushing to a remote repository using HTTP/DAV (58e60dd)
   1/*
   2 * GIT - The information manager from hell
   3 *
   4 * Copyright (C) Linus Torvalds, 2005
   5 */
   6#include "cache.h"
   7
   8int 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}