Can mess with dirs just fine. Files need more work.
[teddybear.git] / fs.rb
blob1afae3e580ea04c31e14bf3f9e03c138301c6e29
1 #! /usr/bin/ruby
2 require 'fusefs'
3 require 'couch'
5 $server = Couch::Server.new 'localhost', 8888
6 $db = Couch::Db.new $server, 'teddybear'
8 class String
9   def lchomp(separator = $/)
10     reverse.chomp(separator).reverse
11   end
12 end
15 def peel_path(path)
16   return nil if path.nil?
17   path.lchomp('/').split('/', 2)
18 end
21 class CouchDir < Couch::Doc
22   field :subdirs
24   def subdirs
25     @subdirs = [] if @subdirs.nil?
26     @subdirs
27   end
28   def files
29     _attachments.map { |a| a.name }
30   end
32   def contents(path)
33     print "CONTENTS #{path}\n"
34     first, rest = peel_path path
35     if first.nil?
36       subdirs + files
37     else
38       find_subdir(first).contents rest
39     end
40   end
41   
42   def file?(path)
43     first, rest = peel_path path
44     if rest.nil?
45       files.include? first
46     else
47       find_subdir(first).file? rest
48     end
49   end
51   def directory?(path)
52     first, rest = peel_path path
53     return true if first.nil?
55     if rest.nil?
56       subdirs.include? first
57     else
58       find_subdir(first).directory? rest
59     end
60   end
62   def executable?(path)
63     print "executable? #{path}"
64     false
65   end
67   def read_file(path)
68     first, rest = peel_path path
69     if rest.nil?
70       f = _attachments.find { |a| a.name == first}
71       f.data
72     else
73       find_subdir(first).read_file rest
74     end
75   end
77   def write_to(path, data)
78     first, rest = peel_path path
79     if rest.nil?
80       # Stores the file as an attachment
81       f = new_attachment
82       f.name = first
83       f.type = 'binary'
84       f.data = data
85       save
86     else
87       find_subdir(first).write_to rest, data
88     end
89   end
91   def mkdir(path)
92     first, rest = peel_path path
93     if rest.nil?
94       subdirs << first
95       save
96     else
97       find_subdir(first).mkdir rest
98     end
99   end
101   def rmdir(path)
102     print "RMDIR #{id}: #{path}\n"
103     first, rest = peel_path path
104     d = find_subdir(first)
105     if rest.nil?
106       d.delete!
107       subdirs.delete first
108       save
109     else
110       d.rmdir rest
111     end
112   end
114   def find_subdir(dir)
115     subdir_id = id + '/' + dir
116     d = CouchDir.find_or_create @db, subdir_id
117     d.save
118     d
119   end
124 class Root
125   attr_accessor :name
127   def root
128     CouchDir.find_or_create @db, @name
129   end
131   def initialize(db, name)
132     @db = db
133     @name = name
134   end
136   def contents(path)
137     begin
138       print "contents #{path}\n"
139       root.contents path.lchomp('/')  # num num num
140     rescue =>err
141       print e.message + "\n"
142       print e.backtrace.join("\n") + "\n"
143     end
144   end
146   def directory?(path)
147     print "directory? #{path}\n"
148     root.directory? path.lchomp('/')
149   end
151   def file?(path)
152     print "file? #{path}\n"
153     root.file? path.lchomp('/')
154   end
156   def read_file(path)
157     begin
158       print "read_file #{path}\n"
159       root.read_file path.lchomp('/')
160     rescue => err
161       print err + "\n"
162       print err.backtrace.join("\n")
163     end
164   end
166   def mkdir(path)
167     print "mkdir #{path}\n"
168     root.mkdir path.lchomp('/')
169   end
171   def rmdir(path)
172     begin
173       print "rmdir #{path}\n"
174       root.rmdir path.lchomp('/')
175     rescue =>err
176       print err
177     end
178   end
180   def write_to(path, data)
181     print "write_to #{path}, #{data.size} bytes\n"
182     root.write_to path.lchomp('/'), data
183   end
185   def can_mkdir?(path)
186     true
187   end
189   def can_rmdir?(path)
190     true
191   end
193   def can_write?(path)
194     print "can_write? #{path}\n"
195     true
196   end
198   def can_delete?(path)
199     true
200   end
204 mount_point = ARGV.shift
206 root = Root.new $db, mount_point
207 FuseFS.set_root root
209 FuseFS.mount_under mount_point
210 begin
211   FuseFS.run
212 ensure
213   FuseFS.unmount
218 Delete files
219 Read from files