Staging
v0.8.1
Revision a970e84e8ad23a740e456fb4191ed61becef8989 authored by Shawn O. Pearce on 28 December 2006, 07:35:24 UTC, committed by Junio C Hamano on 29 December 2006, 03:06:16 UTC
To support wider use cases, such as from within `git am -3`, the
merge-recursive utility needs to accept not just commit-ish but
also tree-ish as arguments on its command line.

If given a tree-ish then merge-recursive will create a virtual commit
wrapping it, with the subject of the commit set to the best name we
can derive for that tree, which is either the command line string
(probably the SHA1), or whatever string appears in GITHEAD_*.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 7ba3c07
Raw File
builtin-tar-tree.c
/*
 * Copyright (c) 2005, 2006 Rene Scharfe
 */
#include "cache.h"
#include "commit.h"
#include "tar.h"
#include "builtin.h"
#include "quote.h"

static const char tar_tree_usage[] =
"git-tar-tree [--remote=<repo>] <tree-ish> [basedir]\n"
"*** Note that this command is now deprecated; use git-archive instead.";

int cmd_tar_tree(int argc, const char **argv, const char *prefix)
{
	/*
	 * git-tar-tree is now a wrapper around git-archive --format=tar
	 *
	 * $0 --remote=<repo> arg... ==>
	 *	git-archive --format=tar --remote=<repo> arg...
	 * $0 tree-ish ==>
	 *	git-archive --format=tar tree-ish
	 * $0 tree-ish basedir ==>
	 * 	git-archive --format-tar --prefix=basedir tree-ish
	 */
	int i;
	const char **nargv = xcalloc(sizeof(*nargv), argc + 2);
	char *basedir_arg;
	int nargc = 0;

	nargv[nargc++] = "git-archive";
	nargv[nargc++] = "--format=tar";

	if (2 <= argc && !strncmp("--remote=", argv[1], 9)) {
		nargv[nargc++] = argv[1];
		argv++;
		argc--;
	}
	switch (argc) {
	default:
		usage(tar_tree_usage);
		break;
	case 3:
		/* base-path */
		basedir_arg = xmalloc(strlen(argv[2]) + 11);
		sprintf(basedir_arg, "--prefix=%s/", argv[2]);
		nargv[nargc++] = basedir_arg;
		/* fallthru */
	case 2:
		/* tree-ish */
		nargv[nargc++] = argv[1];
	}
	nargv[nargc] = NULL;

	fprintf(stderr,
		"*** git-tar-tree is now deprecated.\n"
		"*** Running git-archive instead.\n***");
	for (i = 0; i < nargc; i++) {
		fputc(' ', stderr);
		sq_quote_print(stderr, nargv[i]);
	}
	fputc('\n', stderr);
	return cmd_archive(nargc, nargv, prefix);
}

/* ustar header + extended global header content */
#define RECORDSIZE	(512)
#define HEADERSIZE (2 * RECORDSIZE)

int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
{
	char buffer[HEADERSIZE];
	struct ustar_header *header = (struct ustar_header *)buffer;
	char *content = buffer + RECORDSIZE;
	ssize_t n;

	n = xread(0, buffer, HEADERSIZE);
	if (n < HEADERSIZE)
		die("git-get-tar-commit-id: read error");
	if (header->typeflag[0] != 'g')
		return 1;
	if (memcmp(content, "52 comment=", 11))
		return 1;

	n = xwrite(1, content + 11, 41);
	if (n < 41)
		die("git-get-tar-commit-id: write error");

	return 0;
}
back to top