#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS

#include "git-compat-util.h"
#include "git-zlib.h"
#include "config.h"
#include "builtin.h"
#include "exec-cmd.h"
#include "run-command.h"
#include "levenshtein.h"
#include "gettext.h"
#include "hash.h"
#include "help.h"
#include "command-list.h"
#include "string-list.h"
#include "column.h"
#include "version.h"
#include "refs.h"
#include "parse-options.h"
#include "prompt.h"
#include "fsmonitor-ipc.h"
#include "repository.h"
#include "alias.h"
#include "utf8.h"

#ifndef NO_CURL
#include "git-curl-compat.h" /* For LIBCURL_VERSION only */
#endif

struct category_description {
	uint32_t category;
	const char *desc;
};
static uint32_t common_mask =
	CAT_init | CAT_worktree | CAT_info |
	CAT_history | CAT_remote;
static struct category_description common_categories[] = {
	{ CAT_init, N_("start a working area (see also: git help tutorial)") },
	{ CAT_worktree, N_("work on the current change (see also: git help everyday)") },
	{ CAT_info, N_("examine the history and state (see also: git help revisions)") },
	{ CAT_history, N_("grow, mark and tweak your common history") },
	{ CAT_remote, N_("collaborate (see also: git help workflows)") },
	{ 0, NULL }
};
static struct category_description main_categories[] = {
	{ CAT_mainporcelain, N_("Main Porcelain Commands") },
	{ CAT_ancillarymanipulators, N_("Ancillary Commands / Manipulators") },
	{ CAT_ancillaryinterrogators, N_("Ancillary Commands / Interrogators") },
	{ CAT_foreignscminterface, N_("Interacting with Others") },
	{ CAT_plumbingmanipulators, N_("Low-level Commands / Manipulators") },
	{ CAT_plumbinginterrogators, N_("Low-level Commands / Interrogators") },
	{ CAT_synchingrepositories, N_("Low-level Commands / Syncing Repositories") },
	{ CAT_purehelpers, N_("Low-level Commands / Internal Helpers") },
	{ CAT_userinterfaces, N_("User-facing repository, command and file interfaces") },
	{ CAT_developerinterfaces, N_("Developer-facing file formats, protocols and other interfaces") },
	{ 0, NULL }
};

static const char *drop_prefix(const char *name, uint32_t category)
{
	const char *new_name;
	const char *prefix;

	switch (category) {
	case CAT_guide:
	case CAT_userinterfaces:
	case CAT_developerinterfaces:
		prefix = "git";
		break;
	default:
		prefix = "git-";
		break;
	}
	if (skip_prefix(name, prefix, &new_name))
		return new_name;

	return name;
}

static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
{
	int i, nr = 0;
	struct cmdname_help *cmds;

	if (ARRAY_SIZE(command_list) == 0)
		BUG("empty command_list[] is a sign of broken generate-cmdlist.sh");

	ALLOC_ARRAY(cmds, ARRAY_SIZE(command_list) + 1);

	for (i = 0; i < ARRAY_SIZE(command_list); i++) {
		const struct cmdname_help *cmd = command_list + i;

		if (!(cmd->category & mask))
			continue;

		cmds[nr] = *cmd;
		cmds[nr].name = drop_prefix(cmd->name, cmd->category);

		nr++;
	}
	cmds[nr].name = NULL;
	*p_cmds = cmds;
}

static void print_command_list(const struct cmdname_help *cmds,
			       uint32_t mask, int longest)
{
	int i;

	for (i = 0; cmds[i].name; i++) {
		if (cmds[i].category & mask) {
			size_t len = utf8_strwidth(cmds[i].name);
			printf("   %s   ", cmds[i].name);
			if (longest > len)
				mput_char(' ', longest - len);
			puts(_(cmds[i].help));
		}
	}
}

static int cmd_name_cmp(const void *elem1, const void *elem2)
{
	const struct cmdname_help *e1 = elem1;
	const struct cmdname_help *e2 = elem2;

	return strcmp(e1->name, e2->name);
}

static void print_cmd_by_category(const struct category_description *catdesc,
				  int *longest_p)
{
	struct cmdname_help *cmds;
	int longest = 0;
	int i, nr = 0;
	uint32_t mask = 0;

	for (i = 0; catdesc[i].desc; i++)
		mask |= catdesc[i].category;

	extract_cmds(&cmds, mask);

	for (i = 0; cmds[i].name; i++, nr++) {
		if (longest < strlen(cmds[i].name))
			longest = strlen(cmds[i].name);
	}
	QSORT(cmds, nr, cmd_name_cmp);

	for (i = 0; catdesc[i].desc; i++) {
		uint32_t mask = catdesc[i].category;
		const char *desc = catdesc[i].desc;

		if (i)
			putchar('\n');
		puts(_(desc));
		print_command_list(cmds, mask, longest);
	}
	free(cmds);
	if (longest_p)
		*longest_p = longest;
}

void add_cmdname(struct cmdnames *cmds, const char *name, int len)
{
	struct cmdname *ent;
	FLEX_ALLOC_MEM(ent, name, name, len);
	ent->len = len;

	ALLOC_GROW(cmds->names, cmds->cnt + 1, cmds->alloc);
	cmds->names[cmds->cnt++] = ent;
}

void cmdnames_release(struct cmdnames *cmds)
{
	int i;
	for (i = 0; i < cmds->cnt; ++i)
		free(cmds->names[i]);
	free(cmds->names);
	cmds->cnt = 0;
	cmds->alloc = 0;
}

static int cmdname_compare(const void *a_, const void *b_)
{
	struct cmdname *a = *(struct cmdname **)a_;
	struct cmdname *b = *(struct cmdname **)b_;
	return strcmp(a->name, b->name);
}

static void uniq(struct cmdnames *cmds)
{
	int i, j;

	if (!cmds->cnt)
		return;

	for (i = j = 1; i < cmds->cnt; i++) {
		if (!strcmp(cmds->names[i]->name, cmds->names[j-1]->name))
			free(cmds->names[i]);
		else
			cmds->names[j++] = cmds->names[i];
	}

	cmds->cnt = j;
}

void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
{
	int ci, cj, ei;
	int cmp;

	ci = cj = ei = 0;
	while (ci < cmds->cnt && ei < excludes->cnt) {
		cmp = strcmp(cmds->names[ci]->name, excludes->names[ei]->name);
		if (cmp < 0)
			cmds->names[cj++] = cmds->names[ci++];
		else if (cmp == 0) {
			ei++;
			free(cmds->names[ci++]);
		} else
			ei++;
	}

	while (ci < cmds->cnt)
		cmds->names[cj++] = cmds->names[ci++];

	cmds->cnt = cj;
}

static void pretty_print_cmdnames(struct cmdnames *cmds, unsigned int colopts)
{
	struct string_list list = STRING_LIST_INIT_NODUP;
	struct column_options copts;
	int i;

	for (i = 0; i < cmds->cnt; i++)
		string_list_append(&list, cmds->names[i]->name);
	/*
	 * always enable column display, we only consult column.*
	 * about layout strategy and stuff
	 */
	colopts = (colopts & ~COL_ENABLE_MASK) | COL_ENABLED;
	memset(&copts, 0, sizeof(copts));
	copts.indent = "  ";
	copts.padding = 2;
	print_columns(&list, colopts, &copts);
	string_list_clear(&list, 0);
}

static void list_commands_in_dir(struct cmdnames *cmds,
					 const char *path,
					 const char *prefix)
{
	DIR *dir = opendir(path);
	struct dirent *de;
	struct strbuf buf = STRBUF_INIT;
	int len;

	if (!dir)
		return;
	if (!prefix)
		prefix = "git-";

	strbuf_addf(&buf, "%s/", path);
	len = buf.len;

	while ((de = readdir(dir)) != NULL) {
		const char *ent;
		size_t entlen;

		if (!skip_prefix(de->d_name, prefix, &ent))
			continue;

		strbuf_setlen(&buf, len);
		strbuf_addstr(&buf, de->d_name);
		if (!is_executable(buf.buf))
			continue;

		entlen = strlen(ent);
		strip_suffix(ent, ".exe", &entlen);

		add_cmdname(cmds, ent, entlen);
	}
	closedir(dir);
	strbuf_release(&buf);
}

void load_command_list(const char *prefix,
		struct cmdnames *main_cmds,
		struct cmdnames *other_cmds)
{
	const char *env_path = getenv("PATH");
	const char *exec_path = git_exec_path();

	load_builtin_commands(prefix, main_cmds);

	if (exec_path) {
		list_commands_in_dir(main_cmds, exec_path, prefix);
		QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare);
		uniq(main_cmds);
	}

	if (env_path) {
		char *paths, *path, *colon;
		path = paths = xstrdup(env_path);
		while (1) {
			if ((colon = strchr(path, PATH_SEP)))
				*colon = 0;
			if (!exec_path || strcmp(path, exec_path))
				list_commands_in_dir(other_cmds, path, prefix);

			if (!colon)
				break;
			path = colon + 1;
		}
		free(paths);

		QSORT(other_cmds->names, other_cmds->cnt, cmdname_compare);
		uniq(other_cmds);
	}
	exclude_cmds(other_cmds, main_cmds);
}

static int get_colopts(const char *var, const char *value,
		       const struct config_context *ctx UNUSED, void *data)
{
	unsigned int *colopts = data;

	if (starts_with(var, "column."))
		return git_column_config(var, value, "help", colopts);

	return 0;
}

void list_commands(struct cmdnames *main_cmds, struct cmdnames *other_cmds)
{
	unsigned int colopts = 0;
	repo_config(the_repository, get_colopts, &colopts);

	if (main_cmds->cnt) {
		const char *exec_path = git_exec_path();
		printf_ln(_("available git commands in '%s'"), exec_path);
		putchar('\n');
		pretty_print_cmdnames(main_cmds, colopts);
		putchar('\n');
	}

	if (other_cmds->cnt) {
		puts(_("git commands available from elsewhere on your $PATH"));
		putchar('\n');
		pretty_print_cmdnames(other_cmds, colopts);
		putchar('\n');
	}
}

void list_common_cmds_help(void)
{
	puts(_("These are common Git commands used in various situations:"));
	putchar('\n');
	print_cmd_by_category(common_categories, NULL);
}

void list_all_main_cmds(struct string_list *list)
{
	struct cmdnames main_cmds, other_cmds;
	int i;

	memset(&main_cmds, 0, sizeof(main_cmds));
	memset(&other_cmds, 0, sizeof(other_cmds));
	load_command_list("git-", &main_cmds, &other_cmds);

	for (i = 0; i < main_cmds.cnt; i++)
		string_list_append(list, main_cmds.names[i]->name);

	cmdnames_release(&main_cmds);
	cmdnames_release(&other_cmds);
}

void list_all_other_cmds(struct string_list *list)
{
	struct cmdnames main_cmds, other_cmds;
	int i;

	memset(&main_cmds, 0, sizeof(main_cmds));
	memset(&other_cmds, 0, sizeof(other_cmds));
	load_command_list("git-", &main_cmds, &other_cmds);

	for (i = 0; i < other_cmds.cnt; i++)
		string_list_append(list, other_cmds.names[i]->name);

	cmdnames_release(&main_cmds);
	cmdnames_release(&other_cmds);
}

void list_cmds_by_category(struct string_list *list,
			   const char *cat)
{
	int i, n = ARRAY_SIZE(command_list);
	uint32_t cat_id = 0;

	for (i = 0; category_names[i]; i++) {
		if (!strcmp(cat, category_names[i])) {
			cat_id = 1UL << i;
			break;
		}
	}
	if (!cat_id)
		die(_("unsupported command listing type '%s'"), cat);

	for (i = 0; i < n; i++) {
		struct cmdname_help *cmd = command_list + i;

		if (!(cmd->category & cat_id))
			continue;
		string_list_append(list, drop_prefix(cmd->name, cmd->category));
	}
}

void list_cmds_by_config(struct string_list *list)
{
	const char *cmd_list;

	if (repo_config_get_string_tmp(the_repository, "completion.commands", &cmd_list))
		return;

	string_list_sort_u(list, 1);

	while (*cmd_list) {
		struct strbuf sb = STRBUF_INIT;
		const char *p = strchrnul(cmd_list, ' ');

		strbuf_add(&sb, cmd_list, p - cmd_list);
		if (sb.buf[0] == '-')
			string_list_remove(list, sb.buf + 1, 0);
		else
			string_list_insert(list, sb.buf);
		strbuf_release(&sb);
		while (*p == ' ')
			p++;
		cmd_list = p;
	}
}

void list_guides_help(void)
{
	struct category_description catdesc[] = {
		{ CAT_guide, N_("The Git concept guides are:") },
		{ 0, NULL }
	};
	print_cmd_by_category(catdesc, NULL);
	putchar('\n');
}

void list_user_interfaces_help(void)
{
	struct category_description catdesc[] = {
		{ CAT_userinterfaces, N_("User-facing repository, command and file interfaces:") },
		{ 0, NULL }
	};
	print_cmd_by_category(catdesc, NULL);
	putchar('\n');
}

void list_developer_interfaces_help(void)
{
	struct category_description catdesc[] = {
		{ CAT_developerinterfaces, N_("File formats, protocols and other developer interfaces:") },
		{ 0, NULL }
	};
	print_cmd_by_category(catdesc, NULL);
	putchar('\n');
}

static void list_all_cmds_help_external_commands(void)
{
	struct string_list others = STRING_LIST_INIT_DUP;
	int i;

	list_all_other_cmds(&others);
	if (others.nr)
		printf("\n%s\n", _("External commands"));
	for (i = 0; i < others.nr; i++)
		printf("   %s\n", others.items[i].string);
	string_list_clear(&others, 0);
}

static void list_all_cmds_help_aliases(int longest)
{
	struct string_list alias_list = STRING_LIST_INIT_DUP;
	struct cmdname_help *aliases;
	int i;

	list_aliases(&alias_list);
	string_list_sort(&alias_list);

	for (i = 0; i < alias_list.nr; i++) {
		size_t len = utf8_strwidth(alias_list.items[i].string);
		if (longest < len)
			longest = len;
	}

	if (alias_list.nr) {
		printf("\n%s\n", _("Command aliases"));
		ALLOC_ARRAY(aliases, alias_list.nr + 1);
		for (i = 0; i < alias_list.nr; i++) {
			aliases[i].name = alias_list.items[i].string;
			aliases[i].help = alias_list.items[i].util;
			aliases[i].category = 1;
		}
		aliases[alias_list.nr].name = NULL;
		print_command_list(aliases, 1, longest);
		free(aliases);
	}
	string_list_clear(&alias_list, 1);
}

void list_all_cmds_help(int show_external_commands, int show_aliases)
{
	int longest;

	puts(_("See 'git help <command>' to read about a specific subcommand"));
	putchar('\n');
	print_cmd_by_category(main_categories, &longest);

	if (show_external_commands)
		list_all_cmds_help_external_commands();
	if (show_aliases)
		list_all_cmds_help_aliases(longest);
}

int is_in_cmdlist(struct cmdnames *c, const char *s)
{
	int i;
	for (i = 0; i < c->cnt; i++)
		if (!strcmp(s, c->names[i]->name))
			return 1;
	return 0;
}

struct help_unknown_cmd_config {
	int autocorrect;
	struct cmdnames aliases;
};

#define AUTOCORRECT_SHOW (-4)
#define AUTOCORRECT_PROMPT (-3)
#define AUTOCORRECT_NEVER (-2)
#define AUTOCORRECT_IMMEDIATELY (-1)

static int parse_autocorrect(const char *value)
{
	switch (git_parse_maybe_bool_text(value)) {
		case 1:
			return AUTOCORRECT_IMMEDIATELY;
		case 0:
			return AUTOCORRECT_SHOW;
		default: /* other random text */
			break;
	}

	if (!strcmp(value, "prompt"))
		return AUTOCORRECT_PROMPT;
	if (!strcmp(value, "never"))
		return AUTOCORRECT_NEVER;
	if (!strcmp(value, "immediate"))
		return AUTOCORRECT_IMMEDIATELY;
	if (!strcmp(value, "show"))
		return AUTOCORRECT_SHOW;

	return 0;
}

static int git_unknown_cmd_config(const char *var, const char *value,
				  const struct config_context *ctx,
				  void *cb)
{
	struct help_unknown_cmd_config *cfg = cb;
	const char *subsection, *key;
	size_t subsection_len;

	if (!strcmp(var, "help.autocorrect")) {
		int v = parse_autocorrect(value);

		if (!v) {
			v = git_config_int(var, value, ctx->kvi);
			if (v < 0 || v == 1)
				v = AUTOCORRECT_IMMEDIATELY;
		}

		cfg->autocorrect = v;
	}

	/* Also use aliases for command lookup */
	if (!parse_config_key(var, "alias", &subsection, &subsection_len,
			      &key)) {
		if (subsection) {
			/* [alias "name"] command = value */
			if (!strcmp(key, "command"))
				add_cmdname(&cfg->aliases, subsection,
					    subsection_len);
		} else {
			/* alias.name = value */
			add_cmdname(&cfg->aliases, key, strlen(key));
		}
	}

	return 0;
}

static int levenshtein_compare(const void *p1, const void *p2)
{
	const struct cmdname *const *c1 = p1, *const *c2 = p2;
	const char *s1 = (*c1)->name, *s2 = (*c2)->name;
	int l1 = (*c1)->len;
	int l2 = (*c2)->len;
	return l1 != l2 ? l1 - l2 : strcmp(s1, s2);
}

static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
{
	int i;
	ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);

	for (i = 0; i < old->cnt; i++)
		cmds->names[cmds->cnt++] = old->names[i];
	FREE_AND_NULL(old->names);
	old->cnt = 0;
}

/* An empirically derived magic number */
#define SIMILARITY_FLOOR 7
#define SIMILAR_ENOUGH(x) ((x) < SIMILARITY_FLOOR)

static const char bad_interpreter_advice[] =
	N_("'%s' appears to be a git command, but we were not\n"
	"able to execute it. Maybe git-%s is broken?");

char *help_unknown_cmd(const char *cmd)
{
	struct help_unknown_cmd_config cfg = { 0 };
	int i, n, best_similarity = 0;
	struct cmdnames main_cmds = { 0 };
	struct cmdnames other_cmds = { 0 };
	struct cmdname_help *common_cmds;

	read_early_config(the_repository, git_unknown_cmd_config, &cfg);

	/*
	 * Disable autocorrection prompt in a non-interactive session
	 */
	if ((cfg.autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
		cfg.autocorrect = AUTOCORRECT_NEVER;

	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
		exit(1);
	}

	load_command_list("git-", &main_cmds, &other_cmds);

	add_cmd_list(&main_cmds, &cfg.aliases);
	add_cmd_list(&main_cmds, &other_cmds);
	QSORT(main_cmds.names, main_cmds.cnt, cmdname_compare);
	uniq(&main_cmds);

	extract_cmds(&common_cmds, common_mask);

	/* This abuses cmdname->len for levenshtein distance */
	for (i = 0, n = 0; i < main_cmds.cnt; i++) {
		int cmp = 0; /* avoid compiler stupidity */
		const char *candidate = main_cmds.names[i]->name;

		/*
		 * An exact match means we have the command, but
		 * for some reason exec'ing it gave us ENOENT; probably
		 * it's a bad interpreter in the #! line.
		 */
		if (!strcmp(candidate, cmd))
			die(_(bad_interpreter_advice), cmd, cmd);

		/* Does the candidate appear in common_cmds list? */
		while (common_cmds[n].name &&
		       (cmp = strcmp(common_cmds[n].name, candidate)) < 0)
			n++;
		if (common_cmds[n].name && !cmp) {
			/* Yes, this is one of the common commands */
			n++; /* use the entry from common_cmds[] */
			if (starts_with(candidate, cmd)) {
				/* Give prefix match a very good score */
				main_cmds.names[i]->len = 0;
				continue;
			}
		}

		main_cmds.names[i]->len =
			levenshtein(cmd, candidate, 0, 2, 1, 3) + 1;
	}
	FREE_AND_NULL(common_cmds);

	QSORT(main_cmds.names, main_cmds.cnt, levenshtein_compare);

	if (!main_cmds.cnt)
		die(_("Uh oh. Your system reports no Git commands at all."));

	/* skip and count prefix matches */
	for (n = 0; n < main_cmds.cnt && !main_cmds.names[n]->len; n++)
		; /* still counting */

	if (main_cmds.cnt <= n) {
		/* prefix matches with everything? that is too ambiguous */
		best_similarity = SIMILARITY_FLOOR + 1;
	} else {
		/* count all the most similar ones */
		for (best_similarity = main_cmds.names[n++]->len;
		     (n < main_cmds.cnt &&
		      best_similarity == main_cmds.names[n]->len);
		     n++)
			; /* still counting */
	}
	if (cfg.autocorrect && cfg.autocorrect != AUTOCORRECT_SHOW && n == 1 &&
	    SIMILAR_ENOUGH(best_similarity)) {
		char *assumed = xstrdup(main_cmds.names[0]->name);

		fprintf_ln(stderr,
			   _("WARNING: You called a Git command named '%s', "
			     "which does not exist."),
			   cmd);
		if (cfg.autocorrect == AUTOCORRECT_IMMEDIATELY)
			fprintf_ln(stderr,
				   _("Continuing under the assumption that "
				     "you meant '%s'."),
				   assumed);
		else if (cfg.autocorrect == AUTOCORRECT_PROMPT) {
			char *answer;
			struct strbuf msg = STRBUF_INIT;
			strbuf_addf(&msg, _("Run '%s' instead [y/N]? "), assumed);
			answer = git_prompt(msg.buf, PROMPT_ECHO);
			strbuf_release(&msg);
			if (!(starts_with(answer, "y") ||
			      starts_with(answer, "Y")))
				exit(1);
		} else {
			fprintf_ln(stderr,
				   _("Continuing in %0.1f seconds, "
				     "assuming that you meant '%s'."),
				   (float)cfg.autocorrect/10.0, assumed);
			sleep_millisec(cfg.autocorrect * 100);
		}

		cmdnames_release(&cfg.aliases);
		cmdnames_release(&main_cmds);
		cmdnames_release(&other_cmds);
		return assumed;
	}

	fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);

	if (SIMILAR_ENOUGH(best_similarity)) {
		fprintf_ln(stderr,
			   Q_("\nThe most similar command is",
			      "\nThe most similar commands are",
			   n));

		for (i = 0; i < n; i++)
			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
	}

	exit(1);
}

void get_version_info(struct strbuf *buf, int show_build_options)
{
	/*
	 * The format of this string should be kept stable for compatibility
	 * with external projects that rely on the output of "git version".
	 *
	 * Always show the version, even if other options are given.
	 */
	strbuf_addf(buf, "git version %s\n", git_version_string);

	if (show_build_options) {
		strbuf_addf(buf, "cpu: %s\n", GIT_HOST_CPU);
		if (git_built_from_commit_string[0])
			strbuf_addf(buf, "built from commit: %s\n",
			       git_built_from_commit_string);
		else
			strbuf_addstr(buf, "no commit associated with this build\n");
		strbuf_addf(buf, "sizeof-long: %d\n", (int)sizeof(long));
		strbuf_addf(buf, "sizeof-size_t: %d\n", (int)sizeof(size_t));
		strbuf_addf(buf, "shell-path: %s\n", SHELL_PATH);
		/* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */

#if defined WITH_RUST
		strbuf_addstr(buf, "rust: enabled\n");
#else
		strbuf_addstr(buf, "rust: disabled\n");
#endif

		if (fsmonitor_ipc__is_supported())
			strbuf_addstr(buf, "feature: fsmonitor--daemon\n");
#if !defined NO_GETTEXT
		strbuf_addstr(buf, "gettext: enabled\n");
#endif
#if defined LIBCURL_VERSION
		strbuf_addf(buf, "libcurl: %s\n", LIBCURL_VERSION);
#endif
#if defined OPENSSL_VERSION_TEXT
		strbuf_addf(buf, "OpenSSL: %s\n", OPENSSL_VERSION_TEXT);
#endif
#if defined ZLIBNG_VERSION
		strbuf_addf(buf, "zlib-ng: %s\n", ZLIBNG_VERSION);
#elif defined ZLIB_VERSION
		strbuf_addf(buf, "zlib: %s\n", ZLIB_VERSION);
#endif
		strbuf_addf(buf, "SHA-1: %s\n", SHA1_BACKEND);
#if defined SHA1_UNSAFE_BACKEND
		strbuf_addf(buf, "non-collision-detecting-SHA-1: %s\n",
			    SHA1_UNSAFE_BACKEND);
#endif
		strbuf_addf(buf, "SHA-256: %s\n", SHA256_BACKEND);
		strbuf_addf(buf, "default-ref-format: %s\n",
			    ref_storage_format_to_name(REF_STORAGE_FORMAT_DEFAULT));
		strbuf_addf(buf, "default-hash: %s\n", hash_algos[GIT_HASH_DEFAULT].name);
	}
}

int cmd_version(int argc, const char **argv, const char *prefix, struct repository *repository UNUSED)
{
	struct strbuf buf = STRBUF_INIT;
	int build_options = 0;
	const char * const usage[] = {
		N_("git version [--build-options]"),
		NULL
	};
	struct option options[] = {
		OPT_BOOL(0, "build-options", &build_options,
			 "also print build options"),
		OPT_END()
	};

	argc = parse_options(argc, argv, prefix, options, usage, 0);

	get_version_info(&buf, build_options);
	printf("%s", buf.buf);

	strbuf_release(&buf);

	return 0;
}

struct similar_ref_cb {
	const char *base_ref;
	struct string_list *similar_refs;
};

static int append_similar_ref(const struct reference *ref, void *cb_data)
{
	struct similar_ref_cb *cb = (struct similar_ref_cb *)(cb_data);
	const char *branch = strrchr(ref->name, '/') + 1;

	/* A remote branch of the same name is deemed similar */
	if (starts_with(ref->name, "refs/remotes/") &&
	    !strcmp(branch, cb->base_ref))
		string_list_append_nodup(cb->similar_refs,
					 refs_shorten_unambiguous_ref(get_main_ref_store(the_repository), ref->name, 1));
	return 0;
}

static struct string_list guess_refs(const char *ref)
{
	struct similar_ref_cb ref_cb;
	struct string_list similar_refs = STRING_LIST_INIT_DUP;

	ref_cb.base_ref = ref;
	ref_cb.similar_refs = &similar_refs;
	refs_for_each_ref(get_main_ref_store(the_repository),
			  append_similar_ref, &ref_cb);
	return similar_refs;
}

NORETURN void help_unknown_ref(const char *ref, const char *cmd,
			       const char *error)
{
	int i;
	struct string_list suggested_refs = guess_refs(ref);

	fprintf_ln(stderr, _("%s: %s - %s"), cmd, ref, error);

	if (suggested_refs.nr > 0) {
		fprintf_ln(stderr,
			   Q_("\nDid you mean this?",
			      "\nDid you mean one of these?",
			      suggested_refs.nr));
		for (i = 0; i < suggested_refs.nr; i++)
			fprintf(stderr, "\t%s\n", suggested_refs.items[i].string);
	}

	string_list_clear(&suggested_refs, 0);
	exit(1);
}
