bundle: add parse_bundle_header() helper function
Move most of the code from read_bundle_header() to parse_bundle_header() that takes a file descriptor that is already opened for reading, and make the former responsible only for opening the file and noticing errors. As a logical consequence of this, is_bundle() helper function can be implemented as a non-complaining variant of read_bundle_header() that does not return an open file descriptor, and can be used to tighten the check used to decide the use of bundle transport in transport_get() function. Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
e9ee84cf28
commit
2727b71f05
39
bundle.c
39
bundle.c
|
@ -40,19 +40,18 @@ static int strbuf_readline_fd(struct strbuf *sb, int fd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int read_bundle_header(const char *path, struct bundle_header *header)
|
static int parse_bundle_header(int fd, struct bundle_header *header,
|
||||||
|
const char *report_path)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
int fd = open(path, O_RDONLY);
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
if (fd < 0)
|
|
||||||
return error("could not open '%s'", path);
|
|
||||||
|
|
||||||
/* The bundle header begins with the signature */
|
/* The bundle header begins with the signature */
|
||||||
if (strbuf_readline_fd(&buf, fd) ||
|
if (strbuf_readline_fd(&buf, fd) ||
|
||||||
strcmp(buf.buf, bundle_signature)) {
|
strcmp(buf.buf, bundle_signature)) {
|
||||||
error("'%s' does not look like a v2 bundle file", path);
|
if (report_path)
|
||||||
|
error("'%s' does not look like a v2 bundle file",
|
||||||
|
report_path);
|
||||||
status = -1;
|
status = -1;
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
@ -77,8 +76,9 @@ int read_bundle_header(const char *path, struct bundle_header *header)
|
||||||
if (get_sha1_hex(buf.buf, sha1) ||
|
if (get_sha1_hex(buf.buf, sha1) ||
|
||||||
(40 <= buf.len && !isspace(buf.buf[40])) ||
|
(40 <= buf.len && !isspace(buf.buf[40])) ||
|
||||||
(!is_prereq && buf.len <= 40)) {
|
(!is_prereq && buf.len <= 40)) {
|
||||||
error("unrecognized header: %s%s (%d)",
|
if (report_path)
|
||||||
(is_prereq ? "-" : ""), buf.buf, (int)buf.len);
|
error("unrecognized header: %s%s (%d)",
|
||||||
|
(is_prereq ? "-" : ""), buf.buf, (int)buf.len);
|
||||||
status = -1;
|
status = -1;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -98,6 +98,29 @@ int read_bundle_header(const char *path, struct bundle_header *header)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int read_bundle_header(const char *path, struct bundle_header *header)
|
||||||
|
{
|
||||||
|
int fd = open(path, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return error("could not open '%s'", path);
|
||||||
|
return parse_bundle_header(fd, header, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_bundle(const char *path, int quiet)
|
||||||
|
{
|
||||||
|
struct bundle_header header;
|
||||||
|
int fd = open(path, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
return 0;
|
||||||
|
memset(&header, 0, sizeof(header));
|
||||||
|
fd = parse_bundle_header(fd, &header, quiet ? NULL : path);
|
||||||
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
|
return (fd >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
static int list_refs(struct ref_list *r, int argc, const char **argv)
|
static int list_refs(struct ref_list *r, int argc, const char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
1
bundle.h
1
bundle.h
|
@ -14,6 +14,7 @@ struct bundle_header {
|
||||||
struct ref_list references;
|
struct ref_list references;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int is_bundle(const char *path, int quiet);
|
||||||
int read_bundle_header(const char *path, struct bundle_header *header);
|
int read_bundle_header(const char *path, struct bundle_header *header);
|
||||||
int create_bundle(struct bundle_header *header, const char *path,
|
int create_bundle(struct bundle_header *header, const char *path,
|
||||||
int argc, const char **argv);
|
int argc, const char **argv);
|
||||||
|
|
|
@ -913,7 +913,7 @@ struct transport *transport_get(struct remote *remote, const char *url)
|
||||||
ret->fetch = fetch_objs_via_rsync;
|
ret->fetch = fetch_objs_via_rsync;
|
||||||
ret->push = rsync_transport_push;
|
ret->push = rsync_transport_push;
|
||||||
ret->smart_options = NULL;
|
ret->smart_options = NULL;
|
||||||
} else if (is_local(url) && is_file(url)) {
|
} else if (is_local(url) && is_file(url) && is_bundle(url, 1)) {
|
||||||
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
|
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
|
||||||
ret->data = data;
|
ret->data = data;
|
||||||
ret->get_refs_list = get_refs_from_bundle;
|
ret->get_refs_list = get_refs_from_bundle;
|
||||||
|
|
Loading…
Reference in New Issue