/*
 * Copyright (C) 2005 Junio C Hamano
 */
#include "cache.h"
#include "strbuf.h"
#include "diff.h"

static const char *pickaxe = NULL;
static int pickaxe_opts = 0;
static const char *orderfile = NULL;
static const char *diff_filter = NULL;
static int line_termination = '\n';
static int inter_name_termination = '\t';

static void flush_them(int ac, const char **av)
{
	diffcore_std_no_resolve(av + 1,
				pickaxe, pickaxe_opts,
				orderfile, diff_filter);
	diff_flush(DIFF_FORMAT_PATCH, '\n');
}

static const char diff_helper_usage[] =
"git-diff-helper [-z] [-O<orderfile>] [-S<string>] [--pickaxe-all] [<path>...]";

int main(int ac, const char **av) {
	struct strbuf sb;
	const char *garbage_flush_format;

	strbuf_init(&sb);

	while (1 < ac && av[1][0] == '-') {
		if (av[1][1] == 'z')
			line_termination = inter_name_termination = 0;
		else if (av[1][1] == 'S') {
			pickaxe = av[1] + 2;
		}
		else if (!strcmp(av[1], "--pickaxe-all"))
			pickaxe_opts = DIFF_PICKAXE_ALL;
		else if (!strncmp(av[1], "--diff-filter=", 14))
			diff_filter = av[1] + 14;
		else if (!strncmp(av[1], "-O", 2))
			orderfile = av[1] + 2;
		else
			usage(diff_helper_usage);
		ac--; av++;
	}
	garbage_flush_format = (line_termination == 0) ? "%s" : "%s\n";

	/* the remaining parameters are paths patterns */

	diff_setup(0);
	while (1) {
		unsigned old_mode, new_mode;
		unsigned char old_sha1[20], new_sha1[20];
		char old_path[PATH_MAX];
		int status, score, two_paths;
		char new_path[PATH_MAX];

		int ch;
		char *cp, *ep;

		read_line(&sb, stdin, line_termination);
		if (sb.eof)
			break;
		switch (sb.buf[0]) {
		case ':':
			/* parse the first part up to the status */
			cp = sb.buf + 1;
			old_mode = new_mode = 0;
			while ((ch = *cp) && ('0' <= ch && ch <= '7')) {
				old_mode = (old_mode << 3) | (ch - '0');
				cp++;
			}
			if (*cp++ != ' ')
				break;
			while ((ch = *cp) && ('0' <= ch && ch <= '7')) {
				new_mode = (new_mode << 3) | (ch - '0');
				cp++;
			}
			if (*cp++ != ' ')
				break;
			if (get_sha1_hex(cp, old_sha1))
				break;
			cp += 40;
			if (*cp++ != ' ')
				break;
			if (get_sha1_hex(cp, new_sha1))
				break;
			cp += 40;
			if (*cp++ != ' ')
				break;
			status = *cp++;
			if (!strchr("AMCRDU", status))
				break;
			two_paths = score = 0;
			if (status == DIFF_STATUS_RENAMED ||
			    status == DIFF_STATUS_COPIED)
				two_paths = 1;

			/* pick up score if exists */
			if (sscanf(cp, "%d", &score) != 1)
				score = 0;
			cp = strchr(cp,
				    inter_name_termination);
			if (!cp)
				break;
			if (*cp++ != inter_name_termination)
				break;

			/* first pathname */
			if (!line_termination) {
				read_line(&sb, stdin, line_termination);
				if (sb.eof)
					break;
				strcpy(old_path, sb.buf);
			}
			else if (!two_paths)
				strcpy(old_path, cp);
			else {
				ep = strchr(cp, inter_name_termination);
				if (!ep)
					break;
				strncpy(old_path, cp, ep-cp);
				old_path[ep-cp] = 0;
				cp = ep + 1;
			}

			/* second pathname */
			if (!two_paths)
				strcpy(new_path, old_path);
			else {
				if (!line_termination) {
					read_line(&sb, stdin,
						  line_termination);
					if (sb.eof)
						break;
					strcpy(new_path, sb.buf);
				}
				else
					strcpy(new_path, cp);
			}
			diff_helper_input(old_mode, new_mode,
					  old_sha1, new_sha1,
					  old_path, status, score,
					  new_path);
			continue;
		}
		flush_them(ac, av);
		printf(garbage_flush_format, sb.buf);
	}
	flush_them(ac, av);
	return 0;
}
