http-fetch.c 2.3 KB
Newer Older
D
Daniel Barkalow 已提交
1
#include "cache.h"
2
#include "exec_cmd.h"
3
#include "http.h"
D
Daniel Barkalow 已提交
4 5
#include "walker.h"

6 7 8
static const char http_fetch_usage[] = "git http-fetch "
"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";

L
Linus Torvalds 已提交
9
int main(int argc, const char **argv)
D
Daniel Barkalow 已提交
10
{
L
Linus Torvalds 已提交
11
	const char *prefix;
D
Daniel Barkalow 已提交
12 13 14 15 16 17
	struct walker *walker;
	int commits_on_stdin = 0;
	int commits;
	const char **write_ref = NULL;
	char **commit_id;
	const char *url;
18
	char *rewritten_url = NULL;
D
Daniel Barkalow 已提交
19 20 21 22 23 24 25 26
	int arg = 1;
	int rc = 0;
	int get_tree = 0;
	int get_history = 0;
	int get_all = 0;
	int get_verbosely = 0;
	int get_recover = 0;

27
	git_extract_argv0_path(argv[0]);
D
Daniel Barkalow 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

	while (arg < argc && argv[arg][0] == '-') {
		if (argv[arg][1] == 't') {
			get_tree = 1;
		} else if (argv[arg][1] == 'c') {
			get_history = 1;
		} else if (argv[arg][1] == 'a') {
			get_all = 1;
			get_tree = 1;
			get_history = 1;
		} else if (argv[arg][1] == 'v') {
			get_verbosely = 1;
		} else if (argv[arg][1] == 'w') {
			write_ref = &argv[arg + 1];
			arg++;
43 44
		} else if (argv[arg][1] == 'h') {
			usage(http_fetch_usage);
D
Daniel Barkalow 已提交
45 46 47 48 49 50 51
		} else if (!strcmp(argv[arg], "--recover")) {
			get_recover = 1;
		} else if (!strcmp(argv[arg], "--stdin")) {
			commits_on_stdin = 1;
		}
		arg++;
	}
52 53
	if (argc != arg + 2 - commits_on_stdin)
		usage(http_fetch_usage);
D
Daniel Barkalow 已提交
54 55 56 57 58 59 60
	if (commits_on_stdin) {
		commits = walker_targets_stdin(&commit_id, &write_ref);
	} else {
		commit_id = (char **) &argv[arg++];
		commits = 1;
	}
	url = argv[arg];
61 62 63 64 65

	prefix = setup_git_directory();

	git_config(git_default_config, NULL);

66
	if (url && url[strlen(url)-1] != '/') {
67
		rewritten_url = xmalloc(strlen(url)+2);
68 69 70 71
		strcpy(rewritten_url, url);
		strcat(rewritten_url, "/");
		url = rewritten_url;
	}
D
Daniel Barkalow 已提交
72

73 74
	http_init(NULL);
	walker = get_http_walker(url);
D
Daniel Barkalow 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	walker->get_tree = get_tree;
	walker->get_history = get_history;
	walker->get_all = get_all;
	walker->get_verbosely = get_verbosely;
	walker->get_recover = get_recover;

	rc = walker_fetch(walker, commits, commit_id, write_ref, url);

	if (commits_on_stdin)
		walker_targets_free(commits, commit_id, write_ref);

	if (walker->corrupt_object_found) {
		fprintf(stderr,
"Some loose object were found to be corrupt, but they might be just\n"
"a false '404 Not Found' error message sent with incorrect HTTP\n"
90
"status code.  Suggest running 'git fsck'.\n");
D
Daniel Barkalow 已提交
91 92 93
	}

	walker_free(walker);
94
	http_cleanup();
D
Daniel Barkalow 已提交
95

96
	free(rewritten_url);
97

D
Daniel Barkalow 已提交
98 99
	return rc;
}