authorgravatar for igor.anic@gmail.comIgor Anić <igor.anic@gmail.com> 2023-12-02 15:00:42+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-13 19:37:33-07:00
log7b0bbc680fa831200653fb0af7cb46a768e0dd93
tree2b328a1ae2a1f021553774719b928046ae440b85
parent2a432d3008fa1e9af645de96b08cbad57709ffb5

tar: add file mode to result of tarbal iteration

So we have information to set executable bit on write to file system.

1 files changed, 26 insertions(+), 0 deletions(-)

lib/std/tar.zig+26
......@@ -109,6 +109,10 @@ pub const Header = struct {
109109 return header.str(0, 100);
110110 }
111111
112 pub fn mode(header: Header) !u32 {
113 return @intCast(try header.numeric(100, 8));
114 }
115
112116 pub fn fileSize(header: Header) !u64 {
113117 return header.numeric(124, 12);
114118 }
......@@ -429,6 +433,7 @@ fn Iterator(comptime ReaderType: type) type {
429433 name: []const u8, // name of file, symlink or directory
430434 link_name: []const u8, // target name of symlink
431435 size: usize, // size of the file in bytes
436 mode: u32,
432437 file_type: Header.FileType,
433438
434439 reader: *BufferedReaderType,
......@@ -471,6 +476,7 @@ fn Iterator(comptime ReaderType: type) type {
471476 .link_name = self.scratch.link_name,
472477 .size = self.scratch.size,
473478 .reader = &self.reader,
479 .mode = try header.mode(),
474480 };
475481 self.padding = blockPadding(file.size);
476482 return file;
......@@ -689,6 +695,7 @@ const TestCase = struct {
689695 const File = struct {
690696 name: []const u8,
691697 size: usize = 0,
698 mode: u32 = 0,
692699 link_name: []const u8 = &[0]u8{},
693700 file_type: Header.FileType = .normal,
694701 truncated: bool = false, // when there is no file body, just header, usefull for huge files
......@@ -713,10 +720,12 @@ test "tar run Go test cases" {
713720 .{
714721 .name = "small.txt",
715722 .size = 5,
723 .mode = 0o640,
716724 },
717725 .{
718726 .name = "small2.txt",
719727 .size = 11,
728 .mode = 0o640,
720729 },
721730 },
722731 .chksums = &[_][]const u8{
......@@ -734,10 +743,12 @@ test "tar run Go test cases" {
734743 .{
735744 .name = "small.txt",
736745 .size = 5,
746 .mode = 0o640,
737747 },
738748 .{
739749 .name = "small2.txt",
740750 .size = 11,
751 .mode = 0o640,
741752 },
742753 },
743754 .chksums = &[_][]const u8{
......@@ -751,10 +762,12 @@ test "tar run Go test cases" {
751762 .{
752763 .name = "small.txt",
753764 .size = 5,
765 .mode = 0o444,
754766 },
755767 .{
756768 .name = "small2.txt",
757769 .size = 11,
770 .mode = 0o444,
758771 },
759772 },
760773 .chksums = &[_][]const u8{
......@@ -768,11 +781,13 @@ test "tar run Go test cases" {
768781 .{
769782 .name = "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
770783 .size = 7,
784 .mode = 0o664,
771785 },
772786 .{
773787 .name = "a/b",
774788 .size = 0,
775789 .file_type = .symbolic_link,
790 .mode = 0o777,
776791 .link_name = "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
777792 },
778793 },
......@@ -793,6 +808,7 @@ test "tar run Go test cases" {
793808 .name = "foo",
794809 .size = 999,
795810 .file_type = .normal,
811 .mode = 0o640,
796812 },
797813 },
798814 .chksums = &[_][]const u8{
......@@ -833,6 +849,7 @@ test "tar run Go test cases" {
833849 .name = "P1050238.JPG.log",
834850 .size = 14,
835851 .file_type = .normal,
852 .mode = 0o664,
836853 },
837854 },
838855 .chksums = &[_][]const u8{
......@@ -847,11 +864,13 @@ test "tar run Go test cases" {
847864 .name = "small.txt",
848865 .size = 5,
849866 .file_type = .normal,
867 .mode = 0o644,
850868 },
851869 .{
852870 .name = "small2.txt",
853871 .size = 11,
854872 .file_type = .normal,
873 .mode = 0o644,
855874 },
856875 },
857876 .chksums = &[_][]const u8{
......@@ -890,6 +909,7 @@ test "tar run Go test cases" {
890909 .files = &[_]TestCase.File{
891910 .{
892911 .name = "0123456789",
912 .mode = 0o644,
893913 },
894914 },
895915 },
......@@ -898,6 +918,7 @@ test "tar run Go test cases" {
898918 .files = &[_]TestCase.File{
899919 .{
900920 .name = "☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹☺☻☹",
921 .mode = 0o644,
901922 },
902923 },
903924 },
......@@ -906,6 +927,7 @@ test "tar run Go test cases" {
906927 .files = &[_]TestCase.File{
907928 .{
908929 .name = "hi\x80\x81\x82\x83bye",
930 .mode = 0o644,
909931 },
910932 },
911933 },
......@@ -948,6 +970,7 @@ test "tar run Go test cases" {
948970 .files = &[_]TestCase.File{
949971 .{
950972 .name = "file",
973 .mode = 0o644,
951974 },
952975 },
953976 },
......@@ -968,6 +991,7 @@ test "tar run Go test cases" {
968991 .name = "tmp/16gig.txt",
969992 .size = 16 * 1024 * 1024 * 1024,
970993 .truncated = true,
994 .mode = 0o640,
971995 },
972996 },
973997 },
......@@ -978,6 +1002,7 @@ test "tar run Go test cases" {
9781002 .{
9791003 .name = "longname/" ** 15 ++ "16gig.txt",
9801004 .size = 16 * 1024 * 1024 * 1024,
1005 .mode = 0o644,
9811006 .truncated = true,
9821007 },
9831008 },
......@@ -1002,6 +1027,7 @@ test "tar run Go test cases" {
10021027 try std.testing.expectEqualStrings(expected.name, actual.name);
10031028 try std.testing.expectEqual(expected.size, actual.size);
10041029 try std.testing.expectEqual(expected.file_type, actual.file_type);
1030 try std.testing.expectEqual(expected.mode, actual.mode);
10051031 try std.testing.expectEqualStrings(expected.link_name, actual.link_name);
10061032
10071033 if (case.chksums.len > i) {