Teach git-http-fetch the --stdin switch
Speeds up things quite a lot when fetching tags with Cogito. Signed-off-by: Petr Baudis <pasky@suse.cz> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
8e87ca6615
commit
8e29f6a07e
@ -8,7 +8,7 @@ git-http-fetch - downloads a remote git repository via HTTP
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] <commit> <url>
|
'git-http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin] <commit> <url>
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -33,6 +33,12 @@ commit-id::
|
|||||||
Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on
|
Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on
|
||||||
the local end after the transfer is complete.
|
the local end after the transfer is complete.
|
||||||
|
|
||||||
|
--stdin::
|
||||||
|
Instead of a commit id on the commandline (which is not expected in this
|
||||||
|
case), 'git-http-fetch' expects lines on stdin in the format
|
||||||
|
|
||||||
|
<commit-id>['\t'<filename-as-in--w>]
|
||||||
|
|
||||||
Author
|
Author
|
||||||
------
|
------
|
||||||
Written by Linus Torvalds <torvalds@osdl.org>
|
Written by Linus Torvalds <torvalds@osdl.org>
|
||||||
|
45
http-fetch.c
45
http-fetch.c
@ -36,6 +36,8 @@ enum XML_Status {
|
|||||||
#define PREV_BUF_SIZE 4096
|
#define PREV_BUF_SIZE 4096
|
||||||
#define RANGE_HEADER_SIZE 30
|
#define RANGE_HEADER_SIZE 30
|
||||||
|
|
||||||
|
static int commits_on_stdin = 0;
|
||||||
|
|
||||||
static int got_alternates = -1;
|
static int got_alternates = -1;
|
||||||
static int corrupt_object_found = 0;
|
static int corrupt_object_found = 0;
|
||||||
|
|
||||||
@ -43,7 +45,7 @@ static struct curl_slist *no_pragma_header;
|
|||||||
|
|
||||||
struct alt_base
|
struct alt_base
|
||||||
{
|
{
|
||||||
char *base;
|
const char *base;
|
||||||
int path_len;
|
int path_len;
|
||||||
int got_indices;
|
int got_indices;
|
||||||
struct packed_git *packs;
|
struct packed_git *packs;
|
||||||
@ -81,7 +83,7 @@ struct object_request
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct alternates_request {
|
struct alternates_request {
|
||||||
char *base;
|
const char *base;
|
||||||
char *url;
|
char *url;
|
||||||
struct buffer *buffer;
|
struct buffer *buffer;
|
||||||
struct active_request_slot *slot;
|
struct active_request_slot *slot;
|
||||||
@ -142,7 +144,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fetch_alternates(char *base);
|
static void fetch_alternates(const char *base);
|
||||||
|
|
||||||
static void process_object_response(void *callback_data);
|
static void process_object_response(void *callback_data);
|
||||||
|
|
||||||
@ -507,7 +509,7 @@ static void process_alternates_response(void *callback_data)
|
|||||||
(struct alternates_request *)callback_data;
|
(struct alternates_request *)callback_data;
|
||||||
struct active_request_slot *slot = alt_req->slot;
|
struct active_request_slot *slot = alt_req->slot;
|
||||||
struct alt_base *tail = alt;
|
struct alt_base *tail = alt;
|
||||||
char *base = alt_req->base;
|
const char *base = alt_req->base;
|
||||||
static const char null_byte = '\0';
|
static const char null_byte = '\0';
|
||||||
char *data;
|
char *data;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -612,7 +614,7 @@ static void process_alternates_response(void *callback_data)
|
|||||||
got_alternates = 1;
|
got_alternates = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fetch_alternates(char *base)
|
static void fetch_alternates(const char *base)
|
||||||
{
|
{
|
||||||
struct buffer buffer;
|
struct buffer buffer;
|
||||||
char *url;
|
char *url;
|
||||||
@ -1185,7 +1187,7 @@ int fetch_ref(char *ref, unsigned char *sha1)
|
|||||||
char *url;
|
char *url;
|
||||||
char hex[42];
|
char hex[42];
|
||||||
struct buffer buffer;
|
struct buffer buffer;
|
||||||
char *base = alt->base;
|
const char *base = alt->base;
|
||||||
struct active_request_slot *slot;
|
struct active_request_slot *slot;
|
||||||
struct slot_results results;
|
struct slot_results results;
|
||||||
buffer.size = 41;
|
buffer.size = 41;
|
||||||
@ -1214,11 +1216,12 @@ int fetch_ref(char *ref, unsigned char *sha1)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
const char *write_ref = NULL;
|
int commits;
|
||||||
char *commit_id;
|
const char **write_ref = NULL;
|
||||||
char *url;
|
char **commit_id;
|
||||||
|
const char *url;
|
||||||
char *path;
|
char *path;
|
||||||
int arg = 1;
|
int arg = 1;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@ -1238,19 +1241,26 @@ int main(int argc, char **argv)
|
|||||||
} else if (argv[arg][1] == 'v') {
|
} else if (argv[arg][1] == 'v') {
|
||||||
get_verbosely = 1;
|
get_verbosely = 1;
|
||||||
} else if (argv[arg][1] == 'w') {
|
} else if (argv[arg][1] == 'w') {
|
||||||
write_ref = argv[arg + 1];
|
write_ref = &argv[arg + 1];
|
||||||
arg++;
|
arg++;
|
||||||
} else if (!strcmp(argv[arg], "--recover")) {
|
} else if (!strcmp(argv[arg], "--recover")) {
|
||||||
get_recover = 1;
|
get_recover = 1;
|
||||||
|
} else if (!strcmp(argv[arg], "--stdin")) {
|
||||||
|
commits_on_stdin = 1;
|
||||||
}
|
}
|
||||||
arg++;
|
arg++;
|
||||||
}
|
}
|
||||||
if (argc < arg + 2) {
|
if (argc < arg + 2 - commits_on_stdin) {
|
||||||
usage("git-http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] commit-id url");
|
usage("git-http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
commit_id = argv[arg];
|
if (commits_on_stdin) {
|
||||||
url = argv[arg + 1];
|
commits = pull_targets_stdin(&commit_id, &write_ref);
|
||||||
|
} else {
|
||||||
|
commit_id = (char **) &argv[arg++];
|
||||||
|
commits = 1;
|
||||||
|
}
|
||||||
|
url = argv[arg];
|
||||||
|
|
||||||
http_init();
|
http_init();
|
||||||
|
|
||||||
@ -1268,13 +1278,16 @@ int main(int argc, char **argv)
|
|||||||
alt->path_len = strlen(path);
|
alt->path_len = strlen(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pull(1, &commit_id, &write_ref, url))
|
if (pull(commits, commit_id, write_ref, url))
|
||||||
rc = 1;
|
rc = 1;
|
||||||
|
|
||||||
http_cleanup();
|
http_cleanup();
|
||||||
|
|
||||||
curl_slist_free_all(no_pragma_header);
|
curl_slist_free_all(no_pragma_header);
|
||||||
|
|
||||||
|
if (commits_on_stdin)
|
||||||
|
pull_targets_free(commits, commit_id, write_ref);
|
||||||
|
|
||||||
if (corrupt_object_found) {
|
if (corrupt_object_found) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Some loose object were found to be corrupt, but they might be just\n"
|
"Some loose object were found to be corrupt, but they might be just\n"
|
||||||
|
Loading…
Reference in New Issue
Block a user