diff --git a/Frameworks/io/src/path.cc b/Frameworks/io/src/path.cc index 7fb9aeb3..02225dcd 100644 --- a/Frameworks/io/src/path.cc +++ b/Frameworks/io/src/path.cc @@ -653,14 +653,22 @@ namespace path }); std::vector levels(paths.size()); - for(size_t i = 0; i < v.size(); ++i) + for(size_t i = 0; i < v.size(); ) { + std::string const& current = paths[v[i]]; size_t above = 0, below = 0; + if(i != 0) - above = count_slashes(paths[v[i]], paths[v[i-1]]); - if(i != v.size()-1) - below = count_slashes(paths[v[i]], paths[v[i+1]]); - levels[v[i]] = std::max(above, below); + above = count_slashes(current, paths[v[i-1]]); + + size_t j = i; + while(j < v.size() && current == paths[v[j]]) + ++j; + if(j < v.size()) + below = count_slashes(current, paths[v[j]]); + + for(; i < j; ++i) + levels[v[i]] = std::max(above, below); } return levels; diff --git a/Frameworks/io/tests/t_disambiguate_paths.cc b/Frameworks/io/tests/t_disambiguate_paths.cc index 55939701..9901c768 100644 --- a/Frameworks/io/tests/t_disambiguate_paths.cc +++ b/Frameworks/io/tests/t_disambiguate_paths.cc @@ -40,6 +40,34 @@ public: run_test(paths3, "qux — a/baz"); } + void test_disambiguate_paths_duplicates () + { + std::vector paths{ + "/Users/duff/Projects/Avian", + "/Users/duff/Projects/TextMate", + "/Users/duff/public/macromates_com", + "/Users/duff/Projects/macromates_com", + "/Users/duff/public/macromates_com", + "/Users/duff/Projects/api_textmate_org", + "/Users/duff/Library/Application Support/TextMate", + "/Users/duff/Projects/Avian", + "/Users/duff/build/public/macromates_com", + }; + + std::vector parents = path::disambiguate(paths); + TS_ASSERT_EQUALS(parents.size(), paths.size()); + + TS_ASSERT_EQUALS(parents[0], 0); + TS_ASSERT_EQUALS(parents[1], 1); + TS_ASSERT_EQUALS(parents[2], 2); + TS_ASSERT_EQUALS(parents[3], 1); + TS_ASSERT_EQUALS(parents[4], 2); + TS_ASSERT_EQUALS(parents[5], 0); + TS_ASSERT_EQUALS(parents[6], 1); + TS_ASSERT_EQUALS(parents[7], 0); + TS_ASSERT_EQUALS(parents[8], 2); + } + void test_localisation () { test::jail_t jail;