http-fetch.c 2.2 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";

9
int cmd_main(int argc, const char **argv)
D
Daniel Barkalow 已提交
10 11 12 13 14 15
{
	struct walker *walker;
	int commits_on_stdin = 0;
	int commits;
	const char **write_ref = NULL;
	char **commit_id;
T
Tay Ray Chuan 已提交
16
	char *url = NULL;
D
Daniel Barkalow 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
	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;

	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++;
39 40
		} else if (argv[arg][1] == 'h') {
			usage(http_fetch_usage);
D
Daniel Barkalow 已提交
41 42 43 44 45 46 47
		} else if (!strcmp(argv[arg], "--recover")) {
			get_recover = 1;
		} else if (!strcmp(argv[arg], "--stdin")) {
			commits_on_stdin = 1;
		}
		arg++;
	}
48 49
	if (argc != arg + 2 - commits_on_stdin)
		usage(http_fetch_usage);
D
Daniel Barkalow 已提交
50 51 52 53 54 55
	if (commits_on_stdin) {
		commits = walker_targets_stdin(&commit_id, &write_ref);
	} else {
		commit_id = (char **) &argv[arg++];
		commits = 1;
	}
T
Tay Ray Chuan 已提交
56

57 58 59 60
	if (get_all == 0)
		warning("http-fetch: use without -a is deprecated.\n"
			"In a future release, -a will become the default.");

T
Tay Ray Chuan 已提交
61 62
	if (argv[arg])
		str_end_url_with_slash(argv[arg], &url);
63

64
	setup_git_directory();
65 66 67

	git_config(git_default_config, NULL);

J
Jeff King 已提交
68
	http_init(NULL, url, 0);
69
	walker = get_http_walker(url);
D
Daniel Barkalow 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
	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"
85
"status code.  Suggest running 'git fsck'.\n");
D
Daniel Barkalow 已提交
86 87 88
	}

	walker_free(walker);
89
	http_cleanup();
D
Daniel Barkalow 已提交
90

T
Tay Ray Chuan 已提交
91
	free(url);
92

D
Daniel Barkalow 已提交
93 94
	return rc;
}