From 834e38c29d377dcdb4e080b8ef78e17c1e5241f1 Mon Sep 17 00:00:00 2001 From: Alex Ghiculescu Date: Fri, 11 Dec 2020 16:27:05 -0600 Subject: [PATCH] Don't return incorrect files when there's a file whose name matches a dir --- lib/listen/record.rb | 14 +++++++------- spec/lib/listen/record_spec.rb | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/listen/record.rb b/lib/listen/record.rb index 144bc058..ab1a443a 100644 --- a/lib/listen/record.rb +++ b/lib/listen/record.rb @@ -59,13 +59,13 @@ def dir_entries(rel_path) def _sub_tree(rel_path) @tree.each_with_object({}) do |(path, meta), result| - next unless path.start_with?(rel_path) - - if path == rel_path - result.merge!(meta) - else - sub_path = path.sub(%r{\A#{rel_path}/?}, '') - result[sub_path] = meta + parts = path.split(::File::SEPARATOR) + if parts.shift == rel_path + if parts.empty? + result.merge!(meta) + else + result[parts.join(::File::SEPARATOR)] = meta + end end end end diff --git a/spec/lib/listen/record_spec.rb b/spec/lib/listen/record_spec.rb index 7d3b2c15..5c4c7e78 100644 --- a/spec/lib/listen/record_spec.rb +++ b/spec/lib/listen/record_spec.rb @@ -208,6 +208,29 @@ def record_tree(record) end end + context 'when there is a file with the same name as a dir' do + subject { record.dir_entries('cypress') } + + before do + record.update_file('cypress.json', mtime: 1.1) + record.update_file('cypress/README.md', mtime: 1.2) + record.update_file('a/b/cypress/d', mtime: 1.3) + record.update_file('a/b/c/cypress', mtime: 1.3) + end + it { should eq('README.md' => { mtime: 1.2 }) } + end + + context 'when there is a file with a similar name to a dir' do + subject { record.dir_entries('app') } + + before do + record.update_file('appspec.yml', mtime: 1.1) + record.update_file('app/README.md', mtime: 1.2) + record.update_file('spec/app/foo', mtime: 1.3) + end + it { should eq('README.md' => { mtime: 1.2 }) } + end + context 'in subdir /path' do subject { record.dir_entries('path') }