ls but with io_uring

build: update for zig 0.15.1

rockorager.dev a9cfda7e 0251e76c

verified
+41 -33
+6 -6
build.zig.zon
··· 7 8 .dependencies = .{ 9 .ourio = .{ 10 - .url = "git+https://github.com/rockorager/ourio#c94a93d34c0b0082facdabc12b6b997f7ee8b648", 11 - .hash = "ourio-0.0.0-_s-z0S0XAgB2nng8oxDng5AlACiqMTcFGq77494HMBXw", 12 }, 13 .zeit = .{ 14 - .url = "git+https://github.com/rockorager/zeit#4496d1c40b2223c22a1341e175fc2ecd94cc0de9", 15 - .hash = "zeit-0.6.0-5I6bk1J1AgA13rteb6E0steXiOUKBYTzJZMMIuK9oEmb", 16 }, 17 .zzdoc = .{ 18 - .url = "git+https://github.com/rockorager/zzdoc#57e86eb4e621bc4a96fbe0dd89ad0986db6d0483", 19 - .hash = "zzdoc-0.0.0-tzT1PuPZAACr1jIJxjTrdOsLbfXS6idWFGfTq0gwxJiv", 20 }, 21 }, 22 .paths = .{
··· 7 8 .dependencies = .{ 9 .ourio = .{ 10 + .url = "git+https://github.com/rockorager/ourio#07bf94db87a9aea70d6e1a1dd99cac6fb9d38b35", 11 + .hash = "ourio-0.0.0-_s-z0Z0XAgBU_BFjdY8QjGhJ8vcdIONPSErlYRwLoxfg", 12 }, 13 .zeit = .{ 14 + .url = "git+https://github.com/rockorager/zeit#74be5a2afb346b2a6a6349abbb609e89ec7e65a6", 15 + .hash = "zeit-0.6.0-5I6bk4t8AgCP0UGGHVF_khlmWZkAF5XtfQWEKCyLoptU", 16 }, 17 .zzdoc = .{ 18 + .url = "git+https://github.com/rockorager/zzdoc#a54223bdc13a80839ccf9f473edf3a171e777946", 19 + .hash = "zzdoc-0.0.0-tzT1Ph7cAAC5YmXQXiBJHAg41_A5AUAC5VOm7ShnUxlz", 20 }, 21 }, 22 .paths = .{
+35 -27
src/main.zig
··· 152 153 var cmd: Command = .{ .arena = allocator }; 154 155 - cmd.opts.winsize = getWinsize(std.io.getStdOut().handle); 156 157 cmd.opts.shortview = if (cmd.opts.isatty()) .columns else .oneline; 158 159 - const stdout = std.io.getStdOut().writer(); 160 - const stderr = std.io.getStdErr().writer(); 161 - var bw = std.io.bufferedWriter(stdout); 162 163 var args = std.process.args(); 164 // skip binary ··· 261 } else if (eql(opt, "help")) { 262 return stderr.writeAll(usage); 263 } else if (eql(opt, "version")) { 264 - try bw.writer().print("lsr {s}\r\n", .{build_options.version}); 265 - try bw.flush(); 266 return; 267 } else { 268 try stderr.print("Invalid opt: '{s}'\n", .{opt}); ··· 326 327 if (cmd.entries.len == 0) { 328 if (multiple_dirs and dir_idx < cmd.opts.directories.items.len - 1) { 329 - try bw.writer().writeAll("\r\n"); 330 } 331 continue; 332 } ··· 338 } 339 340 if (multiple_dirs and !cmd.opts.tree) { 341 - if (dir_idx > 0) try bw.writer().writeAll("\r\n"); 342 - try bw.writer().print("{s}:\r\n", .{directory}); 343 } 344 345 if (cmd.opts.tree) { 346 - if (multiple_dirs and dir_idx > 0) try bw.writer().writeAll("\r\n"); 347 - try printTree(cmd, bw.writer()); 348 } else if (cmd.opts.long) { 349 - try printLong(&cmd, bw.writer()); 350 } else switch (cmd.opts.shortview) { 351 - .columns => try printShortColumns(cmd, bw.writer()), 352 - .oneline => try printShortOnePerLine(cmd, bw.writer()), 353 } 354 } 355 - try bw.flush(); 356 } 357 358 fn printShortColumns(cmd: Command, writer: anytype) !void { ··· 429 430 if (i < columns.items.len - 1) { 431 const spaces = column.width - (icon_width + entry.name.len); 432 - try writer.writeByteNTimes(' ', spaces); 433 } 434 } 435 try writer.writeAll("\r\n"); ··· 519 try writer.print("{s}\n", .{dir_name}); 520 521 const max_depth = cmd.opts.tree_depth orelse std.math.maxInt(usize); 522 - var prefix_list = std.ArrayList(bool).init(cmd.arena); 523 524 for (cmd.entries, 0..) |entry, i| { 525 const is_last = i == cmd.entries.len - 1; ··· 531 if (entry.kind == .directory and max_depth > 0) { 532 const full_path = try std.fs.path.joinZ(cmd.arena, &.{ cmd.current_directory, entry.name }); 533 534 - try prefix_list.append(is_last); 535 try recurseTree(cmd, writer, full_path, &prefix_list, 1, max_depth); 536 537 _ = prefix_list.pop(); ··· 545 }; 546 defer dir.close(); 547 548 - var entries = std.ArrayList(Entry).init(cmd.arena); 549 var iter = dir.iterate(); 550 551 while (try iter.next()) |dirent| { 552 if (!cmd.opts.showDotfiles() and std.mem.startsWith(u8, dirent.name, ".")) continue; 553 554 const nameZ = try cmd.arena.dupeZ(u8, dirent.name); 555 - try entries.append(.{ 556 .name = nameZ, 557 .kind = dirent.kind, 558 .statx = undefined, ··· 575 if (entry.kind == .directory and depth < max_depth) { 576 const full_path = try std.fs.path.joinZ(cmd.arena, &.{ dir_path, entry.name }); 577 578 - try prefix_list.append(is_last); 579 try recurseTree(cmd, writer, full_path, prefix_list, depth + 1, max_depth); 580 581 _ = prefix_list.pop(); ··· 690 try writer.writeAll(&mode); 691 try writer.writeByte(' '); 692 try writer.writeAll(user.name); 693 - try writer.writeByteNTimes(' ', longest_user - user.name.len); 694 try writer.writeByte(' '); 695 try writer.writeAll(group.name); 696 - try writer.writeByteNTimes(' ', longest_group - group.name.len); 697 try writer.writeByte(' '); 698 699 var size_buf: [16]u8 = undefined; 700 const size = try entry.humanReadableSize(&size_buf); 701 const suffix = entry.humanReadableSuffix(); 702 703 - try writer.writeByteNTimes(' ', longest_size - size.len); 704 try writer.writeAll(size); 705 try writer.writeByte(' '); 706 try writer.writeAll(suffix); 707 - try writer.writeByteNTimes(' ', longest_suffix - suffix.len); 708 try writer.writeByte(' '); 709 710 try writer.print("{d: >2} {s} ", .{ ··· 1109 const n = try result.read; 1110 _ = try io.close(task.req.read.fd, .{}); 1111 const bytes = task.req.read.buffer[0..n]; 1112 - var fbs = std.io.fixedBufferStream(bytes); 1113 - const tz = try zeit.timezone.TZInfo.parse(cmd.arena, fbs.reader()); 1114 cmd.tz = .{ .tzinfo = tz }; 1115 }, 1116
··· 152 153 var cmd: Command = .{ .arena = allocator }; 154 155 + cmd.opts.winsize = getWinsize(std.fs.File.stdout().handle); 156 157 cmd.opts.shortview = if (cmd.opts.isatty()) .columns else .oneline; 158 159 + var stdout_buf: [4096]u8 = undefined; 160 + var stderr_buf: [4096]u8 = undefined; 161 + var stdout_writer = std.fs.File.stdout().writer(&stdout_buf); 162 + var stderr_writer = std.fs.File.stderr().writer(&stderr_buf); 163 + var stdout = &stdout_writer.interface; 164 + var stderr = &stderr_writer.interface; 165 166 var args = std.process.args(); 167 // skip binary ··· 264 } else if (eql(opt, "help")) { 265 return stderr.writeAll(usage); 266 } else if (eql(opt, "version")) { 267 + try stdout.print("lsr {s}\r\n", .{build_options.version}); 268 + try stdout.flush(); 269 return; 270 } else { 271 try stderr.print("Invalid opt: '{s}'\n", .{opt}); ··· 329 330 if (cmd.entries.len == 0) { 331 if (multiple_dirs and dir_idx < cmd.opts.directories.items.len - 1) { 332 + try stdout.writeAll("\r\n"); 333 } 334 continue; 335 } ··· 341 } 342 343 if (multiple_dirs and !cmd.opts.tree) { 344 + if (dir_idx > 0) try stdout.writeAll("\r\n"); 345 + try stdout.print("{s}:\r\n", .{directory}); 346 } 347 348 if (cmd.opts.tree) { 349 + if (multiple_dirs and dir_idx > 0) try stdout.writeAll("\r\n"); 350 + try printTree(cmd, stdout); 351 } else if (cmd.opts.long) { 352 + try printLong(&cmd, stdout); 353 } else switch (cmd.opts.shortview) { 354 + .columns => try printShortColumns(cmd, stdout), 355 + .oneline => try printShortOnePerLine(cmd, stdout), 356 } 357 } 358 + try stdout.flush(); 359 } 360 361 fn printShortColumns(cmd: Command, writer: anytype) !void { ··· 432 433 if (i < columns.items.len - 1) { 434 const spaces = column.width - (icon_width + entry.name.len); 435 + var space_buf = [_][]const u8{" "}; 436 + try writer.writeSplatAll(&space_buf, spaces); 437 } 438 } 439 try writer.writeAll("\r\n"); ··· 523 try writer.print("{s}\n", .{dir_name}); 524 525 const max_depth = cmd.opts.tree_depth orelse std.math.maxInt(usize); 526 + var prefix_list: std.ArrayList(bool) = .{}; 527 528 for (cmd.entries, 0..) |entry, i| { 529 const is_last = i == cmd.entries.len - 1; ··· 535 if (entry.kind == .directory and max_depth > 0) { 536 const full_path = try std.fs.path.joinZ(cmd.arena, &.{ cmd.current_directory, entry.name }); 537 538 + try prefix_list.append(cmd.arena, is_last); 539 try recurseTree(cmd, writer, full_path, &prefix_list, 1, max_depth); 540 541 _ = prefix_list.pop(); ··· 549 }; 550 defer dir.close(); 551 552 + var entries: std.ArrayList(Entry) = .{}; 553 var iter = dir.iterate(); 554 555 while (try iter.next()) |dirent| { 556 if (!cmd.opts.showDotfiles() and std.mem.startsWith(u8, dirent.name, ".")) continue; 557 558 const nameZ = try cmd.arena.dupeZ(u8, dirent.name); 559 + try entries.append(cmd.arena, .{ 560 .name = nameZ, 561 .kind = dirent.kind, 562 .statx = undefined, ··· 579 if (entry.kind == .directory and depth < max_depth) { 580 const full_path = try std.fs.path.joinZ(cmd.arena, &.{ dir_path, entry.name }); 581 582 + try prefix_list.append(cmd.arena, is_last); 583 try recurseTree(cmd, writer, full_path, prefix_list, depth + 1, max_depth); 584 585 _ = prefix_list.pop(); ··· 694 try writer.writeAll(&mode); 695 try writer.writeByte(' '); 696 try writer.writeAll(user.name); 697 + var space_buf1 = [_][]const u8{" "}; 698 + try writer.writeSplatAll(&space_buf1, longest_user - user.name.len); 699 try writer.writeByte(' '); 700 try writer.writeAll(group.name); 701 + var space_buf2 = [_][]const u8{" "}; 702 + try writer.writeSplatAll(&space_buf2, longest_group - group.name.len); 703 try writer.writeByte(' '); 704 705 var size_buf: [16]u8 = undefined; 706 const size = try entry.humanReadableSize(&size_buf); 707 const suffix = entry.humanReadableSuffix(); 708 709 + var space_buf3 = [_][]const u8{" "}; 710 + try writer.writeSplatAll(&space_buf3, longest_size - size.len); 711 try writer.writeAll(size); 712 try writer.writeByte(' '); 713 try writer.writeAll(suffix); 714 + var space_buf4 = [_][]const u8{" "}; 715 + try writer.writeSplatAll(&space_buf4, longest_suffix - suffix.len); 716 try writer.writeByte(' '); 717 718 try writer.print("{d: >2} {s} ", .{ ··· 1117 const n = try result.read; 1118 _ = try io.close(task.req.read.fd, .{}); 1119 const bytes = task.req.read.buffer[0..n]; 1120 + var reader = std.Io.Reader.fixed(bytes); 1121 + const tz = try zeit.timezone.TZInfo.parse(cmd.arena, &reader); 1122 cmd.tz = .{ .tzinfo = tz }; 1123 }, 1124