Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Oct 13, 2011
1 parent e9ee84c commit 2727b71
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 9 deletions.
39 changes: 31 additions & 8 deletions bundle.c
Expand Up @@ -40,19 +40,18 @@ static int strbuf_readline_fd(struct strbuf *sb, int fd)
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;
int fd = open(path, O_RDONLY);
int status = 0;

if (fd < 0)
return error("could not open '%s'", path);

/* The bundle header begins with the signature */
if (strbuf_readline_fd(&buf, fd) ||
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;
goto abort;
}
Expand All @@ -77,8 +76,9 @@ int read_bundle_header(const char *path, struct bundle_header *header)
if (get_sha1_hex(buf.buf, sha1) ||
(40 <= buf.len && !isspace(buf.buf[40])) ||
(!is_prereq && buf.len <= 40)) {
error("unrecognized header: %s%s (%d)",
(is_prereq ? "-" : ""), buf.buf, (int)buf.len);
if (report_path)
error("unrecognized header: %s%s (%d)",
(is_prereq ? "-" : ""), buf.buf, (int)buf.len);
status = -1;
break;
} else {
Expand All @@ -98,6 +98,29 @@ int read_bundle_header(const char *path, struct bundle_header *header)
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)
{
int i;
Expand Down
1 change: 1 addition & 0 deletions bundle.h
Expand Up @@ -14,6 +14,7 @@ struct bundle_header {
struct ref_list references;
};

int is_bundle(const char *path, int quiet);
int read_bundle_header(const char *path, struct bundle_header *header);
int create_bundle(struct bundle_header *header, const char *path,
int argc, const char **argv);
Expand Down
2 changes: 1 addition & 1 deletion transport.c
Expand Up @@ -913,7 +913,7 @@ struct transport *transport_get(struct remote *remote, const char *url)
ret->fetch = fetch_objs_via_rsync;
ret->push = rsync_transport_push;
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));
ret->data = data;
ret->get_refs_list = get_refs_from_bundle;
Expand Down

0 comments on commit 2727b71

Please sign in to comment.