20 | 20 |
@log "opening '#{opts.root}'..."
|
21 | 21 |
|
22 | 22 |
-- fileders
|
23 | |
list_fileders_in: (path='') =>
|
|
23 |
get_order: (path, forgiving=false) =>
|
24 | 24 |
entries = {}
|
25 | |
for entry_name in lfs.dir @root .. path
|
26 | |
continue if '.' == entry_name\sub 1, 1
|
27 | |
entry_path = @root .. "#{path}/#{entry_name}"
|
|
25 |
for name in lfs.dir @root .. path
|
|
26 |
continue if '.' == name\sub 1, 1
|
|
27 |
entry_path = @root .. "#{path}/#{name}"
|
28 | 28 |
if 'directory' ~= lfs.attributes entry_path, 'mode'
|
29 | 29 |
continue
|
30 | 30 |
|
31 | |
entries[entry_name] = "#{path}/#{entry_name}"
|
|
31 |
entries[name] = :name, path: "#{path}/#{name}"
|
32 | 32 |
|
33 | 33 |
sorted = {}
|
34 | |
|
35 | 34 |
order_file = @root .. "#{path}/$order"
|
36 | 35 |
if 'file' == lfs.attributes order_file, 'mode'
|
37 | 36 |
for line in io.lines order_file
|
38 | |
path = assert entries[line], "entry in $order but not on disk: #{line}"
|
39 | |
table.insert sorted, path
|
|
37 |
entry = entries[line]
|
|
38 |
if not entry
|
|
39 |
if forgiving
|
|
40 |
@log "removed stale entry '#{line}' from #{path}/$order"
|
|
41 |
continue
|
|
42 |
error "entry in $order but not on disk: #{line}"
|
|
43 |
|
|
44 |
table.insert sorted, entry
|
40 | 45 |
sorted[line] = true
|
41 | 46 |
|
42 | |
entries = [path for entry, path in pairs entries when not sorted[entry]]
|
43 | |
table.sort entries
|
44 | |
for path in *entries
|
45 | |
table.insert sorted, path
|
|
47 |
unsorted = [entry for name, entry in pairs entries when not sorted[entry.name]]
|
|
48 |
if forgiving
|
|
49 |
for entry in *unsorted
|
|
50 |
@log "adding new entry '#{entry.name}' in #{path}/$order"
|
|
51 |
table.insert sorted, entry
|
|
52 |
else
|
|
53 |
assert #unsorted == 0, unsorted[1] and "entry on disk but not in $order: #{unsorted[1].path}"
|
|
54 |
|
|
55 |
sorted
|
|
56 |
|
|
57 |
write_order: (path, order=@get_order path, true) =>
|
|
58 |
order_file = @root .. "#{path}/$order"
|
|
59 |
if #order == 0
|
|
60 |
os.remove order_file
|
|
61 |
return
|
|
62 |
|
|
63 |
file = assert io.open order_file, 'w'
|
|
64 |
for { :name } in *order
|
|
65 |
file\write "#{name}\n"
|
|
66 |
file\close!
|
|
67 |
|
|
68 |
list_fileders_in: (path='') =>
|
|
69 |
sorted = @get_order path
|
46 | 70 |
|
47 | 71 |
coroutine.wrap ->
|
48 | |
for path in *sorted
|
|
72 |
for { :path } in *sorted
|
49 | 73 |
coroutine.yield path
|
50 | 74 |
|
51 | 75 |
create_fileder: (parent, name) =>
|
52 | 76 |
path = "#{parent}/#{name}"
|
53 | 77 |
@log "creating fileder #{path}"
|
54 | 78 |
assert lfs.mkdir @root .. path
|
|
79 |
@write_order parent
|
55 | 80 |
path
|
56 | 81 |
|
57 | 82 |
remove_fileder: (path) =>
|
|
72 | 97 |
|
73 | 98 |
rmdir @root .. path
|
74 | 99 |
|
|
100 |
parent = dir_base path
|
|
101 |
@write_order parent
|
|
102 |
|
75 | 103 |
rename_fileder: (path, next_name) =>
|
76 | 104 |
@log "renaming fileder #{path} -> '#{next_name}'"
|
77 | 105 |
parent, name = dir_base path
|
|
81 | 109 |
@log "moving fileder #{path} -> #{next_parent}/"
|
82 | 110 |
parent, name = dir_base path
|
83 | 111 |
assert os.rename @root .. path, @root .. "#{next_parent}/#{name}"
|
|
112 |
|
|
113 |
-- swap two childrens' order
|
|
114 |
swap_fileders: (parent, name_a, name_b) =>
|
|
115 |
@log "swapping #{name_a} and #{name_b} in #{parent}"
|
|
116 |
order = @get_order parent
|
|
117 |
local a, b
|
|
118 |
for i, entry in ipairs order
|
|
119 |
a = i if entry.name == name_a
|
|
120 |
b = i if entry.name == name_b
|
|
121 |
break if a and b
|
|
122 |
|
|
123 |
assert a, "couldn't find #{parent}/#{name_a} in $order"
|
|
124 |
assert b, "couldn't find #{parent}/#{name_b} in $order"
|
|
125 |
|
|
126 |
order[a], order[b] = order[b], order[a]
|
|
127 |
@write_order parent, order
|
84 | 128 |
|
85 | 129 |
-- facets
|
86 | 130 |
list_facets: (path) =>
|
|
160 | 204 |
file\write blob
|
161 | 205 |
file\close!
|
162 | 206 |
|
|
207 |
-- fsck
|
|
208 |
fsck: (path='') =>
|
|
209 |
order = @get_order path, true
|
|
210 |
@write_order path, order
|
|
211 |
|
|
212 |
for { :path } in *order
|
|
213 |
@fsck path
|
|
214 |
|
163 | 215 |
{
|
164 | 216 |
:FSStore
|
165 | 217 |
}
|