fix wrong removal of files which expired after the gone period
authorLunar <lunar@anargeek.net>
Fri, 31 Aug 2012 11:03:22 +0000 (13:03 +0200)
committerLunar <lunar@anargeek.net>
Thu, 14 Mar 2013 09:12:10 +0000 (10:12 +0100)
When expiration period is longer than the gone period, the files are kept
unmodified longer than the actual gone period. Previously, this would
get them erased, a serious bug.

Now we properly skip files that have not yet been erased (and truncated to zero
size) when looking for files that have been kept longer than the gone period.

lib/coquelicot/depot.rb
spec/coquelicot/depot_spec.rb

index e8c2713..f472010 100644 (file)
@@ -83,8 +83,7 @@ module Coquelicot
             next
           end
           file.empty! if file.expired?
-        end
-        if Time.now - File.lstat(path).mtime > (Coquelicot.settings.gone_period * 60)
+        elsif Time.now - File.lstat(path).mtime > (Coquelicot.settings.gone_period * 60)
           remove_from_links { |l| l.strip.end_with? " #{name}" }
           FileUtils.rm "#{path}.content", :force => true
           FileUtils.rm path
index e3336b2..3d7fbdd 100644 (file)
@@ -226,9 +226,9 @@ module Coquelicot
                 to change { File.stat(File.expand_path('file', @tmpdir)).size }.to(0)
           end
         end
-        context 'after the gone period' do
+        context 'after the gone period and two collections' do
           let(:now) { Time.now + Coquelicot.settings.gone_period * 61 }
-          subject { Timecop.travel(now) { depot.gc! } }
+          subject { Timecop.travel(now) { depot.gc!; depot.gc! } }
           it 'should remove links' do
             expect { subject }.to change { depot.size }.from(1).to(0)
           end
@@ -238,6 +238,25 @@ module Coquelicot
           end
         end
       end
+      context 'when there is a file that expires after the gone period' do
+        let(:expire) { Coquelicot.settings.gone_period + 42 }
+        before(:each) do
+          depot.should_receive(:gen_random_file_name).
+            and_return('file', 'link')
+          add_file
+        end
+        context 'after the gone period' do
+          let(:now) { Time.now + Coquelicot.settings.gone_period * 61 }
+          subject { Timecop.travel(now) { depot.gc! } }
+          it 'should not remove links' do
+            expect { subject }.to_not change { depot.size }
+          end
+          it 'should not remove files' do
+            expect { subject }.
+                to_not change { Dir.entries(@tmpdir) }
+          end
+        end
+      end
       context 'when there is a link but no associated file' do
         before(:each) do
           depot.should_receive(:gen_random_file_name).