Delete all directory objects for empty directories

This commit is contained in:
galfert 2012-10-07 18:39:41 +02:00
parent 6f975c6c45
commit 8b2bd53d49
3 changed files with 50 additions and 10 deletions

View File

@ -82,9 +82,9 @@ module RemoteStorage
def delete_data(user, directory, key) def delete_data(user, directory, key)
riak_response = data_bucket.delete("#{user}:#{directory}:#{key}") riak_response = data_bucket.delete("#{user}:#{directory}:#{key}")
if directory_entries(user, directory).empty?
directory_bucket.delete "#{user}:#{directory}" delete_empty_directory_objects(user, directory)
end
halt riak_response[:code] halt riak_response[:code]
rescue ::Riak::HTTPFailedRequest rescue ::Riak::HTTPFailedRequest
halt 404 halt 404
@ -200,6 +200,27 @@ module RemoteStorage
directory_object.store directory_object.store
end end
def delete_empty_directory_objects(user, directory)
parent_directories = directory.split("/")
while parent_directories.any?
parent_directory = parent_directories.join("/")
existing_files = directory_entries(user, parent_directory)
existing_subdirectories = sub_directories(user, parent_directory)
if existing_files.empty? && existing_subdirectories.empty?
directory_bucket.delete "#{user}:#{parent_directory}"
end
parent_directories.pop
end
if directory_entries(user, "").empty? && sub_directories(user, "").empty?
directory_bucket.delete "#{user}:"
end
end
def set_object_data(object, data) def set_object_data(object, data)
if object.content_type[/^[^;\s]+/] == "application/json" if object.content_type[/^[^;\s]+/] == "application/json"
data = "{}" if data.blank? data = "{}" if data.blank?

View File

@ -241,17 +241,40 @@ describe "Directories" do
context "last file in directory" do context "last file in directory" do
before do before do
directory_bucket.delete("jimmy:tasks") directory_bucket.delete("jimmy:tasks")
put "/jimmy/tasks/trash", "take out the trash" put "/jimmy/tasks/home/trash", "take out the trash"
end end
it "deletes the directory object" do it "deletes the directory objects for all empty parent directories" do
delete "/jimmy/tasks/trash" delete "/jimmy/tasks/home/trash"
last_response.status.must_equal 204 last_response.status.must_equal 204
lambda {
directory_bucket.get("jimmy:tasks/home")
}.must_raise Riak::HTTPFailedRequest
lambda { lambda {
directory_bucket.get("jimmy:tasks") directory_bucket.get("jimmy:tasks")
}.must_raise Riak::HTTPFailedRequest }.must_raise Riak::HTTPFailedRequest
lambda {
directory_bucket.get("jimmy:")
}.must_raise Riak::HTTPFailedRequest
end
end
context "with additional files in directory" do
before do
put "/jimmy/tasks/home/trash", "take out the trash"
put "/jimmy/tasks/home/laundry/washing", "wash the clothes"
end
it "does not delete the directory objects for the parent directories" do
delete "/jimmy/tasks/home/trash"
directory_bucket.get("jimmy:tasks/home").wont_be_nil
directory_bucket.get("jimmy:tasks").wont_be_nil
directory_bucket.get("jimmy:").wont_be_nil
end end
end end
end end

View File

@ -264,10 +264,6 @@ describe "Permissions" do
it "allows PUT requests" do it "allows PUT requests" do
put "/jimmy/1", "Gonna kick it root down" put "/jimmy/1", "Gonna kick it root down"
# File.open('response.html', 'w') do |f|
# f.write last_response.body
# end
last_response.status.must_equal 200 last_response.status.must_equal 200
data_bucket.get("jimmy::1").data.must_equal "Gonna kick it root down" data_bucket.get("jimmy::1").data.must_equal "Gonna kick it root down"
end end