From bae8a0a45393518bbf7914b10bf36139a977cda6 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sat, 11 Jan 2025 15:37:12 +0100 Subject: handle special cases in util.dirname --- util.lua | 22 +++++++++++++++++++++- util_test.lua | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100755 util_test.lua diff --git a/util.lua b/util.lua index 8d9df9b..de5ad07 100644 --- a/util.lua +++ b/util.lua @@ -127,7 +127,27 @@ end -- @param the pathname -- @return the pathname up to the last '/' function util.dirname(name) - return name:match('(.*[/])') + if name == '.' or name == '..' or name == '/' then + return name + end + + -- strip a trailing path separator + if name:sub(#name, #name) == '/' then + name = name:sub(1, #name - 1) + end + + local dirname = name:match('(.*)[/]') + -- There was no path separator in name. + if not dirname then + return '.' + end + + -- The name started with the root dir. + if dirname == '' then + return '/' + end + + return dirname end --- Create an iterator yielding the nth line of a file diff --git a/util_test.lua b/util_test.lua new file mode 100755 index 0000000..fd6570d --- /dev/null +++ b/util_test.lua @@ -0,0 +1,18 @@ +#!/usr/bin/env lua5.4 + +-- mock vis global +vis = {} -- luacheck: ignore 111 +local util = require('util') + +local lunatest = require('lunatest') + +function test_dirname() -- luacheck: ignore 111 + lunatest.assert_equal('/usr', util.dirname('/usr/lib')) + lunatest.assert_equal('/', util.dirname('/usr/')) + lunatest.assert_equal('.', util.dirname('usr')) + lunatest.assert_equal('.', util.dirname('.')) + lunatest.assert_equal('..', util.dirname('..')) + lunatest.assert_equal('/', util.dirname('/')) +end + +lunatest.run() -- cgit v1.2.3