From d569e37cb538d17d009f5632c25acd643d3736cb Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 11 Dec 2020 18:20:57 -0700 Subject: [PATCH] std.fs.path.extension: different behavior for ending dot extension("a.") now returns "." instead of "". This matches both Python and Node.js standard library behavior as well as my personal opinion on how this function should be defined. Apologies for missing this in the code review. --- lib/std/fs/path.zig | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/std/fs/path.zig b/lib/std/fs/path.zig index a8456b20b2..9043889aa9 100644 --- a/lib/std/fs/path.zig +++ b/lib/std/fs/path.zig @@ -1197,7 +1197,7 @@ fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []cons /// - `"main.zig"` ⇒ `".zig"` /// - `"src/main.zig"` ⇒ `".zig"` /// - `".gitignore"` ⇒ `""` -/// - `"keep."` ⇒ `""` +/// - `"keep."` ⇒ `"."` /// - `"src.keep.me"` ⇒ `".me"` /// - `"/src/keep.me"` ⇒ `".me"` /// - `"/src/keep.me/"` ⇒ `".me"` @@ -1205,13 +1205,9 @@ fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []cons /// pointer address range of `path`, even if it is length zero. pub fn extension(path: []const u8) []const u8 { const filename = basename(path); - return if (std.mem.lastIndexOf(u8, filename, ".")) |index| - if (index == 0 or index == filename.len - 1) - path[path.len..] - else - filename[index..] - else - path[path.len..]; + const index = mem.lastIndexOf(u8, filename, ".") orelse return path[path.len..]; + if (index == 0) return path[path.len..]; + return filename[index..]; } fn testExtension(path: []const u8, expected: []const u8) void { @@ -1221,39 +1217,39 @@ fn testExtension(path: []const u8, expected: []const u8) void { test "extension" { testExtension("", ""); testExtension(".", ""); - testExtension("a.", ""); - testExtension("abc.", ""); + testExtension("a.", "."); + testExtension("abc.", "."); testExtension(".a", ""); testExtension(".file", ""); testExtension(".gitignore", ""); testExtension("file.ext", ".ext"); - testExtension("file.ext.", ""); + testExtension("file.ext.", "."); testExtension("very-long-file.bruh", ".bruh"); testExtension("a.b.c", ".c"); testExtension("a.b.c/", ".c"); testExtension("/", ""); testExtension("/.", ""); - testExtension("/a.", ""); - testExtension("/abc.", ""); + testExtension("/a.", "."); + testExtension("/abc.", "."); testExtension("/.a", ""); testExtension("/.file", ""); testExtension("/.gitignore", ""); testExtension("/file.ext", ".ext"); - testExtension("/file.ext.", ""); + testExtension("/file.ext.", "."); testExtension("/very-long-file.bruh", ".bruh"); testExtension("/a.b.c", ".c"); testExtension("/a.b.c/", ".c"); testExtension("/foo/bar/bam/", ""); testExtension("/foo/bar/bam/.", ""); - testExtension("/foo/bar/bam/a.", ""); - testExtension("/foo/bar/bam/abc.", ""); + testExtension("/foo/bar/bam/a.", "."); + testExtension("/foo/bar/bam/abc.", "."); testExtension("/foo/bar/bam/.a", ""); testExtension("/foo/bar/bam/.file", ""); testExtension("/foo/bar/bam/.gitignore", ""); testExtension("/foo/bar/bam/file.ext", ".ext"); - testExtension("/foo/bar/bam/file.ext.", ""); + testExtension("/foo/bar/bam/file.ext.", "."); testExtension("/foo/bar/bam/very-long-file.bruh", ".bruh"); testExtension("/foo/bar/bam/a.b.c", ".c"); testExtension("/foo/bar/bam/a.b.c/", ".c");