http-walker: cleanup more thoroughly
[git/git.git] / http-fetch.c
CommitLineData
30ae764b 1#include "cache.h"
f01d7496 2#include "exec_cmd.h"
30ae764b
DB
3#include "walker.h"
4
616f86d7
JN
5static const char http_fetch_usage[] = "git http-fetch "
6"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";
7
1088261f 8int main(int argc, const char **argv)
30ae764b 9{
1088261f 10 const char *prefix;
30ae764b
DB
11 struct walker *walker;
12 int commits_on_stdin = 0;
13 int commits;
14 const char **write_ref = NULL;
15 char **commit_id;
16 const char *url;
3057ded0 17 char *rewritten_url = NULL;
30ae764b
DB
18 int arg = 1;
19 int rc = 0;
20 int get_tree = 0;
21 int get_history = 0;
22 int get_all = 0;
23 int get_verbosely = 0;
24 int get_recover = 0;
25
f01d7496 26 git_extract_argv0_path(argv[0]);
30ae764b
DB
27
28 while (arg < argc && argv[arg][0] == '-') {
29 if (argv[arg][1] == 't') {
30 get_tree = 1;
31 } else if (argv[arg][1] == 'c') {
32 get_history = 1;
33 } else if (argv[arg][1] == 'a') {
34 get_all = 1;
35 get_tree = 1;
36 get_history = 1;
37 } else if (argv[arg][1] == 'v') {
38 get_verbosely = 1;
39 } else if (argv[arg][1] == 'w') {
40 write_ref = &argv[arg + 1];
41 arg++;
616f86d7
JN
42 } else if (argv[arg][1] == 'h') {
43 usage(http_fetch_usage);
30ae764b
DB
44 } else if (!strcmp(argv[arg], "--recover")) {
45 get_recover = 1;
46 } else if (!strcmp(argv[arg], "--stdin")) {
47 commits_on_stdin = 1;
48 }
49 arg++;
50 }
616f86d7
JN
51 if (argc != arg + 2 - commits_on_stdin)
52 usage(http_fetch_usage);
30ae764b
DB
53 if (commits_on_stdin) {
54 commits = walker_targets_stdin(&commit_id, &write_ref);
55 } else {
56 commit_id = (char **) &argv[arg++];
57 commits = 1;
58 }
59 url = argv[arg];
616f86d7
JN
60
61 prefix = setup_git_directory();
62
63 git_config(git_default_config, NULL);
64
3057ded0 65 if (url && url[strlen(url)-1] != '/') {
e8eec71d 66 rewritten_url = xmalloc(strlen(url)+2);
3057ded0
GB
67 strcpy(rewritten_url, url);
68 strcat(rewritten_url, "/");
69 url = rewritten_url;
70 }
30ae764b 71
9fc6440d 72 walker = get_http_walker(url, NULL);
30ae764b
DB
73 walker->get_tree = get_tree;
74 walker->get_history = get_history;
75 walker->get_all = get_all;
76 walker->get_verbosely = get_verbosely;
77 walker->get_recover = get_recover;
78
79 rc = walker_fetch(walker, commits, commit_id, write_ref, url);
80
81 if (commits_on_stdin)
82 walker_targets_free(commits, commit_id, write_ref);
83
84 if (walker->corrupt_object_found) {
85 fprintf(stderr,
86"Some loose object were found to be corrupt, but they might be just\n"
87"a false '404 Not Found' error message sent with incorrect HTTP\n"
05207a28 88"status code. Suggest running 'git fsck'.\n");
30ae764b
DB
89 }
90
91 walker_free(walker);
92
8e0f7003 93 free(rewritten_url);
3057ded0 94
30ae764b
DB
95 return rc;
96}