forked from torch/paths
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinit.lua
117 lines (107 loc) · 3.22 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
require 'libpaths'
local assert = assert
local debug = debug
local pcall = pcall
local type = type
local ipairs = ipairs
local os = os
function paths.is_win()
return paths.uname():match('Windows')
end
function paths.is_mac()
return paths.uname():match('Darwin')
end
if paths.is_win() then
paths.home = os.getenv('HOMEDRIVE') or 'C:'
paths.home = paths.home .. ( os.getenv('HOMEPATH') or '\\' )
else
paths.home = os.getenv('HOME') or '.'
end
function paths.files(s)
local d = paths.dir(s)
local n = 0
return function()
n = n + 1
if (d and n <= #d) then
return d[n]
else
return nil
end
end
end
function paths.thisfile(arg, depth)
local s = debug.getinfo(depth or 2).source
if type(s) ~= "string" then
s = nil
elseif s:match("^@") then -- when called from a file
s = paths.concat(s:sub(2))
elseif s:match("^qt[.]") then -- when called from a qtide editor
local function z(s) return qt[s].fileName:tostring() end
local b, f = pcall(z, s:sub(4));
if b and f and f ~= "" then s = f else s = nil end
end
if type(arg) == "string" then
if s then s = paths.concat(paths.dirname(s), arg) else s = arg end
end
return s
end
function paths.dofile(f, depth)
local s = paths.thisfile(nil, 1 + (depth or 2))
if s and s ~= "" then
f = paths.concat(paths.dirname(s),f)
end
return dofile(f)
end
function paths.rmall(d, more)
if more ~= 'yes' then
return nil, "missing second argument ('yes')"
elseif paths.filep(d) then
return os.remove(d)
elseif paths.dirp(d) then
for f in paths.files(d) do
if f ~= '.' and f ~= '..' then
local ff = paths.concat(d, f)
local r0,r1,r2 = paths.rmall(ff, more)
if not r0 then
return r0,r1,ff
end
end
end
return paths.rmdir(d)
else
return nil, "not a file or directory", d
end
end
function paths.findprogram(...)
for _,exe in ipairs{...} do
if paths.is_win() then
if not exe:match('[.]exe$') then
exe = exe .. '.exe'
end
local path, k, x = os.getenv("PATH") or "."
for dir in path:gmatch('[^;]+') do
x = paths.concat(dir, exe)
if paths.filep(x) then return x end
end
local function clean(s)
if s:match('^"') then return s:match('[^"]+') else return s end
end
k = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' .. exe
x = paths.getregistryvalue('HKEY_CURRENT_USER', k, '')
if type(x) == 'string' then return clean(x) end
x = paths.getregistryvalue('HKEY_LOCAL_MACHINE', k, '')
if type(x) == 'string' then return clean(x) end
k = 'Applications\\' .. exe .. '\\shell\\open\\command'
x = paths.getregistryvalue('HKEY_CLASSES_ROOT', k, '')
if type(x) == 'string' then return clean(x) end
else
local path = os.getenv("PATH") or "."
for dir in path:gmatch('[^:]+') do
local x = paths.concat(dir, exe)
if paths.filep(x) then return x end
end
end
end
return nil
end
return paths