/*
 * Copyright (c) 2005, 2006 Rene Scharfe
 */
#include <time.h>
#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++] = "git-archive";
	nargv[nargc++] = "--format=tar";

	if (2 <= argc && !strncmp("--remote=", argv[1], 9)) {
		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 = xread(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 = xwrite(1, content + 11, 41);
	if (n < 41)
		die("git-get-tar-commit-id: write error");

	return 0;
}
