From 8b2bd53d4961ac5c7bb7501647f479d7a6a464d1 Mon Sep 17 00:00:00 2001 From: Garret Alfert Date: Sun, 7 Oct 2012 18:39:41 +0200 Subject: [PATCH] Delete all directory objects for empty directories --- lib/remote_storage/riak.rb | 27 ++++++++++++++++++++++++--- spec/directories_spec.rb | 29 ++++++++++++++++++++++++++--- spec/permissions_spec.rb | 4 ---- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/remote_storage/riak.rb b/lib/remote_storage/riak.rb index 9b2cd4d..5b1e450 100644 --- a/lib/remote_storage/riak.rb +++ b/lib/remote_storage/riak.rb @@ -82,9 +82,9 @@ module RemoteStorage def delete_data(user, directory, key) riak_response = data_bucket.delete("#{user}:#{directory}:#{key}") - if directory_entries(user, directory).empty? - directory_bucket.delete "#{user}:#{directory}" - end + + delete_empty_directory_objects(user, directory) + halt riak_response[:code] rescue ::Riak::HTTPFailedRequest halt 404 @@ -200,6 +200,27 @@ module RemoteStorage directory_object.store 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) if object.content_type[/^[^;\s]+/] == "application/json" data = "{}" if data.blank? diff --git a/spec/directories_spec.rb b/spec/directories_spec.rb index 0e93cfd..4254604 100644 --- a/spec/directories_spec.rb +++ b/spec/directories_spec.rb @@ -241,17 +241,40 @@ describe "Directories" do context "last file in directory" do before do directory_bucket.delete("jimmy:tasks") - put "/jimmy/tasks/trash", "take out the trash" + put "/jimmy/tasks/home/trash", "take out the trash" end - it "deletes the directory object" do - delete "/jimmy/tasks/trash" + it "deletes the directory objects for all empty parent directories" do + delete "/jimmy/tasks/home/trash" last_response.status.must_equal 204 + lambda { + directory_bucket.get("jimmy:tasks/home") + }.must_raise Riak::HTTPFailedRequest + lambda { directory_bucket.get("jimmy:tasks") }.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 diff --git a/spec/permissions_spec.rb b/spec/permissions_spec.rb index 219028c..7a44a14 100644 --- a/spec/permissions_spec.rb +++ b/spec/permissions_spec.rb @@ -264,10 +264,6 @@ describe "Permissions" do it "allows PUT requests" do 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 data_bucket.get("jimmy::1").data.must_equal "Gonna kick it root down" end