#ifndef COUNTERPART_ENV_NAME
#define COUNTERPART_ENV_NAME "GIT_SSH_UPLOAD"
#endif
#ifndef COUNTERPART_PROGRAM_NAME
#define COUNTERPART_PROGRAM_NAME "git-ssh-upload"
#endif
#ifndef MY_PROGRAM_NAME
#define MY_PROGRAM_NAME "git-ssh-fetch"
#endif

#include "cache.h"
#include "commit.h"
#include "rsh.h"
#include "fetch.h"
#include "refs.h"

static int fd_in;
static int fd_out;

static unsigned char remote_version = 0;
static unsigned char local_version = 1;

static ssize_t force_write(int fd, void *buffer, size_t length)
{
	ssize_t ret = 0;
	while (ret < length) {
		ssize_t size = write(fd, (char *) buffer + ret, length - ret);
		if (size < 0) {
			return size;
		}
		if (size == 0) {
			return ret;
		}
		ret += size;
	}
	return ret;
}

static int prefetches = 0;

static struct object_list *in_transit = NULL;
static struct object_list **end_of_transit = &in_transit;

void prefetch(unsigned char *sha1)
{
	char type = 'o';
	struct object_list *node;
	if (prefetches > 100) {
		fetch(in_transit->item->sha1);
	}
	node = xmalloc(sizeof(struct object_list));
	node->next = NULL;
	node->item = lookup_unknown_object(sha1);
	*end_of_transit = node;
	end_of_transit = &node->next;
	force_write(fd_out, &type, 1);
	force_write(fd_out, sha1, 20);
	prefetches++;
}

static char conn_buf[4096];
static size_t conn_buf_posn = 0;

int fetch(unsigned char *sha1)
{
	int ret;
	signed char remote;
	struct object_list *temp;

	if (memcmp(sha1, in_transit->item->sha1, 20)) {
		/* we must have already fetched it to clean the queue */
		return has_sha1_file(sha1) ? 0 : -1;
	}
	prefetches--;
	temp = in_transit;
	in_transit = in_transit->next;
	if (!in_transit)
		end_of_transit = &in_transit;
	free(temp);

	if (conn_buf_posn) {
		remote = conn_buf[0];
		memmove(conn_buf, conn_buf + 1, --conn_buf_posn);
	} else {
		if (read(fd_in, &remote, 1) < 1)
			return -1;
	}
	/* fprintf(stderr, "Got %d\n", remote); */
	if (remote < 0)
		return remote;
	ret = write_sha1_from_fd(sha1, fd_in, conn_buf, 4096, &conn_buf_posn);
	if (!ret)
		pull_say("got %s\n", sha1_to_hex(sha1));
	return ret;
}

static int get_version(void)
{
	char type = 'v';
	write(fd_out, &type, 1);
	write(fd_out, &local_version, 1);
	if (read(fd_in, &remote_version, 1) < 1) {
		return error("Couldn't read version from remote end");
	}
	return 0;
}

int fetch_ref(char *ref, unsigned char *sha1)
{
	signed char remote;
	char type = 'r';
	write(fd_out, &type, 1);
	write(fd_out, ref, strlen(ref) + 1);
	read(fd_in, &remote, 1);
	if (remote < 0)
		return remote;
	read(fd_in, sha1, 20);
	return 0;
}

static const char ssh_fetch_usage[] =
  MY_PROGRAM_NAME
  " [-c] [-t] [-a] [-v] [--recover] [-w ref] commit-id url";
int main(int argc, char **argv)
{
	const char *write_ref = NULL;
	char *commit_id;
	char *url;
	int arg = 1;
	const char *prog;

	prog = getenv("GIT_SSH_PUSH");
	if (!prog) prog = "git-ssh-upload";

	setup_ident();
	setup_git_directory();
	git_config(git_default_config);

	while (arg < argc && argv[arg][0] == '-') {
		if (argv[arg][1] == 't') {
			get_tree = 1;
		} else if (argv[arg][1] == 'c') {
			get_history = 1;
		} else if (argv[arg][1] == 'a') {
			get_all = 1;
			get_tree = 1;
			get_history = 1;
		} else if (argv[arg][1] == 'v') {
			get_verbosely = 1;
		} else if (argv[arg][1] == 'w') {
			write_ref = argv[arg + 1];
			arg++;
		} else if (!strcmp(argv[arg], "--recover")) {
			get_recover = 1;
		}
		arg++;
	}
	if (argc < arg + 2) {
		usage(ssh_fetch_usage);
		return 1;
	}
	commit_id = argv[arg];
	url = argv[arg + 1];

	if (setup_connection(&fd_in, &fd_out, prog, url, arg, argv + 1))
		return 1;

	if (get_version())
		return 1;

	if (pull(1, &commit_id, &write_ref, url))
		return 1;

	return 0;
}
