]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_query/mod_query_chdir.lua
[svn-upgrade] Integrating new upstream version, ion3 (20071130)
[ion3.git] / mod_query / mod_query_chdir.lua
index dcf4d2a7e5120faaafbde08b3b83607e0752014c..083cf50f60af4515e10111872750cf99d3d9c416 100644 (file)
@@ -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)