2005-04-24 05:47:23 +04:00
|
|
|
#include "cache.h"
|
|
|
|
#include "commit.h"
|
2007-09-11 07:02:45 +04:00
|
|
|
#include "walker.h"
|
2005-11-18 22:02:58 +03:00
|
|
|
#include "http.h"
|
2005-10-15 22:10:46 +04:00
|
|
|
|
2011-03-16 10:08:34 +03:00
|
|
|
struct alt_base {
|
2007-03-28 13:46:15 +04:00
|
|
|
char *base;
|
2005-09-15 07:26:08 +04:00
|
|
|
int got_indices;
|
|
|
|
struct packed_git *packs;
|
|
|
|
struct alt_base *next;
|
|
|
|
};
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
enum object_request_state {
|
2005-10-11 10:22:01 +04:00
|
|
|
WAITING,
|
|
|
|
ABORTED,
|
|
|
|
ACTIVE,
|
2010-05-14 13:31:35 +04:00
|
|
|
COMPLETE
|
2005-10-11 10:22:01 +04:00
|
|
|
};
|
2005-04-24 05:47:23 +04:00
|
|
|
|
2011-03-16 10:08:34 +03:00
|
|
|
struct object_request {
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker *walker;
|
2005-10-11 10:22:01 +04:00
|
|
|
unsigned char sha1[20];
|
|
|
|
struct alt_base *repo;
|
2005-11-18 22:03:04 +03:00
|
|
|
enum object_request_state state;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
struct http_object_request *req;
|
2005-11-18 22:03:04 +03:00
|
|
|
struct object_request *next;
|
2005-10-11 10:22:01 +04:00
|
|
|
};
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
struct alternates_request {
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker *walker;
|
2006-07-28 01:56:22 +04:00
|
|
|
const char *base;
|
2005-11-12 20:11:32 +03:00
|
|
|
char *url;
|
2007-12-09 22:30:59 +03:00
|
|
|
struct strbuf *buffer;
|
2005-11-12 20:11:32 +03:00
|
|
|
struct active_request_slot *slot;
|
|
|
|
int http_specific;
|
|
|
|
};
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data {
|
|
|
|
const char *url;
|
|
|
|
int got_alternates;
|
|
|
|
struct alt_base *alt;
|
|
|
|
};
|
|
|
|
|
2006-08-15 21:23:48 +04:00
|
|
|
static struct object_request *object_queue_head;
|
2005-10-13 21:49:53 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static void fetch_alternates(struct walker *walker, const char *base);
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2005-11-18 22:02:58 +03:00
|
|
|
static void process_object_response(void *callback_data);
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static void start_object_request(struct walker *walker,
|
|
|
|
struct object_request *obj_req)
|
2005-10-11 10:22:01 +04:00
|
|
|
{
|
|
|
|
struct active_request_slot *slot;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
struct http_object_request *req;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
req = new_http_object_request(obj_req->repo->base, obj_req->sha1);
|
|
|
|
if (req == NULL) {
|
2005-11-18 22:03:04 +03:00
|
|
|
obj_req->state = ABORTED;
|
2005-10-11 10:22:01 +04:00
|
|
|
return;
|
|
|
|
}
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
obj_req->req = req;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
slot = req->slot;
|
2005-11-18 22:02:58 +03:00
|
|
|
slot->callback_func = process_object_response;
|
2005-11-18 22:03:04 +03:00
|
|
|
slot->callback_data = obj_req;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2005-10-11 10:22:01 +04:00
|
|
|
/* Try to get the request started, abort the request on error */
|
2005-11-18 22:03:04 +03:00
|
|
|
obj_req->state = ACTIVE;
|
2005-10-11 10:22:01 +04:00
|
|
|
if (!start_active_slot(slot)) {
|
2005-11-18 22:03:04 +03:00
|
|
|
obj_req->state = ABORTED;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
release_http_object_request(req);
|
2005-11-18 22:03:04 +03:00
|
|
|
return;
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
static void finish_object_request(struct object_request *obj_req)
|
2005-10-11 10:22:01 +04:00
|
|
|
{
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (finish_http_object_request(obj_req->req))
|
2005-10-11 10:22:01 +04:00
|
|
|
return;
|
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (obj_req->req->rename == 0)
|
2007-09-11 07:02:45 +04:00
|
|
|
walker_say(obj_req->walker, "got %s\n", sha1_to_hex(obj_req->sha1));
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
|
|
|
|
2005-11-18 22:02:58 +03:00
|
|
|
static void process_object_response(void *callback_data)
|
|
|
|
{
|
2005-11-18 22:03:04 +03:00
|
|
|
struct object_request *obj_req =
|
|
|
|
(struct object_request *)callback_data;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker *walker = obj_req->walker;
|
|
|
|
struct walker_data *data = walker->data;
|
|
|
|
struct alt_base *alt = data->alt;
|
2005-11-18 22:02:58 +03:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
process_http_object_request(obj_req->req);
|
2005-11-18 22:03:04 +03:00
|
|
|
obj_req->state = COMPLETE;
|
2005-11-18 22:02:58 +03:00
|
|
|
|
|
|
|
/* Use alternates if necessary */
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (missing_target(obj_req->req)) {
|
2007-09-11 07:02:45 +04:00
|
|
|
fetch_alternates(walker, alt->base);
|
2005-11-18 22:03:04 +03:00
|
|
|
if (obj_req->repo->next != NULL) {
|
|
|
|
obj_req->repo =
|
|
|
|
obj_req->repo->next;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
release_http_object_request(obj_req->req);
|
2007-09-11 07:02:45 +04:00
|
|
|
start_object_request(walker, obj_req);
|
2005-11-18 22:02:58 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
finish_object_request(obj_req);
|
2005-11-18 22:02:58 +03:00
|
|
|
}
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
static void release_object_request(struct object_request *obj_req)
|
2005-10-11 10:22:01 +04:00
|
|
|
{
|
2005-11-18 22:03:04 +03:00
|
|
|
struct object_request *entry = object_queue_head;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (obj_req->req !=NULL && obj_req->req->localfile != -1)
|
|
|
|
error("fd leakage in release: %d", obj_req->req->localfile);
|
2005-11-18 22:03:04 +03:00
|
|
|
if (obj_req == object_queue_head) {
|
|
|
|
object_queue_head = obj_req->next;
|
2005-10-11 10:22:01 +04:00
|
|
|
} else {
|
2005-11-18 22:03:04 +03:00
|
|
|
while (entry->next != NULL && entry->next != obj_req)
|
2005-10-11 10:22:01 +04:00
|
|
|
entry = entry->next;
|
2005-11-18 22:03:04 +03:00
|
|
|
if (entry->next == obj_req)
|
2005-10-11 10:22:01 +04:00
|
|
|
entry->next = entry->next->next;
|
|
|
|
}
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
free(obj_req);
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
|
|
|
|
2005-10-11 10:22:01 +04:00
|
|
|
#ifdef USE_CURL_MULTI
|
2007-09-11 07:02:45 +04:00
|
|
|
static int fill_active_slot(struct walker *walker)
|
2005-10-11 10:22:01 +04:00
|
|
|
{
|
2007-09-11 07:02:28 +04:00
|
|
|
struct object_request *obj_req;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2007-09-11 07:02:28 +04:00
|
|
|
for (obj_req = object_queue_head; obj_req; obj_req = obj_req->next) {
|
2005-11-18 22:03:04 +03:00
|
|
|
if (obj_req->state == WAITING) {
|
|
|
|
if (has_sha1_file(obj_req->sha1))
|
2006-02-01 14:44:28 +03:00
|
|
|
obj_req->state = COMPLETE;
|
2007-09-11 07:02:28 +04:00
|
|
|
else {
|
2007-09-11 07:02:45 +04:00
|
|
|
start_object_request(walker, obj_req);
|
2007-09-11 07:02:28 +04:00
|
|
|
return 1;
|
|
|
|
}
|
2005-10-21 23:06:10 +04:00
|
|
|
}
|
2006-02-01 05:15:51 +03:00
|
|
|
}
|
2007-09-11 07:02:28 +04:00
|
|
|
return 0;
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
2005-10-11 10:22:01 +04:00
|
|
|
#endif
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static void prefetch(struct walker *walker, unsigned char *sha1)
|
2005-10-11 10:22:01 +04:00
|
|
|
{
|
2005-11-18 22:03:04 +03:00
|
|
|
struct object_request *newreq;
|
|
|
|
struct object_request *tail;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data *data = walker->data;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
|
|
|
newreq = xmalloc(sizeof(*newreq));
|
2007-09-11 07:02:45 +04:00
|
|
|
newreq->walker = walker;
|
2006-08-23 10:49:00 +04:00
|
|
|
hashcpy(newreq->sha1, sha1);
|
2007-09-11 07:02:45 +04:00
|
|
|
newreq->repo = data->alt;
|
2005-10-11 10:22:01 +04:00
|
|
|
newreq->state = WAITING;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
newreq->req = NULL;
|
2005-10-11 10:22:01 +04:00
|
|
|
newreq->next = NULL;
|
|
|
|
|
2009-06-06 12:43:41 +04:00
|
|
|
http_is_verbose = walker->get_verbosely;
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
if (object_queue_head == NULL) {
|
|
|
|
object_queue_head = newreq;
|
2005-10-11 10:22:01 +04:00
|
|
|
} else {
|
2005-11-18 22:03:04 +03:00
|
|
|
tail = object_queue_head;
|
2009-06-06 12:43:33 +04:00
|
|
|
while (tail->next != NULL)
|
2005-10-11 10:22:01 +04:00
|
|
|
tail = tail->next;
|
|
|
|
tail->next = newreq;
|
|
|
|
}
|
2005-11-18 22:02:58 +03:00
|
|
|
|
2005-10-11 10:22:01 +04:00
|
|
|
#ifdef USE_CURL_MULTI
|
2005-11-18 22:02:58 +03:00
|
|
|
fill_active_slots();
|
|
|
|
step_active_slots();
|
2005-10-11 10:22:01 +04:00
|
|
|
#endif
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
static void process_alternates_response(void *callback_data)
|
2005-09-15 07:26:08 +04:00
|
|
|
{
|
2005-11-18 22:03:04 +03:00
|
|
|
struct alternates_request *alt_req =
|
|
|
|
(struct alternates_request *)callback_data;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker *walker = alt_req->walker;
|
|
|
|
struct walker_data *cdata = walker->data;
|
2005-11-12 20:11:32 +03:00
|
|
|
struct active_request_slot *slot = alt_req->slot;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct alt_base *tail = cdata->alt;
|
2006-07-28 01:56:22 +04:00
|
|
|
const char *base = alt_req->base;
|
2011-05-03 19:47:27 +04:00
|
|
|
const char null_byte = '\0';
|
2005-11-12 20:11:32 +03:00
|
|
|
char *data;
|
|
|
|
int i = 0;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2005-11-12 20:11:32 +03:00
|
|
|
if (alt_req->http_specific) {
|
|
|
|
if (slot->curl_result != CURLE_OK ||
|
2007-12-09 22:30:59 +03:00
|
|
|
!alt_req->buffer->len) {
|
2005-11-12 20:11:32 +03:00
|
|
|
|
|
|
|
/* Try reusing the slot to get non-http alternates */
|
|
|
|
alt_req->http_specific = 0;
|
|
|
|
sprintf(alt_req->url, "%s/objects/info/alternates",
|
|
|
|
base);
|
|
|
|
curl_easy_setopt(slot->curl, CURLOPT_URL,
|
|
|
|
alt_req->url);
|
|
|
|
active_requests++;
|
|
|
|
slot->in_use = 1;
|
2006-03-15 19:59:52 +03:00
|
|
|
if (slot->finished != NULL)
|
|
|
|
(*slot->finished) = 0;
|
2006-02-01 14:44:39 +03:00
|
|
|
if (!start_active_slot(slot)) {
|
2007-09-11 07:02:45 +04:00
|
|
|
cdata->got_alternates = -1;
|
2005-11-18 22:02:58 +03:00
|
|
|
slot->in_use = 0;
|
2006-03-15 19:59:52 +03:00
|
|
|
if (slot->finished != NULL)
|
|
|
|
(*slot->finished) = 1;
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
2006-02-01 14:44:39 +03:00
|
|
|
return;
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
2005-11-12 20:11:32 +03:00
|
|
|
} else if (slot->curl_result != CURLE_OK) {
|
2006-09-16 21:58:20 +04:00
|
|
|
if (!missing_target(slot)) {
|
2007-09-11 07:02:45 +04:00
|
|
|
cdata->got_alternates = -1;
|
2005-11-12 20:11:32 +03:00
|
|
|
return;
|
|
|
|
}
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
|
|
|
|
2011-05-03 19:47:27 +04:00
|
|
|
fwrite_buffer((char *)&null_byte, 1, 1, alt_req->buffer);
|
2007-12-09 22:30:59 +03:00
|
|
|
alt_req->buffer->len--;
|
|
|
|
data = alt_req->buffer->buf;
|
2005-09-18 22:14:19 +04:00
|
|
|
|
2007-12-09 22:30:59 +03:00
|
|
|
while (i < alt_req->buffer->len) {
|
2005-09-15 07:26:08 +04:00
|
|
|
int posn = i;
|
2007-12-09 22:30:59 +03:00
|
|
|
while (posn < alt_req->buffer->len && data[posn] != '\n')
|
2005-09-15 07:26:08 +04:00
|
|
|
posn++;
|
|
|
|
if (data[posn] == '\n') {
|
2005-09-18 22:14:19 +04:00
|
|
|
int okay = 0;
|
|
|
|
int serverlen = 0;
|
|
|
|
struct alt_base *newalt;
|
|
|
|
char *target = NULL;
|
2005-09-15 07:26:08 +04:00
|
|
|
if (data[i] == '/') {
|
2009-06-06 12:43:33 +04:00
|
|
|
/*
|
|
|
|
* This counts
|
2006-09-13 10:53:27 +04:00
|
|
|
* http://git.host/pub/scm/linux.git/
|
|
|
|
* -----------here^
|
|
|
|
* so memcpy(dst, base, serverlen) will
|
|
|
|
* copy up to "...git.host".
|
|
|
|
*/
|
|
|
|
const char *colon_ss = strstr(base,"://");
|
|
|
|
if (colon_ss) {
|
|
|
|
serverlen = (strchr(colon_ss + 3, '/')
|
|
|
|
- base);
|
|
|
|
okay = 1;
|
|
|
|
}
|
2005-09-18 22:14:19 +04:00
|
|
|
} else if (!memcmp(data + i, "../", 3)) {
|
2009-06-06 12:43:33 +04:00
|
|
|
/*
|
|
|
|
* Relative URL; chop the corresponding
|
2006-09-13 10:53:27 +04:00
|
|
|
* number of subpath from base (and ../
|
|
|
|
* from data), and concatenate the result.
|
|
|
|
*
|
|
|
|
* The code first drops ../ from data, and
|
|
|
|
* then drops one ../ from data and one path
|
|
|
|
* from base. IOW, one extra ../ is dropped
|
|
|
|
* from data than path is dropped from base.
|
|
|
|
*
|
|
|
|
* This is not wrong. The alternate in
|
|
|
|
* http://git.host/pub/scm/linux.git/
|
|
|
|
* to borrow from
|
|
|
|
* http://git.host/pub/scm/linus.git/
|
|
|
|
* is ../../linus.git/objects/. You need
|
|
|
|
* two ../../ to borrow from your direct
|
|
|
|
* neighbour.
|
|
|
|
*/
|
2005-09-18 22:14:19 +04:00
|
|
|
i += 3;
|
|
|
|
serverlen = strlen(base);
|
2006-02-01 05:15:51 +03:00
|
|
|
while (i + 2 < posn &&
|
2005-09-18 22:14:19 +04:00
|
|
|
!memcmp(data + i, "../", 3)) {
|
|
|
|
do {
|
|
|
|
serverlen--;
|
|
|
|
} while (serverlen &&
|
|
|
|
base[serverlen - 1] != '/');
|
|
|
|
i += 3;
|
|
|
|
}
|
2006-07-10 10:57:51 +04:00
|
|
|
/* If the server got removed, give up. */
|
2006-02-01 05:15:51 +03:00
|
|
|
okay = strchr(base, ':') - base + 3 <
|
2009-06-06 12:43:33 +04:00
|
|
|
serverlen;
|
2005-11-12 20:11:32 +03:00
|
|
|
} else if (alt_req->http_specific) {
|
2005-09-18 22:14:19 +04:00
|
|
|
char *colon = strchr(data + i, ':');
|
|
|
|
char *slash = strchr(data + i, '/');
|
|
|
|
if (colon && slash && colon < data + posn &&
|
|
|
|
slash < data + posn && colon < slash) {
|
|
|
|
okay = 1;
|
|
|
|
}
|
|
|
|
}
|
2006-09-13 10:53:27 +04:00
|
|
|
/* skip "objects\n" at end */
|
2005-09-18 22:14:19 +04:00
|
|
|
if (okay) {
|
|
|
|
target = xmalloc(serverlen + posn - i - 6);
|
2006-09-13 10:53:27 +04:00
|
|
|
memcpy(target, base, serverlen);
|
|
|
|
memcpy(target + serverlen, data + i,
|
|
|
|
posn - i - 7);
|
|
|
|
target[serverlen + posn - i - 7] = 0;
|
2007-09-11 07:02:45 +04:00
|
|
|
if (walker->get_verbosely)
|
2006-02-01 05:15:51 +03:00
|
|
|
fprintf(stderr,
|
2005-09-15 07:26:08 +04:00
|
|
|
"Also look at %s\n", target);
|
|
|
|
newalt = xmalloc(sizeof(*newalt));
|
2005-10-11 10:22:01 +04:00
|
|
|
newalt->next = NULL;
|
2005-09-15 07:26:08 +04:00
|
|
|
newalt->base = target;
|
|
|
|
newalt->got_indices = 0;
|
|
|
|
newalt->packs = NULL;
|
2006-04-04 16:33:18 +04:00
|
|
|
|
2005-10-11 10:22:01 +04:00
|
|
|
while (tail->next != NULL)
|
|
|
|
tail = tail->next;
|
|
|
|
tail->next = newalt;
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
i = posn + 1;
|
|
|
|
}
|
2005-10-13 21:49:53 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
cdata->got_alternates = 1;
|
2005-11-12 20:11:32 +03:00
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static void fetch_alternates(struct walker *walker, const char *base)
|
2005-11-12 20:11:32 +03:00
|
|
|
{
|
2007-12-09 22:30:59 +03:00
|
|
|
struct strbuf buffer = STRBUF_INIT;
|
2005-11-12 20:11:32 +03:00
|
|
|
char *url;
|
|
|
|
struct active_request_slot *slot;
|
2006-02-01 05:00:37 +03:00
|
|
|
struct alternates_request alt_req;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data *cdata = walker->data;
|
2005-11-12 20:11:32 +03:00
|
|
|
|
2009-06-06 12:43:33 +04:00
|
|
|
/*
|
|
|
|
* If another request has already started fetching alternates,
|
|
|
|
* wait for them to arrive and return to processing this request's
|
|
|
|
* curl message
|
|
|
|
*/
|
2005-11-18 22:02:58 +03:00
|
|
|
#ifdef USE_CURL_MULTI
|
2007-09-11 07:02:45 +04:00
|
|
|
while (cdata->got_alternates == 0) {
|
2005-11-18 22:02:58 +03:00
|
|
|
step_active_slots();
|
2005-11-12 20:11:32 +03:00
|
|
|
}
|
2005-11-18 22:02:58 +03:00
|
|
|
#endif
|
2005-11-12 20:11:32 +03:00
|
|
|
|
|
|
|
/* Nothing to do if they've already been fetched */
|
2007-09-11 07:02:45 +04:00
|
|
|
if (cdata->got_alternates == 1)
|
2005-11-12 20:11:32 +03:00
|
|
|
return;
|
|
|
|
|
|
|
|
/* Start the fetch */
|
2007-09-11 07:02:45 +04:00
|
|
|
cdata->got_alternates = 0;
|
2005-11-12 20:11:32 +03:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
if (walker->get_verbosely)
|
2005-11-12 20:11:32 +03:00
|
|
|
fprintf(stderr, "Getting alternates list for %s\n", base);
|
2006-02-01 05:15:51 +03:00
|
|
|
|
2005-11-12 20:11:32 +03:00
|
|
|
url = xmalloc(strlen(base) + 31);
|
|
|
|
sprintf(url, "%s/objects/info/http-alternates", base);
|
|
|
|
|
2009-06-06 12:43:33 +04:00
|
|
|
/*
|
|
|
|
* Use a callback to process the result, since another request
|
|
|
|
* may fail and need to have alternates loaded before continuing
|
|
|
|
*/
|
2005-11-12 20:11:32 +03:00
|
|
|
slot = get_active_slot();
|
2005-11-18 22:03:04 +03:00
|
|
|
slot->callback_func = process_alternates_response;
|
2007-09-11 07:02:45 +04:00
|
|
|
alt_req.walker = walker;
|
2005-11-12 20:11:32 +03:00
|
|
|
slot->callback_data = &alt_req;
|
|
|
|
|
|
|
|
curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
|
2005-11-18 22:02:58 +03:00
|
|
|
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
|
2005-11-12 20:11:32 +03:00
|
|
|
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
|
|
|
|
|
|
|
|
alt_req.base = base;
|
|
|
|
alt_req.url = url;
|
|
|
|
alt_req.buffer = &buffer;
|
|
|
|
alt_req.http_specific = 1;
|
|
|
|
alt_req.slot = slot;
|
|
|
|
|
|
|
|
if (start_active_slot(slot))
|
|
|
|
run_active_slot(slot);
|
|
|
|
else
|
2007-09-11 07:02:45 +04:00
|
|
|
cdata->got_alternates = -1;
|
2005-11-12 20:11:32 +03:00
|
|
|
|
2007-12-09 22:30:59 +03:00
|
|
|
strbuf_release(&buffer);
|
2005-11-12 20:11:32 +03:00
|
|
|
free(url);
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static int fetch_indices(struct walker *walker, struct alt_base *repo)
|
2005-08-01 04:54:17 +04:00
|
|
|
{
|
2009-06-06 12:43:59 +04:00
|
|
|
int ret;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2005-09-15 07:26:08 +04:00
|
|
|
if (repo->got_indices)
|
2005-08-01 04:54:17 +04:00
|
|
|
return 0;
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
if (walker->get_verbosely)
|
2005-11-12 03:49:59 +03:00
|
|
|
fprintf(stderr, "Getting pack list for %s\n", repo->base);
|
2006-02-01 05:15:51 +03:00
|
|
|
|
2009-06-06 12:43:59 +04:00
|
|
|
switch (http_get_info_packs(repo->base, &repo->packs)) {
|
|
|
|
case HTTP_OK:
|
|
|
|
case HTTP_MISSING_TARGET:
|
|
|
|
repo->got_indices = 1;
|
|
|
|
ret = 0;
|
|
|
|
break;
|
|
|
|
default:
|
2005-11-18 22:03:11 +03:00
|
|
|
repo->got_indices = 0;
|
2009-06-06 12:43:59 +04:00
|
|
|
ret = -1;
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
2005-08-01 04:54:17 +04:00
|
|
|
|
2007-12-11 00:36:11 +03:00
|
|
|
return ret;
|
2005-08-01 04:54:17 +04:00
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
|
2005-08-01 04:54:17 +04:00
|
|
|
{
|
|
|
|
struct packed_git *target;
|
2005-09-28 21:14:04 +04:00
|
|
|
int ret;
|
2006-02-01 05:00:37 +03:00
|
|
|
struct slot_results results;
|
2009-06-06 12:44:01 +04:00
|
|
|
struct http_pack_request *preq;
|
2005-08-01 04:54:17 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
if (fetch_indices(walker, repo))
|
2005-08-01 04:54:17 +04:00
|
|
|
return -1;
|
2005-09-15 07:26:08 +04:00
|
|
|
target = find_sha1_pack(sha1, repo->packs);
|
2005-08-01 04:54:17 +04:00
|
|
|
if (!target)
|
2005-09-15 07:26:08 +04:00
|
|
|
return -1;
|
2005-08-01 04:54:17 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
if (walker->get_verbosely) {
|
2005-08-01 04:54:17 +04:00
|
|
|
fprintf(stderr, "Getting pack %s\n",
|
|
|
|
sha1_to_hex(target->sha1));
|
|
|
|
fprintf(stderr, " which contains %s\n",
|
|
|
|
sha1_to_hex(sha1));
|
|
|
|
}
|
|
|
|
|
2009-06-06 12:44:01 +04:00
|
|
|
preq = new_http_pack_request(target, repo->base);
|
|
|
|
if (preq == NULL)
|
|
|
|
goto abort;
|
|
|
|
preq->lst = &repo->packs;
|
|
|
|
preq->slot->results = &results;
|
2005-08-01 04:54:17 +04:00
|
|
|
|
2009-06-06 12:44:01 +04:00
|
|
|
if (start_active_slot(preq->slot)) {
|
|
|
|
run_active_slot(preq->slot);
|
2006-01-31 22:06:55 +03:00
|
|
|
if (results.curl_result != CURLE_OK) {
|
2009-06-06 12:44:01 +04:00
|
|
|
error("Unable to get pack file %s\n%s", preq->url,
|
|
|
|
curl_errorstr);
|
|
|
|
goto abort;
|
2005-10-11 10:22:01 +04:00
|
|
|
}
|
|
|
|
} else {
|
2009-06-06 12:44:01 +04:00
|
|
|
error("Unable to start request");
|
|
|
|
goto abort;
|
2005-08-01 04:54:17 +04:00
|
|
|
}
|
|
|
|
|
2009-06-06 12:44:01 +04:00
|
|
|
ret = finish_http_pack_request(preq);
|
|
|
|
release_http_pack_request(preq);
|
2005-09-28 21:14:04 +04:00
|
|
|
if (ret)
|
2005-10-11 10:22:01 +04:00
|
|
|
return ret;
|
2005-09-28 21:14:04 +04:00
|
|
|
|
2005-08-01 04:54:17 +04:00
|
|
|
return 0;
|
2009-06-06 12:44:01 +04:00
|
|
|
|
|
|
|
abort:
|
|
|
|
return -1;
|
2005-08-01 04:54:17 +04:00
|
|
|
}
|
|
|
|
|
2006-02-07 13:07:39 +03:00
|
|
|
static void abort_object_request(struct object_request *obj_req)
|
|
|
|
{
|
|
|
|
release_object_request(obj_req);
|
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static int fetch_object(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
|
2005-04-24 05:47:23 +04:00
|
|
|
{
|
|
|
|
char *hex = sha1_to_hex(sha1);
|
2005-11-18 22:02:58 +03:00
|
|
|
int ret = 0;
|
2005-11-18 22:03:04 +03:00
|
|
|
struct object_request *obj_req = object_queue_head;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
struct http_object_request *req;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2006-08-17 22:54:57 +04:00
|
|
|
while (obj_req != NULL && hashcmp(obj_req->sha1, sha1))
|
2005-11-18 22:03:04 +03:00
|
|
|
obj_req = obj_req->next;
|
|
|
|
if (obj_req == NULL)
|
2005-10-11 10:22:01 +04:00
|
|
|
return error("Couldn't find request for %s in the queue", hex);
|
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
if (has_sha1_file(obj_req->sha1)) {
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (obj_req->req != NULL)
|
|
|
|
abort_http_object_request(obj_req->req);
|
2006-02-07 13:07:39 +03:00
|
|
|
abort_object_request(obj_req);
|
2005-10-11 10:22:01 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-10-11 10:22:01 +04:00
|
|
|
#ifdef USE_CURL_MULTI
|
2009-06-06 12:43:33 +04:00
|
|
|
while (obj_req->state == WAITING)
|
2005-11-18 22:02:58 +03:00
|
|
|
step_active_slots();
|
2005-10-11 10:22:01 +04:00
|
|
|
#else
|
2007-09-11 07:02:45 +04:00
|
|
|
start_object_request(walker, obj_req);
|
2005-10-11 10:22:01 +04:00
|
|
|
#endif
|
2005-04-24 05:47:23 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
/*
|
|
|
|
* obj_req->req might change when fetching alternates in the callback
|
|
|
|
* process_object_response; therefore, the "shortcut" variable, req,
|
|
|
|
* is used only after we're done with slots.
|
|
|
|
*/
|
2009-06-06 12:43:33 +04:00
|
|
|
while (obj_req->state == ACTIVE)
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
run_active_slot(obj_req->req->slot);
|
|
|
|
|
|
|
|
req = obj_req->req;
|
2009-06-06 12:43:33 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
if (req->localfile != -1) {
|
|
|
|
close(req->localfile);
|
|
|
|
req->localfile = -1;
|
2005-11-12 02:55:16 +03:00
|
|
|
}
|
2005-04-24 05:47:23 +04:00
|
|
|
|
2005-11-18 22:03:04 +03:00
|
|
|
if (obj_req->state == ABORTED) {
|
2005-11-18 22:02:58 +03:00
|
|
|
ret = error("Request for %s aborted", hex);
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
} else if (req->curl_result != CURLE_OK &&
|
|
|
|
req->http_code != 416) {
|
|
|
|
if (missing_target(req))
|
2005-10-21 20:18:46 +04:00
|
|
|
ret = -1; /* Be silent, it is probably in a pack. */
|
|
|
|
else
|
|
|
|
ret = error("%s (curl_result = %d, http_code = %ld, sha1 = %s)",
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
req->errorstr, req->curl_result,
|
|
|
|
req->http_code, hex);
|
|
|
|
} else if (req->zret != Z_STREAM_END) {
|
2007-09-11 07:02:45 +04:00
|
|
|
walker->corrupt_object_found++;
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
ret = error("File %s (%s) corrupt", hex, req->url);
|
|
|
|
} else if (hashcmp(obj_req->sha1, req->real_sha1)) {
|
2006-02-23 04:47:10 +03:00
|
|
|
ret = error("File %s has bad hash", hex);
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
} else if (req->rename < 0) {
|
2006-02-01 14:44:35 +03:00
|
|
|
ret = error("unable to write sha1 filename %s",
|
2010-04-18 00:07:38 +04:00
|
|
|
sha1_file_name(req->sha1));
|
2005-04-24 05:47:23 +04:00
|
|
|
}
|
2005-09-28 21:14:04 +04:00
|
|
|
|
http*: add helper methods for fetching objects (loose)
The code handling the fetching of loose objects in http-push.c and
http-walker.c have been refactored into new methods and a new struct
(object_http_request) in http.c. They are not meant to be invoked
elsewhere.
The new methods in http.c are
- new_http_object_request
- process_http_object_request
- finish_http_object_request
- abort_http_object_request
- release_http_object_request
and the new struct is http_object_request.
RANGER_HEADER_SIZE and no_pragma_header is no longer made available
outside of http.c, since after the above changes, there are no other
instances of usage outside of http.c.
Remove members of the transfer_request struct in http-push.c and
http-walker.c, including filename, real_sha1 and zret, as they are used
no longer used.
Move the methods append_remote_object_url() and get_remote_object_url()
from http-push.c to http.c. Additionally, get_remote_object_url() is no
longer defined only when USE_CURL_MULTI is defined, since
non-USE_CURL_MULTI code in http.c uses it (namely, in
new_http_object_request()).
Refactor code from http-push.c::start_fetch_loose() and
http-walker.c::start_object_fetch_request() that deals with the details
of coming up with the filename to store the retrieved object, resuming
a previously aborted request, and making a new curl request, into a new
function, new_http_object_request().
Refactor code from http-walker.c::process_object_request() into the
function, process_http_object_request().
Refactor code from http-push.c::finish_request() and
http-walker.c::finish_object_request() into a new function,
finish_http_object_request(). It returns the result of the
move_temp_to_file() invocation.
Add a function, release_http_object_request(), which cleans up object
request data. http-push.c and http-walker.c invoke this function
separately; http-push.c::release_request() and
http-walker.c::release_object_request() do not invoke this function.
Add a function, abort_http_object_request(), which unlink()s the object
file and invokes release_http_object_request(). Update
http-walker.c::abort_object_request() to use this.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-06 12:44:02 +04:00
|
|
|
release_http_object_request(req);
|
2005-11-18 22:03:04 +03:00
|
|
|
release_object_request(obj_req);
|
2005-11-18 22:02:58 +03:00
|
|
|
return ret;
|
2005-04-24 05:47:23 +04:00
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static int fetch(struct walker *walker, unsigned char *sha1)
|
2005-09-15 07:26:08 +04:00
|
|
|
{
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data *data = walker->data;
|
|
|
|
struct alt_base *altbase = data->alt;
|
2005-10-11 10:22:01 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
if (!fetch_object(walker, altbase, sha1))
|
2005-10-11 10:22:01 +04:00
|
|
|
return 0;
|
2005-09-15 07:26:08 +04:00
|
|
|
while (altbase) {
|
2007-09-11 07:02:45 +04:00
|
|
|
if (!fetch_pack(walker, altbase, sha1))
|
2005-09-15 07:26:08 +04:00
|
|
|
return 0;
|
2007-09-11 07:02:45 +04:00
|
|
|
fetch_alternates(walker, data->alt->base);
|
2005-09-15 07:26:08 +04:00
|
|
|
altbase = altbase->next;
|
|
|
|
}
|
2006-02-23 04:47:10 +03:00
|
|
|
return error("Unable to find %s under %s", sha1_to_hex(sha1),
|
2007-09-11 07:02:45 +04:00
|
|
|
data->alt->base);
|
2005-09-15 07:26:08 +04:00
|
|
|
}
|
|
|
|
|
Make walker.fetch_ref() take a struct ref.
This simplifies a few things, makes a few things slightly more
complicated, but, more importantly, allows that, when struct ref can
represent a symref, http_fetch_ref() can return one.
Incidentally makes the string that http_fetch_ref() gets include "refs/"
(if appropriate), because that's how the name field of struct ref works.
As far as I can tell, the usage in walker:interpret_target() wouldn't have
worked previously, if it ever would have been used, which it wouldn't
(since the fetch process uses the hash instead of the name of the ref
there).
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-04-26 23:53:09 +04:00
|
|
|
static int fetch_ref(struct walker *walker, struct ref *ref)
|
2005-06-07 00:38:26 +04:00
|
|
|
{
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data *data = walker->data;
|
Make walker.fetch_ref() take a struct ref.
This simplifies a few things, makes a few things slightly more
complicated, but, more importantly, allows that, when struct ref can
represent a symref, http_fetch_ref() can return one.
Incidentally makes the string that http_fetch_ref() gets include "refs/"
(if appropriate), because that's how the name field of struct ref works.
As far as I can tell, the usage in walker:interpret_target() wouldn't have
worked previously, if it ever would have been used, which it wouldn't
(since the fetch process uses the hash instead of the name of the ref
there).
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-04-26 23:53:09 +04:00
|
|
|
return http_fetch_ref(data->alt->base, ref);
|
2005-06-07 00:38:26 +04:00
|
|
|
}
|
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
static void cleanup(struct walker *walker)
|
|
|
|
{
|
2010-03-02 13:49:28 +03:00
|
|
|
struct walker_data *data = walker->data;
|
|
|
|
struct alt_base *alt, *alt_next;
|
|
|
|
|
|
|
|
if (data) {
|
|
|
|
alt = data->alt;
|
|
|
|
while (alt) {
|
|
|
|
alt_next = alt->next;
|
|
|
|
|
|
|
|
free(alt->base);
|
|
|
|
free(alt);
|
|
|
|
|
|
|
|
alt = alt_next;
|
|
|
|
}
|
|
|
|
free(data);
|
|
|
|
walker->data = NULL;
|
|
|
|
}
|
2007-09-11 07:02:45 +04:00
|
|
|
}
|
|
|
|
|
2010-03-02 13:49:29 +03:00
|
|
|
struct walker *get_http_walker(const char *url)
|
2005-04-24 05:47:23 +04:00
|
|
|
{
|
2007-03-28 13:47:35 +04:00
|
|
|
char *s;
|
2007-09-11 07:02:45 +04:00
|
|
|
struct walker_data *data = xmalloc(sizeof(struct walker_data));
|
|
|
|
struct walker *walker = xmalloc(sizeof(struct walker));
|
2005-04-24 05:47:23 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
data->alt = xmalloc(sizeof(*data->alt));
|
|
|
|
data->alt->base = xmalloc(strlen(url) + 1);
|
|
|
|
strcpy(data->alt->base, url);
|
|
|
|
for (s = data->alt->base + strlen(data->alt->base) - 1; *s == '/'; --s)
|
2007-03-28 13:47:35 +04:00
|
|
|
*s = 0;
|
2005-04-24 05:47:23 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
data->alt->got_indices = 0;
|
|
|
|
data->alt->packs = NULL;
|
|
|
|
data->alt->next = NULL;
|
|
|
|
data->got_alternates = -1;
|
2007-09-11 07:02:34 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
walker->corrupt_object_found = 0;
|
|
|
|
walker->fetch = fetch;
|
|
|
|
walker->fetch_ref = fetch_ref;
|
|
|
|
walker->prefetch = prefetch;
|
|
|
|
walker->cleanup = cleanup;
|
|
|
|
walker->data = data;
|
2005-04-24 05:47:23 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
#ifdef USE_CURL_MULTI
|
|
|
|
add_fill_function(walker, (int (*)(void *)) fill_active_slot);
|
|
|
|
#endif
|
2006-07-28 01:56:22 +04:00
|
|
|
|
2007-09-11 07:02:45 +04:00
|
|
|
return walker;
|
2005-04-24 05:47:23 +04:00
|
|
|
}
|