Teach git-local-fetch the --stdin switch
This makes it possible to fetch many commits (refs) at once, greatly speeding up cg-clone. Signed-off-by: Petr Baudis <pasky@suse.cz> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:

committed by
Junio C Hamano

parent
4211e4d10c
commit
8e87ca6615
40
fetch.c
40
fetch.c
@ -7,6 +7,7 @@
|
||||
#include "tag.h"
|
||||
#include "blob.h"
|
||||
#include "refs.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
int get_tree = 0;
|
||||
int get_history = 0;
|
||||
@ -210,6 +211,45 @@ static int mark_complete(const char *path, const unsigned char *sha1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pull_targets_stdin(char ***target, const char ***write_ref)
|
||||
{
|
||||
int targets = 0, targets_alloc = 0;
|
||||
struct strbuf buf;
|
||||
*target = NULL; *write_ref = NULL;
|
||||
strbuf_init(&buf);
|
||||
while (1) {
|
||||
char *rf_one = NULL;
|
||||
char *tg_one;
|
||||
|
||||
read_line(&buf, stdin, '\n');
|
||||
if (buf.eof)
|
||||
break;
|
||||
tg_one = buf.buf;
|
||||
rf_one = strchr(tg_one, '\t');
|
||||
if (rf_one)
|
||||
*rf_one++ = 0;
|
||||
|
||||
if (targets >= targets_alloc) {
|
||||
targets_alloc = targets_alloc ? targets_alloc * 2 : 64;
|
||||
*target = xrealloc(*target, targets_alloc * sizeof(**target));
|
||||
*write_ref = xrealloc(*write_ref, targets_alloc * sizeof(**write_ref));
|
||||
}
|
||||
(*target)[targets] = strdup(tg_one);
|
||||
(*write_ref)[targets] = rf_one ? strdup(rf_one) : NULL;
|
||||
targets++;
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
|
||||
void pull_targets_free(int targets, char **target, const char **write_ref)
|
||||
{
|
||||
while (targets--) {
|
||||
free(target[targets]);
|
||||
if (write_ref[targets])
|
||||
free((char *) write_ref[targets]);
|
||||
}
|
||||
}
|
||||
|
||||
int pull(int targets, char **target, const char **write_ref,
|
||||
const char *write_ref_log_details)
|
||||
{
|
||||
|
Reference in New Issue
Block a user