mailinfo: ignore blanks after in-body headers.
[git.git] / builtin-tar-tree.c
index 5f740cf..f6310b9 100644 (file)
@@ -168,8 +168,9 @@ static int get_path_prefix(const struct strbuf *path, int maxlen)
        int i = path->len;
        if (i > maxlen)
                i = maxlen;
-       while (i > 0 && path->buf[i] != '/')
+       do {
                i--;
+       } while (i > 0 && path->buf[i] != '/');
        return i;
 }
 
@@ -239,8 +240,8 @@ static void write_entry(const unsigned char *sha1, struct strbuf *path,
        /* XXX: should we provide more meaningful info here? */
        sprintf(header.uid, "%07o", 0);
        sprintf(header.gid, "%07o", 0);
-       strncpy(header.uname, "git", 31);
-       strncpy(header.gname, "git", 31);
+       safe_strncpy(header.uname, "git", sizeof(header.uname));
+       safe_strncpy(header.gname, "git", sizeof(header.gname));
        sprintf(header.devmajor, "%07o", 0);
        sprintf(header.devminor, "%07o", 0);
 
@@ -401,3 +402,28 @@ int cmd_tar_tree(int argc, const char **argv, char **envp)
                return remote_tar(argc, argv);
        return generate_tar(argc, argv, envp);
 }
+
+/* ustar header + extended global header content */
+#define HEADERSIZE (2 * RECORDSIZE)
+
+int cmd_get_tar_commit_id(int argc, const char **argv, char **envp)
+{
+       char buffer[HEADERSIZE];
+       struct ustar_header *header = (struct ustar_header *)buffer;
+       char *content = buffer + RECORDSIZE;
+       ssize_t n;
+
+       n = xread(0, buffer, HEADERSIZE);
+       if (n < HEADERSIZE)
+               die("git-get-tar-commit-id: read error");
+       if (header->typeflag[0] != 'g')
+               return 1;
+       if (memcmp(content, "52 comment=", 11))
+               return 1;
+
+       n = xwrite(1, content + 11, 41);
+       if (n < 41)
+               die("git-get-tar-commit-id: write error");
+
+       return 0;
+}