git

Форк
0
/
http-fetch.c 
176 строк · 4.5 Кб
1
#define USE_THE_REPOSITORY_VARIABLE
2

3
#include "git-compat-util.h"
4
#include "config.h"
5
#include "gettext.h"
6
#include "hex.h"
7
#include "http.h"
8
#include "walker.h"
9
#include "setup.h"
10
#include "strvec.h"
11
#include "url.h"
12
#include "urlmatch.h"
13
#include "trace2.h"
14

15
static const char http_fetch_usage[] = "git http-fetch "
16
"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin | --packfile=hash | commit-id] url";
17

18
static int fetch_using_walker(const char *raw_url, int get_verbosely,
19
			      int get_recover, int commits, char **commit_id,
20
			      const char **write_ref, int commits_on_stdin)
21
{
22
	char *url = NULL;
23
	struct walker *walker;
24
	int rc;
25

26
	str_end_url_with_slash(raw_url, &url);
27

28
	http_init(NULL, url, 0);
29

30
	walker = get_http_walker(url);
31
	walker->get_verbosely = get_verbosely;
32
	walker->get_recover = get_recover;
33
	walker->get_progress = 0;
34

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

37
	if (commits_on_stdin)
38
		walker_targets_free(commits, commit_id, write_ref);
39

40
	if (walker->corrupt_object_found) {
41
		fprintf(stderr,
42
"Some loose object were found to be corrupt, but they might be just\n"
43
"a false '404 Not Found' error message sent with incorrect HTTP\n"
44
"status code.  Suggest running 'git fsck'.\n");
45
	}
46

47
	walker_free(walker);
48
	http_cleanup();
49
	free(url);
50

51
	return rc;
52
}
53

54
static void fetch_single_packfile(struct object_id *packfile_hash,
55
				  const char *url,
56
				  const char **index_pack_args) {
57
	struct http_pack_request *preq;
58
	struct slot_results results;
59
	int ret;
60

61
	http_init(NULL, url, 0);
62

63
	preq = new_direct_http_pack_request(packfile_hash->hash, xstrdup(url));
64
	if (!preq)
65
		die("couldn't create http pack request");
66
	preq->slot->results = &results;
67
	preq->index_pack_args = index_pack_args;
68
	preq->preserve_index_pack_stdout = 1;
69

70
	if (start_active_slot(preq->slot)) {
71
		run_active_slot(preq->slot);
72
		if (results.curl_result != CURLE_OK) {
73
			struct url_info url;
74
			char *nurl = url_normalize(preq->url, &url);
75
			if (!nurl || !git_env_bool("GIT_TRACE_REDACT", 1)) {
76
				die("unable to get pack file '%s'\n%s", preq->url,
77
				    curl_errorstr);
78
			} else {
79
				die("failed to get '%.*s' url from '%.*s' "
80
				    "(full URL redacted due to GIT_TRACE_REDACT setting)\n%s",
81
				    (int)url.scheme_len, url.url,
82
				    (int)url.host_len, &url.url[url.host_off], curl_errorstr);
83
			}
84
		}
85
	} else {
86
		die("Unable to start request");
87
	}
88

89
	if ((ret = finish_http_pack_request(preq)))
90
		die("finish_http_pack_request gave result %d", ret);
91

92
	release_http_pack_request(preq);
93
	http_cleanup();
94
}
95

96
int cmd_main(int argc, const char **argv)
97
{
98
	int commits_on_stdin = 0;
99
	int commits;
100
	const char **write_ref = NULL;
101
	char **commit_id;
102
	int arg = 1;
103
	int get_verbosely = 0;
104
	int get_recover = 0;
105
	int packfile = 0;
106
	int nongit;
107
	struct object_id packfile_hash;
108
	struct strvec index_pack_args = STRVEC_INIT;
109

110
	setup_git_directory_gently(&nongit);
111

112
	while (arg < argc && argv[arg][0] == '-') {
113
		const char *p;
114

115
		if (argv[arg][1] == 't') {
116
		} else if (argv[arg][1] == 'c') {
117
		} else if (argv[arg][1] == 'a') {
118
		} else if (argv[arg][1] == 'v') {
119
			get_verbosely = 1;
120
		} else if (argv[arg][1] == 'w') {
121
			write_ref = &argv[arg + 1];
122
			arg++;
123
		} else if (argv[arg][1] == 'h') {
124
			usage(http_fetch_usage);
125
		} else if (!strcmp(argv[arg], "--recover")) {
126
			get_recover = 1;
127
		} else if (!strcmp(argv[arg], "--stdin")) {
128
			commits_on_stdin = 1;
129
		} else if (skip_prefix(argv[arg], "--packfile=", &p)) {
130
			const char *end;
131

132
			if (nongit)
133
				die(_("not a git repository"));
134

135
			packfile = 1;
136
			if (parse_oid_hex_algop(p, &packfile_hash, &end,
137
						the_repository->hash_algo) || *end)
138
				die(_("argument to --packfile must be a valid hash (got '%s')"), p);
139
		} else if (skip_prefix(argv[arg], "--index-pack-arg=", &p)) {
140
			strvec_push(&index_pack_args, p);
141
		}
142
		arg++;
143
	}
144
	if (argc != arg + 2 - (commits_on_stdin || packfile))
145
		usage(http_fetch_usage);
146

147
	if (nongit)
148
		die(_("not a git repository"));
149

150
	trace2_cmd_name("http-fetch");
151

152
	git_config(git_default_config, NULL);
153

154
	if (packfile) {
155
		if (!index_pack_args.nr)
156
			die(_("the option '%s' requires '%s'"), "--packfile", "--index-pack-args");
157

158
		fetch_single_packfile(&packfile_hash, argv[arg],
159
				      index_pack_args.v);
160

161
		return 0;
162
	}
163

164
	if (index_pack_args.nr)
165
		die(_("the option '%s' requires '%s'"), "--index-pack-args", "--packfile");
166

167
	if (commits_on_stdin) {
168
		commits = walker_targets_stdin(&commit_id, &write_ref);
169
	} else {
170
		commit_id = (char **) &argv[arg++];
171
		commits = 1;
172
	}
173
	return fetch_using_walker(argv[arg], get_verbosely, get_recover,
174
				  commits, commit_id, write_ref,
175
				  commits_on_stdin);
176
}
177

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.