| #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; | 
 | } |