Skip to content

Commit

Permalink
[PATCH] Support alternates and http-alternates in http-fetch
Browse files Browse the repository at this point in the history
This allows the remote repository to refer to additional repositories
in a file objects/info/http-alternates or
objects/info/alternates. Each line may be:

 a relative path, starting with ../, to get from the objects directory
  of the starting repository to the objects directory of the added
  repository.

 an absolute path of the objects directory of the added repository (on
  the same server).

 (only in http-alternates) a full URL of the objects directory of the
  added repository.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed Sep 18, 2005
1 parent 3a45f62 commit 1b0c1e6
Showing 1 changed file with 38 additions and 7 deletions.
45 changes: 38 additions & 7 deletions http-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,11 @@ static int fetch_alternates(char *base)
char *url;
char *data;
int i = 0;
int http_specific = 1;
if (got_alternates)
return 0;
data = xmalloc(4096);
buffer.size = 4096;
buffer.size = 4095;
buffer.posn = 0;
buffer.buffer = data;

Expand All @@ -162,6 +163,8 @@ static int fetch_alternates(char *base)
curl_easy_setopt(curl, CURLOPT_URL, url);

if (curl_easy_perform(curl) || !buffer.posn) {
http_specific = 0;

sprintf(url, "%s/objects/info/alternates", base);

curl_easy_setopt(curl, CURLOPT_FILE, &buffer);
Expand All @@ -173,17 +176,45 @@ static int fetch_alternates(char *base)
}
}

data[buffer.posn] = '\0';

while (i < buffer.posn) {
int posn = i;
while (posn < buffer.posn && data[posn] != '\n')
posn++;
if (data[posn] == '\n') {
int okay = 0;
int serverlen = 0;
struct alt_base *newalt;
char *target = NULL;
if (data[i] == '/') {
int serverlen = strchr(base + 8, '/') - base;
// skip 'objects' at end
char *target =
xmalloc(serverlen + posn - i - 6);
struct alt_base *newalt;
serverlen = strchr(base + 8, '/') - base;
okay = 1;
} else if (!memcmp(data + i, "../", 3)) {
i += 3;
serverlen = strlen(base);
while (i + 2 < posn &&
!memcmp(data + i, "../", 3)) {
do {
serverlen--;
} while (serverlen &&
base[serverlen - 1] != '/');
i += 3;
}
// If the server got removed, give up.
okay = strchr(base, ':') - base + 3 <
serverlen;
} else if (http_specific) {
char *colon = strchr(data + i, ':');
char *slash = strchr(data + i, '/');
if (colon && slash && colon < data + posn &&
slash < data + posn && colon < slash) {
okay = 1;
}
}
// skip 'objects' at end
if (okay) {
target = xmalloc(serverlen + posn - i - 6);
strncpy(target, base, serverlen);
strncpy(target + serverlen, data + i,
posn - i - 7);
Expand Down Expand Up @@ -235,7 +266,7 @@ static int fetch_indices(struct alt_base *repo)
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, NULL);

if (curl_easy_perform(curl)) {
return error("Unable to get pack index %s", url);
return -1;
}

while (i < buffer.posn) {
Expand Down

0 comments on commit 1b0c1e6

Please sign in to comment.