Use ETags as version in directory listings

This commit is contained in:
Garret Alfert 2013-10-27 22:09:47 +01:00
parent 39dac0a5ed
commit 256b3c426e
2 changed files with 31 additions and 18 deletions

View File

@ -241,8 +241,9 @@ module RemoteStorage
sub_directories(user, directory).each do |entry| sub_directories(user, directory).each do |entry|
directory_name = entry["name"].split("/").last directory_name = entry["name"].split("/").last
timestamp = entry["timestamp"].to_i timestamp = entry["timestamp"].to_i
etag = entry["etag"]
listing.merge!({ "#{directory_name}/" => timestamp }) listing.merge!({ "#{directory_name}/" => etag })
end end
directory_entries(user, directory).each do |entry| directory_entries(user, directory).each do |entry|
@ -252,8 +253,9 @@ module RemoteStorage
else else
DateTime.rfc2822(entry["last_modified"]).to_time.to_i DateTime.rfc2822(entry["last_modified"]).to_time.to_i
end end
etag = entry["etag"]
listing.merge!({ entry_name => timestamp }) listing.merge!({ entry_name => etag })
end end
listing listing
@ -270,10 +272,12 @@ module RemoteStorage
key_name = keys.join(':'); key_name = keys.join(':');
last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified']; last_modified_date = v.values[0]['metadata']['X-Riak-Last-Modified'];
timestamp = v.values[0]['metadata']['X-Riak-Meta']['X-Riak-Meta-Timestamp']; timestamp = v.values[0]['metadata']['X-Riak-Meta']['X-Riak-Meta-Timestamp'];
etag = v.values[0]['metadata']['X-Riak-VTag'];
return [{ return [{
name: key_name, name: key_name,
last_modified: last_modified_date, last_modified: last_modified_date,
timestamp: timestamp, timestamp: timestamp,
etag: etag
}]; }];
} }
EOH EOH
@ -289,10 +293,12 @@ module RemoteStorage
function(v){ function(v){
keys = v.key.split(':'); keys = v.key.split(':');
key_name = keys[keys.length-1]; key_name = keys[keys.length-1];
timestamp = v.values[0]['data'] timestamp = v.values[0]['data'];
etag = v.values[0]['metadata']['X-Riak-VTag'];
return [{ return [{
name: key_name, name: key_name,
timestamp: timestamp, timestamp: timestamp,
etag: etag
}]; }];
} }
EOH EOH

View File

@ -19,17 +19,18 @@ describe "Directories" do
put "/jimmy/tasks/http%3A%2F%2F5apps.com", "prettify design" put "/jimmy/tasks/http%3A%2F%2F5apps.com", "prettify design"
end end
it "lists the objects with a timestamp of the last modification" do it "lists the objects with their version" do
get "/jimmy/tasks/" get "/jimmy/tasks/"
last_response.status.must_equal 200 last_response.status.must_equal 200
last_response.content_type.must_equal "application/json" last_response.content_type.must_equal "application/json"
foo = data_bucket.get("jimmy:tasks:foo")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "http://5apps.com" content.must_include "http://5apps.com"
content.must_include "foo" content.must_include "foo"
content["foo"].must_be_kind_of Integer content["foo"].must_equal foo.etag.gsub(/"/, "")
content["foo"].to_s.length.must_equal 13
end end
it "has a Last-Modifier header set" do it "has a Last-Modifier header set" do
@ -103,12 +104,13 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
home = directory_bucket.get("jimmy:tasks/home")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "foo" content.must_include "foo"
content.must_include "http://5apps.com" content.must_include "http://5apps.com"
content.must_include "home/" content.must_include "home/"
content["home/"].must_be_kind_of Integer content["home/"].must_equal home.etag.gsub(/"/, "")
content["home/"].to_s.length.must_equal 13
end end
it "updates the ETag of the parent directory" do it "updates the ETag of the parent directory" do
@ -149,10 +151,11 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
projects = directory_bucket.get("jimmy:tasks/private/projects")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "projects/" content.must_include "projects/"
content["projects/"].must_be_kind_of Integer content["projects/"].must_equal projects.etag.gsub(/"/, "")
content["projects/"].to_s.length.must_equal 13
end end
it "updates the timestamps of the existing directory objects" do it "updates the timestamps of the existing directory objects" do
@ -184,10 +187,11 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
jaypeg = data_bucket.get("jimmy:tasks:jaypeg.jpg")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "jaypeg.jpg" content.must_include "jaypeg.jpg"
content["jaypeg.jpg"].must_be_kind_of Integer content["jaypeg.jpg"].must_equal jaypeg.etag.gsub(/"/, "")
content["jaypeg.jpg"].to_s.length.must_equal 13
end end
end end
@ -204,10 +208,11 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
jaypeg = data_bucket.get("jimmy:tasks:jaypeg.jpg")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "jaypeg.jpg" content.must_include "jaypeg.jpg"
content["jaypeg.jpg"].must_be_kind_of Integer content["jaypeg.jpg"].must_equal jaypeg.etag.gsub(/"/, "")
content["jaypeg.jpg"].to_s.length.must_equal 13
end end
end end
end end
@ -223,10 +228,11 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
laundry = data_bucket.get("jimmy:tasks/home:laundry")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "laundry" content.must_include "laundry"
content["laundry"].must_be_kind_of Integer content["laundry"].must_equal laundry.etag.gsub(/"/, "")
content["laundry"].to_s.length.must_equal 13
end end
end end
@ -300,12 +306,13 @@ describe "Directories" do
last_response.status.must_equal 200 last_response.status.must_equal 200
tasks = directory_bucket.get("jimmy:tasks")
content = JSON.parse(last_response.body) content = JSON.parse(last_response.body)
content.must_include "root-1" content.must_include "root-1"
content.must_include "root-2" content.must_include "root-2"
content.must_include "tasks/" content.must_include "tasks/"
content["tasks/"].must_be_kind_of Integer content["tasks/"].must_equal tasks.etag.gsub(/"/, "")
content["tasks/"].to_s.length.must_equal 13
end end
it "has an ETag header set" do it "has an ETag header set" do