75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
| /*
 | |
|  * Copyright (c) 2006 Junio C Hamano
 | |
|  */
 | |
| #include "cache.h"
 | |
| #include "pkt-line.h"
 | |
| #include "exec_cmd.h"
 | |
| #include "builtin.h"
 | |
| 
 | |
| static const char upload_tar_usage[] = "git-upload-tar <repo>";
 | |
| 
 | |
| static int nak(const char *reason)
 | |
| {
 | |
| 	packet_write(1, "NACK %s\n", reason);
 | |
| 	packet_flush(1);
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| int cmd_upload_tar(int argc, const char **argv, char **envp)
 | |
| {
 | |
| 	int len;
 | |
| 	const char *dir = argv[1];
 | |
| 	char buf[8192];
 | |
| 	unsigned char sha1[20];
 | |
| 	char *base = NULL;
 | |
| 	char hex[41];
 | |
| 	int ac;
 | |
| 	const char *av[4];
 | |
| 
 | |
| 	if (argc != 2)
 | |
| 		usage(upload_tar_usage);
 | |
| 	if (strlen(dir) < sizeof(buf)-1)
 | |
| 		strcpy(buf, dir); /* enter-repo smudges its argument */
 | |
| 	else
 | |
| 		packet_write(1, "NACK insanely long repository name %s\n", dir);
 | |
| 	if (!enter_repo(buf, 0)) {
 | |
| 		packet_write(1, "NACK not a git archive %s\n", dir);
 | |
| 		packet_flush(1);
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	len = packet_read_line(0, buf, sizeof(buf));
 | |
| 	if (len < 5 || strncmp("want ", buf, 5))
 | |
| 		return nak("expected want");
 | |
| 	if (buf[len-1] == '\n')
 | |
| 		buf[--len] = 0;
 | |
| 	if (get_sha1(buf + 5, sha1))
 | |
| 		return nak("expected sha1");
 | |
|         strcpy(hex, sha1_to_hex(sha1));
 | |
| 
 | |
| 	len = packet_read_line(0, buf, sizeof(buf));
 | |
| 	if (len) {
 | |
| 		if (len < 5 || strncmp("base ", buf, 5))
 | |
| 			return nak("expected (optional) base");
 | |
| 		if (buf[len-1] == '\n')
 | |
| 			buf[--len] = 0;
 | |
| 		base = strdup(buf + 5);
 | |
| 		len = packet_read_line(0, buf, sizeof(buf));
 | |
| 	}
 | |
| 	if (len)
 | |
| 		return nak("expected flush");
 | |
| 
 | |
| 	packet_write(1, "ACK\n");
 | |
| 	packet_flush(1);
 | |
| 
 | |
| 	ac = 0;
 | |
| 	av[ac++] = "tar-tree";
 | |
| 	av[ac++] = hex;
 | |
| 	if (base)
 | |
| 		av[ac++] = base;
 | |
| 	av[ac++] = NULL;
 | |
| 	execv_git_cmd(av);
 | |
| 	/* should it return that is an error */
 | |
| 	return 1;
 | |
| }
 |