diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-10-13 15:19:31 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-10-13 15:50:21 -0700 |
commit | 2727b71f0547f5181653940d279854e7924788fb (patch) | |
tree | e8a94c1d0020cfcd05b1fc36565776f00d062374 | |
parent | e9ee84cf28b6c7e5079ab3c020c86a44900a3f46 (diff) | |
download | git-jc/unseekable-bundle.tar.gz |
bundle: add parse_bundle_header() helper functionjc/unseekable-bundle
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>
-rw-r--r-- | bundle.c | 39 | ||||
-rw-r--r-- | bundle.h | 1 | ||||
-rw-r--r-- | transport.c | 2 |
3 files changed, 33 insertions, 9 deletions
@@ -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; } @@ -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 { @@ -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; @@ -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); diff --git a/transport.c b/transport.c index c9c8056f9d..84d6480ce6 100644 --- a/transport.c +++ b/transport.c @@ -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; |