strbuf_read_file enhancement, and use it.
authorPierre Habouzit <madcoder@debian.org>
Thu, 27 Sep 2007 13:25:55 +0000 (15:25 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 30 Sep 2007 04:26:10 +0000 (21:26 -0700)
* make strbuf_read_file take a size hint (works like strbuf_read)
* use it in a couple of places.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-apply.c
builtin-blame.c
builtin-tag.c
strbuf.c
strbuf.h

index 740623e..fec96a8 100644 (file)
@@ -1425,8 +1425,6 @@ static void show_stats(struct patch *patch)
 
 static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
 {
-       int fd;
-
        switch (st->st_mode & S_IFMT) {
        case S_IFLNK:
                strbuf_grow(buf, st->st_size);
@@ -1435,14 +1433,8 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
                strbuf_setlen(buf, st->st_size);
                return 0;
        case S_IFREG:
-               fd = open(path, O_RDONLY);
-               if (fd < 0)
-                       return error("unable to open %s", path);
-               if (strbuf_read(buf, fd, st->st_size) < 0) {
-                       close(fd);
-                       return -1;
-               }
-               close(fd);
+               if (strbuf_read_file(buf, path, st->st_size) != st->st_size)
+                       return error("unable to open or read %s", path);
                convert_to_git(path, buf->buf, buf->len, buf);
                return 0;
        default:
index 16c0ca8..e3112a2 100644 (file)
@@ -2002,7 +2002,6 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
        unsigned char head_sha1[20];
        struct strbuf buf;
        const char *ident;
-       int fd;
        time_t now;
        int size, len;
        struct cache_entry *ce;
@@ -2041,11 +2040,8 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
                mode = canon_mode(st.st_mode);
                switch (st.st_mode & S_IFMT) {
                case S_IFREG:
-                       fd = open(read_from, O_RDONLY);
-                       if (fd < 0)
-                               die("cannot open %s", read_from);
-                       if (strbuf_read(&buf, fd, 0) != xsize_t(st.st_size))
-                               die("cannot read %s", read_from);
+                       if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
+                               die("cannot open or read %s", read_from);
                        break;
                case S_IFLNK:
                        if (readlink(read_from, buf.buf, buf.alloc) != fin_size)
index 6132cac..66e5a58 100644 (file)
@@ -51,7 +51,7 @@ static void launch_editor(const char *path, struct strbuf *buffer)
        if (run_command(&child))
                die("There was a problem with the editor %s.", editor);
 
-       if (strbuf_read_file(buffer, path) < 0)
+       if (strbuf_read_file(buffer, path, 0) < 0)
                die("could not read message file '%s': %s",
                    path, strerror(errno));
 }
@@ -356,8 +356,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                        continue;
                }
                if (!strcmp(arg, "-F")) {
-                       int fd;
-
                        annotate = 1;
                        i++;
                        if (i == argc)
@@ -365,17 +363,14 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                        if (message)
                                die("only one -F or -m option is allowed.");
 
-                       if (!strcmp(argv[i], "-"))
-                               fd = 0;
-                       else {
-                               fd = open(argv[i], O_RDONLY);
-                               if (fd < 0)
-                                       die("could not open '%s': %s",
+                       if (!strcmp(argv[i], "-")) {
+                               if (strbuf_read(&buf, 0, 1024) < 0)
+                                       die("cannot read %s", argv[i]);
+                       } else {
+                               if (strbuf_read_file(&buf, argv[i], 1024) < 0)
+                                       die("could not open or read '%s': %s",
                                                argv[i], strerror(errno));
                        }
-                       if (strbuf_read(&buf, fd, 1024) < 0) {
-                               die("cannot read %s", argv[i]);
-                       }
                        message = 1;
                        continue;
                }
index 0e431da..f4201e1 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -186,14 +186,14 @@ int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
        return 0;
 }
 
-int strbuf_read_file(struct strbuf *sb, const char *path)
+int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint)
 {
        int fd, len;
 
        fd = open(path, O_RDONLY);
        if (fd < 0)
                return -1;
-       len = strbuf_read(sb, fd, 0);
+       len = strbuf_read(sb, fd, hint);
        close(fd);
        if (len < 0)
                return -1;
index 6deec78..9b9e861 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -108,7 +108,7 @@ extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
 extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
 /* XXX: if read fails, any partial read is undone */
 extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
-extern int strbuf_read_file(struct strbuf *sb, const char *path);
+extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
 
 extern int strbuf_getline(struct strbuf *, FILE *, int);