Skip to content

Commit

Permalink
Teach git-http-fetch the --stdin switch
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Petr Baudis authored and Junio C Hamano committed Jul 28, 2006
1 parent 8e87ca6 commit 8e29f6a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 17 deletions.
8 changes: 7 additions & 1 deletion Documentation/git-http-fetch.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ git-http-fetch - downloads a remote git repository via HTTP

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
-----------
Expand All @@ -33,6 +33,12 @@ commit-id::
Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on
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
------
Written by Linus Torvalds <torvalds@osdl.org>
Expand Down
45 changes: 29 additions & 16 deletions http-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ enum XML_Status {
#define PREV_BUF_SIZE 4096
#define RANGE_HEADER_SIZE 30

static int commits_on_stdin = 0;

static int got_alternates = -1;
static int corrupt_object_found = 0;

static struct curl_slist *no_pragma_header;

struct alt_base
{
char *base;
const char *base;
int path_len;
int got_indices;
struct packed_git *packs;
Expand Down Expand Up @@ -81,7 +83,7 @@ struct object_request
};

struct alternates_request {
char *base;
const char *base;
char *url;
struct buffer *buffer;
struct active_request_slot *slot;
Expand Down Expand Up @@ -142,7 +144,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
return size;
}

static void fetch_alternates(char *base);
static void fetch_alternates(const char *base);

static void process_object_response(void *callback_data);

Expand Down Expand Up @@ -507,7 +509,7 @@ static void process_alternates_response(void *callback_data)
(struct alternates_request *)callback_data;
struct active_request_slot *slot = alt_req->slot;
struct alt_base *tail = alt;
char *base = alt_req->base;
const char *base = alt_req->base;
static const char null_byte = '\0';
char *data;
int i = 0;
Expand Down Expand Up @@ -612,7 +614,7 @@ static void process_alternates_response(void *callback_data)
got_alternates = 1;
}

static void fetch_alternates(char *base)
static void fetch_alternates(const char *base)
{
struct buffer buffer;
char *url;
Expand Down Expand Up @@ -1185,7 +1187,7 @@ int fetch_ref(char *ref, unsigned char *sha1)
char *url;
char hex[42];
struct buffer buffer;
char *base = alt->base;
const char *base = alt->base;
struct active_request_slot *slot;
struct slot_results results;
buffer.size = 41;
Expand Down Expand Up @@ -1214,11 +1216,12 @@ int fetch_ref(char *ref, unsigned char *sha1)
return 0;
}

int main(int argc, char **argv)
int main(int argc, const char **argv)
{
const char *write_ref = NULL;
char *commit_id;
char *url;
int commits;
const char **write_ref = NULL;
char **commit_id;
const char *url;
char *path;
int arg = 1;
int rc = 0;
Expand All @@ -1238,19 +1241,26 @@ int main(int argc, char **argv)
} else if (argv[arg][1] == 'v') {
get_verbosely = 1;
} else if (argv[arg][1] == 'w') {
write_ref = argv[arg + 1];
write_ref = &argv[arg + 1];
arg++;
} else if (!strcmp(argv[arg], "--recover")) {
get_recover = 1;
} else if (!strcmp(argv[arg], "--stdin")) {
commits_on_stdin = 1;
}
arg++;
}
if (argc < arg + 2) {
usage("git-http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] commit-id url");
if (argc < arg + 2 - commits_on_stdin) {
usage("git-http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url");
return 1;
}
commit_id = argv[arg];
url = argv[arg + 1];
if (commits_on_stdin) {
commits = pull_targets_stdin(&commit_id, &write_ref);
} else {
commit_id = (char **) &argv[arg++];
commits = 1;
}
url = argv[arg];

http_init();

Expand All @@ -1268,13 +1278,16 @@ int main(int argc, char **argv)
alt->path_len = strlen(path);
}

if (pull(1, &commit_id, &write_ref, url))
if (pull(commits, commit_id, write_ref, url))
rc = 1;

http_cleanup();

curl_slist_free_all(no_pragma_header);

if (commits_on_stdin)
pull_targets_free(commits, commit_id, write_ref);

if (corrupt_object_found) {
fprintf(stderr,
"Some loose object were found to be corrupt, but they might be just\n"
Expand Down

0 comments on commit 8e29f6a

Please sign in to comment.