| ... | @@ -85,30 +85,6 @@ pub fn writeLink(w: *Writer, sub_path: []const u8, link_name: []const u8, option | ... | @@ -85,30 +85,6 @@ pub fn writeLink(w: *Writer, sub_path: []const u8, link_name: []const u8, option |
| 85 | try w.writeHeader(.symbolic_link, sub_path, link_name, 0, options); | 85 | try w.writeHeader(.symbolic_link, sub_path, link_name, 0, options); |
| 86 | } | 86 | } |
| 87 | | 87 | |
| 88 | /// Writes fs.Dir.WalkerEntry. Uses `mtime` from file system entry and | | |
| 89 | /// default for entry mode . | | |
| 90 | pub fn writeEntry(w: *Writer, entry: std.fs.Dir.Walker.Entry) Error!void { | | |
| 91 | switch (entry.kind) { | | |
| 92 | .directory => { | | |
| 93 | try w.writeDir(entry.path, .{ .mtime = try entryMtime(entry) }); | | |
| 94 | }, | | |
| 95 | .file => { | | |
| 96 | var file = try entry.dir.openFile(entry.basename, .{}); | | |
| 97 | defer file.close(); | | |
| 98 | const stat = try file.stat(); | | |
| 99 | try w.writeFile(entry.path, file, stat); | | |
| 100 | }, | | |
| 101 | .sym_link => { | | |
| 102 | var link_name_buffer: [std.fs.max_path_bytes]u8 = undefined; | | |
| 103 | const link_name = try entry.dir.readLink(entry.basename, &link_name_buffer); | | |
| 104 | try w.writeLink(entry.path, link_name, .{ .mtime = try entryMtime(entry) }); | | |
| 105 | }, | | |
| 106 | else => { | | |
| 107 | return error.UnsupportedWalkerEntryKind; | | |
| 108 | }, | | |
| 109 | } | | |
| 110 | } | | |
| 111 | | | |
| 112 | fn writeHeader( | 88 | fn writeHeader( |
| 113 | w: *Writer, | 89 | w: *Writer, |
| 114 | typeflag: Header.FileType, | 90 | typeflag: Header.FileType, |
| ... | @@ -120,7 +96,7 @@ fn writeHeader( | ... | @@ -120,7 +96,7 @@ fn writeHeader( |
| 120 | var header = Header.init(typeflag); | 96 | var header = Header.init(typeflag); |
| 121 | try w.setPath(&header, sub_path); | 97 | try w.setPath(&header, sub_path); |
| 122 | try header.setSize(size); | 98 | try header.setSize(size); |
| 123 | try header.setMtime(if (options.mtime != 0) options.mtime else w.mtimeNow()); | 99 | try header.setMtime(options.mtime); |
| 124 | if (options.mode != 0) | 100 | if (options.mode != 0) |
| 125 | try header.setMode(options.mode); | 101 | try header.setMode(options.mode); |
| 126 | if (typeflag == .symbolic_link) | 102 | if (typeflag == .symbolic_link) |
| ... | @@ -131,17 +107,6 @@ fn writeHeader( | ... | @@ -131,17 +107,6 @@ fn writeHeader( |
| 131 | try header.write(w.underlying_writer); | 107 | try header.write(w.underlying_writer); |
| 132 | } | 108 | } |
| 133 | | 109 | |
| 134 | fn mtimeNow(w: *Writer) u64 { | | |
| 135 | if (w.mtime_now == 0) | | |
| 136 | w.mtime_now = @intCast(std.time.timestamp()); | | |
| 137 | return w.mtime_now; | | |
| 138 | } | | |
| 139 | | | |
| 140 | fn entryMtime(entry: std.fs.Dir.Walker.Entry) !u64 { | | |
| 141 | const stat = try entry.dir.statFile(entry.basename); | | |
| 142 | return @intCast(@divFloor(stat.mtime, std.time.ns_per_s)); | | |
| 143 | } | | |
| 144 | | | |
| 145 | /// Writes path in posix header, if don't fit (in name+prefix; 100+155 | 110 | /// Writes path in posix header, if don't fit (in name+prefix; 100+155 |
| 146 | /// bytes) writes it in gnu extended header. | 111 | /// bytes) writes it in gnu extended header. |
| 147 | fn setPath(w: *Writer, header: *Header, sub_path: []const u8) Error!void { | 112 | fn setPath(w: *Writer, header: *Header, sub_path: []const u8) Error!void { |