X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=mod_query%2Fmod_query_chdir.lua;h=083cf50f60af4515e10111872750cf99d3d9c416;hp=dcf4d2a7e5120faaafbde08b3b83607e0752014c;hb=720e6978185b09f2b2f60a6b96018238085a7238;hpb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f diff --git a/mod_query/mod_query_chdir.lua b/mod_query/mod_query_chdir.lua index dcf4d2a..083cf50 100644 --- a/mod_query/mod_query_chdir.lua +++ b/mod_query/mod_query_chdir.lua @@ -6,17 +6,49 @@ -- See the included file LICENSE for details. -- +local function simplify_path(path) + local npath=string.gsub(path, "([^/]+)/+%.%./+", "") + if npath~=path then + return simplify_path(npath) + else + return string.gsub(string.gsub(path, "([^/]+)/+%.%.$", ""), "/+", "/") + end +end + +local function relative_path(path) + return not string.find(path, "^/") +end + +local function empty_path(path) + return (not path or path=="") +end + local function ws_chdir(mplex, params) + local nwd=params[1] + ws=assert(ioncore.find_manager(mplex, "WGroupWS")) - local ok, err=ioncore.chdir_for(ws, params[1] or "") + + if not empty_path(nwd) and relative_path(nwd) then + local owd=ioncore.get_dir_for(ws) + if empty_path(owd) then + owd=os.getenv("PWD") + end + if owd then + nwd=owd.."/"..nwd + end + end + local ok, err=ioncore.chdir_for(ws, nwd and simplify_path(nwd)) if not ok then mod_query.warn(mplex, err) end end local function ws_showdir(mplex, params) - local dir=assert(ioncore.get_dir_for(mplex) or os.getenv("PWD")) - mod_query.message(mplex, dir) + local dir=ioncore.get_dir_for(mplex) + if empty_path(dir) then + dir=os.getenv("PWD") + end + mod_query.message(mplex, dir or "(?)") end mod_query.defcmd("cd", ws_chdir)