Code

add a howto document about corrupted blob recovery
[git.git] / builtin-tag.c
index 82ebda11b02b2fd1fad3e3687832bb222e84f500..4aca3dc79b2a3d28f158ff61c01363244bfd7637 100644 (file)
@@ -22,7 +22,6 @@ static void launch_editor(const char *path, struct strbuf *buffer)
        const char *editor, *terminal;
        struct child_process child;
        const char *args[3];
-       int fd;
 
        editor = getenv("GIT_EDITOR");
        if (!editor && editor_program)
@@ -52,13 +51,9 @@ static void launch_editor(const char *path, struct strbuf *buffer)
        if (run_command(&child))
                die("There was a problem with the editor %s.", editor);
 
-       fd = open(path, O_RDONLY);
-       if (fd < 0)
-               die("could not open '%s': %s", path, strerror(errno));
-       if (strbuf_read(buffer, fd, 0) < 0) {
-               die("could not read message file '%s': %s", path, strerror(errno));
-       }
-       close(fd);
+       if (strbuf_read_file(buffer, path, 0) < 0)
+               die("could not read message file '%s': %s",
+                   path, strerror(errno));
 }
 
 struct tag_filter {
@@ -86,17 +81,16 @@ static int show_reference(const char *refname, const unsigned char *sha1,
                }
                printf("%-15s ", refname);
 
-               sp = buf = read_sha1_file(sha1, &type, &size);
-               if (!buf)
+               buf = read_sha1_file(sha1, &type, &size);
+               if (!buf || !size)
                        return 0;
-               if (!size) {
+
+               /* skip header */
+               sp = strstr(buf, "\n\n");
+               if (!sp) {
                        free(buf);
                        return 0;
                }
-               /* skip header */
-               while (sp + 1 < buf + size &&
-                               !(sp[0] == '\n' && sp[1] == '\n'))
-                       sp++;
                /* only take up to "lines" lines, and strip the signature */
                for (i = 0, sp += 2;
                                i < filter->lines && sp < buf + size &&
@@ -296,14 +290,11 @@ static void create_tag(const unsigned char *object, const char *tag,
                free(path);
        }
 
-       strbuf_setlen(buf, stripspace(buf->buf, buf->len, 1));
+       stripspace(buf, 1);
 
        if (!message && !buf->len)
                die("no tag message?");
 
-       /* insert the header and add the '\n' if needed: */
-       if (buf->len)
-               strbuf_addch(buf, '\n');
        strbuf_insert(buf, 0, header_buf, header_len);
 
        if (sign && do_sign(buf) < 0)
@@ -364,8 +355,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)
@@ -373,17 +362,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;
                }