Merge branch 'bc/archive-pax-header-mode'
authorJunio C Hamano <gitster@pobox.com>
Tue, 2 Sep 2014 20:27:12 +0000 (13:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Sep 2014 20:27:13 +0000 (13:27 -0700)
Implementations of "tar" that do not understand an extended pax
header would extract the contents of it in a regular file; make
sure the permission bits of this file follows the same tar.umask
configuration setting.

* bc/archive-pax-header-mode:
archive: honor tar.umask even for pax headers

archive-tar.c
t/t5004-archive-corner-cases.sh
index 719b6298e6abf9c9e9e8009ec49dfc76d0d9e49b..603650fa3cc83e844cd6b0e61f145ed99a67158c 100644 (file)
@@ -192,7 +192,7 @@ static int write_extended_header(struct archiver_args *args,
        unsigned int mode;
        memset(&header, 0, sizeof(header));
        *header.typeflag = TYPEFLAG_EXT_HEADER;
-       mode = 0100666;
+       mode = 0100666 & ~tar_umask;
        sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1));
        prepare_header(args, &header, mode, size);
        write_blocked(&header, sizeof(header));
@@ -300,7 +300,7 @@ static int write_global_extended_header(struct archiver_args *args)
        strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40);
        memset(&header, 0, sizeof(header));
        *header.typeflag = TYPEFLAG_GLOBAL_HEADER;
-       mode = 0100666;
+       mode = 0100666 & ~tar_umask;
        strcpy(header.name, "pax_global_header");
        prepare_header(args, &header, mode, ext_header.len);
        write_blocked(&header, sizeof(header));
index 305bcac6b765111106887d4d24d99657c0554b5b..83d20c4ba9640fff27777917da0342940c33e0e3 100755 (executable)
@@ -113,4 +113,9 @@ test_expect_success 'archive empty subtree by direct pathspec' '
        check_dir extract sub
 '
 
+test_expect_success 'archive applies umask even for pax headers' '
+       git archive --format=tar HEAD >archive.tar &&
+       ! grep 0666 archive.tar
+'
+
 test_done