| author | |
| committer | |
| log | b1189ab038ad1885f961562bf188f0bd3da12153 |
| tree | 6cd6f6c77a0de4942f0ccacb06844bf422e02057 |
| parent | 32a34b64caaefd1a0ae78b6d344da9812cb0cdb8 |
| signature |
* add failing test case
* perform flush and allow error
* dont over constrain flush error
* reset seek error during conversion2 files changed, 31 insertions(+), 3 deletions(-)
lib/std/fs/File.zig+6-3| ... | ... | @@ -1505,7 +1505,7 @@ pub const Writer = struct { |
| 1505 | 1505 | sendfile_err: ?SendfileError = null, |
| 1506 | 1506 | copy_file_range_err: ?CopyFileRangeError = null, |
| 1507 | 1507 | fcopyfile_err: ?FcopyfileError = null, |
| 1508 | seek_err: ?SeekError = null, | |
| 1508 | seek_err: ?Writer.SeekError = null, | |
| 1509 | 1509 | interface: std.Io.Writer, |
| 1510 | 1510 | |
| 1511 | 1511 | pub const Mode = Reader.Mode; |
| ... | ... | @@ -1527,6 +1527,8 @@ pub const Writer = struct { |
| 1527 | 1527 | Unexpected, |
| 1528 | 1528 | }; |
| 1529 | 1529 | |
| 1530 | pub const SeekError = File.SeekError || std.Io.Writer.Error; | |
| 1531 | ||
| 1530 | 1532 | /// Number of slices to store on the stack, when trying to send as many byte |
| 1531 | 1533 | /// vectors through the underlying write calls as possible. |
| 1532 | 1534 | const max_buffers_len = 16; |
| ... | ... | @@ -1570,7 +1572,7 @@ pub const Writer = struct { |
| 1570 | 1572 | .mode = w.mode, |
| 1571 | 1573 | .pos = w.pos, |
| 1572 | 1574 | .interface = Reader.initInterface(w.interface.buffer), |
| 1573 | .seek_err = w.seek_err, | |
| 1575 | .seek_err = null, | |
| 1574 | 1576 | }; |
| 1575 | 1577 | } |
| 1576 | 1578 | |
| ... | ... | @@ -2000,7 +2002,8 @@ pub const Writer = struct { |
| 2000 | 2002 | return n; |
| 2001 | 2003 | } |
| 2002 | 2004 | |
| 2003 | pub fn seekTo(w: *Writer, offset: u64) SeekError!void { | |
| 2005 | pub fn seekTo(w: *Writer, offset: u64) Writer.SeekError!void { | |
| 2006 | try w.interface.flush(); | |
| 2004 | 2007 | switch (w.mode) { |
| 2005 | 2008 | .positional, .positional_reading => { |
| 2006 | 2009 | w.pos = offset; |
lib/std/fs/test.zig+25| ... | ... | @@ -2155,3 +2155,28 @@ test "seekBy" { |
| 2155 | 2155 | try testing.expectEqual(15, n); |
| 2156 | 2156 | try testing.expectEqualStrings("t's test seekBy", buffer[0..15]); |
| 2157 | 2157 | } |
| 2158 | ||
| 2159 | test "seekTo flushes buffered data" { | |
| 2160 | var tmp = std.testing.tmpDir(.{}); | |
| 2161 | defer tmp.cleanup(); | |
| 2162 | ||
| 2163 | const contents = "data"; | |
| 2164 | ||
| 2165 | const file = try tmp.dir.createFile("seek.bin", .{ .read = true }); | |
| 2166 | defer file.close(); | |
| 2167 | { | |
| 2168 | var buf: [16]u8 = undefined; | |
| 2169 | var file_writer = std.fs.File.writer(file, &buf); | |
| 2170 | ||
| 2171 | try file_writer.interface.writeAll(contents); | |
| 2172 | try file_writer.seekTo(8); | |
| 2173 | try file_writer.interface.flush(); | |
| 2174 | } | |
| 2175 | ||
| 2176 | var read_buffer: [16]u8 = undefined; | |
| 2177 | var file_reader: std.fs.File.Reader = .init(file, &read_buffer); | |
| 2178 | ||
| 2179 | var buf: [4]u8 = undefined; | |
| 2180 | try file_reader.interface.readSliceAll(&buf); | |
| 2181 | try std.testing.expectEqualStrings(contents, &buf); | |
| 2182 | } |