Staging
v0.5.1
https://github.com/git/git
Raw File
Tip revision: 6fe5b7ff6cafcc94415deba2f3d611770d8e6b1e authored by Junio C Hamano on 02 October 2006, 07:43:52 UTC
git-push: .git/remotes/ file does not require SP after colon
Tip revision: 6fe5b7f
builtin-upload-tar.c
/*
 * 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, const char *prefix)
{
	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;
}
back to top