test: t4102-apply-rename fails with strict umask.
[gitweb.git] / tar-tree.c
index 673ac66ed6fd37eeeaa8580b2e43f0e2cee91a16..970c4bb54e148282a89f1249a96deca880bccafd 100644 (file)
@@ -17,7 +17,7 @@
 #define EXT_HEADER_PATH                1
 #define EXT_HEADER_LINKPATH    2
 
-static const char *tar_tree_usage = "git-tar-tree <key> [basedir]";
+static const char tar_tree_usage[] = "git-tar-tree <key> [basedir]";
 
 static char block[BLOCKSIZE];
 static unsigned long offset;
@@ -325,8 +325,8 @@ static void write_header(const unsigned char *sha1, char typeflag, const char *b
        memcpy(&header[257], "ustar", 6);
        memcpy(&header[263], "00", 2);
 
-       printf(&header[329], "%07o", 0);        /* devmajor */
-       printf(&header[337], "%07o", 0);        /* devminor */
+       sprintf(&header[329], "%07o", 0);       /* devmajor */
+       sprintf(&header[337], "%07o", 0);       /* devminor */
 
        memset(&header[148], ' ', 8);
        for (i = 0; i < RECORDSIZE; i++)
@@ -353,6 +353,8 @@ static void traverse_tree(void *buffer, unsigned long size,
 
                if (size < namelen + 20 || sscanf(buffer, "%o", &mode) != 1)
                        die("corrupt 'tree' file");
+               if (S_ISDIR(mode) || S_ISREG(mode))
+                       mode |= (mode & 0100) ? 0777 : 0666;
                buffer = sha1 + 20;
                size -= namelen + 20;