Revision ba375acff7692cbca16f7cc2e69b71563188ab7f authored by Linus Torvalds on 08 July 2005, 22:46:33 UTC, committed by Linus Torvalds on 08 July 2005, 22:46:33 UTC
This silently adds the ".git" directory component if needed, so you
don't need to state it explicitly for the source.  Also, it turns the
source into an absolute pathname when local, so that you can use
relative pathnames without losing sight of the source when we cd into
the destination.
1 parent 51cb06c
Raw File
export.c
#include "cache.h"
#include "commit.h"

/*
 * Show one commit
 */
static void show_commit(struct commit *commit)
{
	char cmdline[400];
	char hex[100];

	strcpy(hex, sha1_to_hex(commit->object.sha1));
	printf("Id: %s\n", hex);
	fflush(NULL);
	sprintf(cmdline, "git-cat-file commit %s", hex);
	system(cmdline);
	if (commit->parents) {
		char *against = sha1_to_hex(commit->parents->item->object.sha1);
		printf("\n\n======== diff against %s ========\n", against);
		fflush(NULL);
		sprintf(cmdline, "git-diff-tree -p %s %s", against, hex);
		system(cmdline);
	}
	printf("======== end ========\n\n");
}

/*
 * Show all unseen commits, depth-first
 */
static void show_unseen(struct commit *top)
{
	struct commit_list *parents;

	if (top->object.flags & 2)
		return;
	top->object.flags |= 2;
	parents = top->parents;
	while (parents) {
		show_unseen(parents->item);
		parents = parents->next;
	}
	show_commit(top);
}

static void export(struct commit *top, struct commit *base)
{
	mark_reachable(&top->object, 1);
	if (base)
		mark_reachable(&base->object, 2);
	show_unseen(top);
}

static struct commit *get_commit(unsigned char *sha1)
{
	struct commit *commit = lookup_commit(sha1);
	if (!commit->object.parsed) {
		struct commit_list *parents;

		if (parse_commit(commit) < 0)
			die("unable to parse commit %s", sha1_to_hex(sha1));
		parents = commit->parents;
		while (parents) {
			get_commit(parents->item->object.sha1);
			parents = parents->next;
		}
	}
	return commit;
}

int main(int argc, char **argv)
{
	unsigned char base_sha1[20];
	unsigned char top_sha1[20];

	if (argc < 2 || argc > 4 ||
	    get_sha1(argv[1], top_sha1) ||
	    (argc == 3 && get_sha1(argv[2], base_sha1)))
		usage("git-export top [base]");
	export(get_commit(top_sha1), argc==3 ? get_commit(base_sha1) : NULL);
	return 0;
}
back to top