git
1/*
2* Copyright (c) 2005, 2006 Rene Scharfe
3*/
4#include "builtin.h"5#include "commit.h"6#include "tar.h"7
8static const char builtin_get_tar_commit_id_usage[] =9"git get-tar-commit-id";10
11/* ustar header + extended global header content */
12#define RECORDSIZE (512)13#define HEADERSIZE (2 * RECORDSIZE)14
15int cmd_get_tar_commit_id(int argc, const char **argv UNUSED, const char *prefix)16{
17char buffer[HEADERSIZE];18struct ustar_header *header = (struct ustar_header *)buffer;19char *content = buffer + RECORDSIZE;20const char *comment;21ssize_t n;22long len;23char *end;24
25BUG_ON_NON_EMPTY_PREFIX(prefix);26
27if (argc != 1)28usage(builtin_get_tar_commit_id_usage);29
30n = read_in_full(0, buffer, HEADERSIZE);31if (n < 0)32die_errno("git get-tar-commit-id: read error");33if (n != HEADERSIZE)34die_errno("git get-tar-commit-id: EOF before reading tar header");35if (header->typeflag[0] != TYPEFLAG_GLOBAL_HEADER)36return 1;37
38errno = 0;39len = strtol(content, &end, 10);40if (errno == ERANGE || end == content || len < 0)41return 1;42if (!skip_prefix(end, " comment=", &comment))43return 1;44len -= comment - content;45if (len < 1 || !(len % 2) ||46hash_algo_by_length((len - 1) / 2) == GIT_HASH_UNKNOWN)47return 1;48
49if (write_in_full(1, comment, len) < 0)50die_errno("git get-tar-commit-id: write error");51
52return 0;53}
54