/*
 * Copyright (c) 2005, 2006 Rene Scharfe
 */
#include "cache.h"
#include "commit.h"
#include "tar.h"
#include "builtin.h"
#include "quote.h"

static const char tar_tree_usage[] =
"git tar-tree [--remote=<repo>] <tree-ish> [basedir]\n"
"*** Note that this command is now deprecated; use \"git archive\" instead.";

int cmd_tar_tree(int argc, const char **argv, const char *prefix)
{
	/*
	 * "git tar-tree" is now a wrapper around "git archive --format=tar"
	 *
	 * $0 --remote=<repo> arg... ==>
	 *	git archive --format=tar --remote=<repo> arg...
	 * $0 tree-ish ==>
	 *	git archive --format=tar tree-ish
	 * $0 tree-ish basedir ==>
	 * 	git archive --format-tar --prefix=basedir tree-ish
	 */
	int i;
	const char **nargv = xcalloc(sizeof(*nargv), argc + 2);
	char *basedir_arg;
	int nargc = 0;

	nargv[nargc++] = "archive";
	nargv[nargc++] = "--format=tar";

	if (2 <= argc && !prefixcmp(argv[1], "--remote=")) {
		nargv[nargc++] = argv[1];
		argv++;
		argc--;
	}
	switch (argc) {
	default:
		usage(tar_tree_usage);
		break;
	case 3:
		/* base-path */
		basedir_arg = xmalloc(strlen(argv[2]) + 11);
		sprintf(basedir_arg, "--prefix=%s/", argv[2]);
		nargv[nargc++] = basedir_arg;
		/* fallthru */
	case 2:
		/* tree-ish */
		nargv[nargc++] = argv[1];
	}
	nargv[nargc] = NULL;

	fprintf(stderr,
		"*** \"git tar-tree\" is now deprecated.\n"
		"*** Running \"git archive\" instead.\n***");
	for (i = 0; i < nargc; i++) {
		fputc(' ', stderr);
		sq_quote_print(stderr, nargv[i]);
	}
	fputc('\n', stderr);
	return cmd_archive(nargc, nargv, prefix);
}

/* ustar header + extended global header content */
#define RECORDSIZE	(512)
#define HEADERSIZE (2 * RECORDSIZE)

int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
{
	char buffer[HEADERSIZE];
	struct ustar_header *header = (struct ustar_header *)buffer;
	char *content = buffer + RECORDSIZE;
	ssize_t n;

	n = read_in_full(0, buffer, HEADERSIZE);
	if (n < HEADERSIZE)
		die("git get-tar-commit-id: read error");
	if (header->typeflag[0] != 'g')
		return 1;
	if (memcmp(content, "52 comment=", 11))
		return 1;

	n = write_in_full(1, content + 11, 41);
	if (n < 41)
		die("git get-tar-commit-id: write error");

	return 0;
}
