/*
 * Copyright (c) 2006 Junio C Hamano
 */
#include "cache.h"
#include "pkt-line.h"
#include "exec_cmd.h"
#include "builtin.h"

static const char upload_tar_usage[] = "git-upload-tar <repo>";

static int nak(const char *reason)
{
	packet_write(1, "NACK %s\n", reason);
	packet_flush(1);
	return 1;
}

int cmd_upload_tar(int argc, const char **argv, char **envp)
{
	int len;
	const char *dir = argv[1];
	char buf[8192];
	unsigned char sha1[20];
	char *base = NULL;
	char hex[41];
	int ac;
	const char *av[4];

	if (argc != 2)
		usage(upload_tar_usage);
	if (strlen(dir) < sizeof(buf)-1)
		strcpy(buf, dir); /* enter-repo smudges its argument */
	else
		packet_write(1, "NACK insanely long repository name %s\n", dir);
	if (!enter_repo(buf, 0)) {
		packet_write(1, "NACK not a git archive %s\n", dir);
		packet_flush(1);
		return 1;
	}

	len = packet_read_line(0, buf, sizeof(buf));
	if (len < 5 || strncmp("want ", buf, 5))
		return nak("expected want");
	if (buf[len-1] == '\n')
		buf[--len] = 0;
	if (get_sha1(buf + 5, sha1))
		return nak("expected sha1");
        strcpy(hex, sha1_to_hex(sha1));

	len = packet_read_line(0, buf, sizeof(buf));
	if (len) {
		if (len < 5 || strncmp("base ", buf, 5))
			return nak("expected (optional) base");
		if (buf[len-1] == '\n')
			buf[--len] = 0;
		base = strdup(buf + 5);
		len = packet_read_line(0, buf, sizeof(buf));
	}
	if (len)
		return nak("expected flush");

	packet_write(1, "ACK\n");
	packet_flush(1);

	ac = 0;
	av[ac++] = "tar-tree";
	av[ac++] = hex;
	if (base)
		av[ac++] = base;
	av[ac++] = NULL;
	execv_git_cmd(av);
	/* should it return that is an error */
	return 1;
}
