Add bundle transport
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
30415d50cc
commit
c7a8a16239
52
transport.c
52
transport.c
|
@ -5,6 +5,7 @@
|
||||||
#include "pkt-line.h"
|
#include "pkt-line.h"
|
||||||
#include "fetch-pack.h"
|
#include "fetch-pack.h"
|
||||||
#include "walker.h"
|
#include "walker.h"
|
||||||
|
#include "bundle.h"
|
||||||
|
|
||||||
/* Generic functions for using commit walkers */
|
/* Generic functions for using commit walkers */
|
||||||
|
|
||||||
|
@ -184,7 +185,55 @@ static const struct transport_ops curl_transport = {
|
||||||
/* disconnect */ disconnect_walker
|
/* disconnect */ disconnect_walker
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bundle_transport_data {
|
||||||
|
int fd;
|
||||||
|
struct bundle_header header;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ref *get_refs_from_bundle(const struct transport *transport)
|
||||||
|
{
|
||||||
|
struct bundle_transport_data *data = transport->data;
|
||||||
|
struct ref *result = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (data->fd > 0)
|
||||||
|
close(data->fd);
|
||||||
|
data->fd = read_bundle_header(transport->url, &data->header);
|
||||||
|
if (data->fd < 0)
|
||||||
|
die ("Could not read bundle '%s'.", transport->url);
|
||||||
|
for (i = 0; i < data->header.references.nr; i++) {
|
||||||
|
struct ref_list_entry *e = data->header.references.list + i;
|
||||||
|
struct ref *ref = alloc_ref(strlen(e->name));
|
||||||
|
hashcpy(ref->old_sha1, e->sha1);
|
||||||
|
strcpy(ref->name, e->name);
|
||||||
|
ref->next = result;
|
||||||
|
result = ref;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fetch_refs_from_bundle(const struct transport *transport,
|
||||||
|
int nr_heads, char **heads)
|
||||||
|
{
|
||||||
|
struct bundle_transport_data *data = transport->data;
|
||||||
|
return unbundle(&data->header, data->fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int close_bundle(struct transport *transport)
|
||||||
|
{
|
||||||
|
struct bundle_transport_data *data = transport->data;
|
||||||
|
if (data->fd > 0)
|
||||||
|
close(data->fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct transport_ops bundle_transport = {
|
static const struct transport_ops bundle_transport = {
|
||||||
|
/* set_option */ NULL,
|
||||||
|
/* get_refs_list */ get_refs_from_bundle,
|
||||||
|
/* fetch_refs */ fetch_refs_from_bundle,
|
||||||
|
/* fetch_objs */ NULL,
|
||||||
|
/* push */ NULL,
|
||||||
|
/* disconnect */ close_bundle
|
||||||
};
|
};
|
||||||
|
|
||||||
struct git_transport_data {
|
struct git_transport_data {
|
||||||
|
@ -367,8 +416,9 @@ struct transport *transport_get(struct remote *remote, const char *url,
|
||||||
else
|
else
|
||||||
ret->data = NULL;
|
ret->data = NULL;
|
||||||
} else if (is_local(url) && is_file(url)) {
|
} else if (is_local(url) && is_file(url)) {
|
||||||
|
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
|
||||||
ret = xmalloc(sizeof(*ret));
|
ret = xmalloc(sizeof(*ret));
|
||||||
ret->data = NULL;
|
ret->data = data;
|
||||||
ret->ops = &bundle_transport;
|
ret->ops = &bundle_transport;
|
||||||
} else {
|
} else {
|
||||||
struct git_transport_data *data = xcalloc(1, sizeof(*data));
|
struct git_transport_data *data = xcalloc(1, sizeof(*data));
|
||||||
|
|
Loading…
Reference in New Issue