aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorCurtis J Bezault <curtbezault@gmail.com>2019-04-11 08:27:44 -0700
committerPhil Christensen <philc@microsoft.com>2019-04-11 08:27:44 -0700
commit8fe6f4bdd83f0b912327693c22e132c0c8f82744 (patch)
treedbd3ad2f1d55b870f479ded3ff8505da266ae9c5 /toolsrc/src
parentf58e82f45ce0b0c933bf2814e2114997e00af8af (diff)
downloadvcpkg-8fe6f4bdd83f0b912327693c22e132c0c8f82744.tar.gz
vcpkg-8fe6f4bdd83f0b912327693c22e132c0c8f82744.zip
Print what port installed confliciting files (#6037)
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg/install.cpp93
1 files changed, 64 insertions, 29 deletions
diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp
index 6d4eabc89..14dfb6fa3 100644
--- a/toolsrc/src/vcpkg/install.cpp
+++ b/toolsrc/src/vcpkg/install.cpp
@@ -19,6 +19,8 @@ namespace vcpkg::Install
{
using namespace Dependencies;
+ using file_pack = std::pair<std::string, std::string>;
+
InstallDir InstallDir::from_destination_root(const fs::path& destination_root,
const std::string& destination_subdirectory,
const fs::path& listfile)
@@ -139,18 +141,12 @@ namespace vcpkg::Install
fs.write_lines(listfile, output);
}
- static void remove_first_n_chars(std::vector<std::string>* strings, const size_t n)
- {
- for (std::string& s : *strings)
- {
- s.erase(0, n);
- }
- };
-
- static std::vector<std::string> extract_files_in_triplet(
- const std::vector<StatusParagraphAndAssociatedFiles>& pgh_and_files, const Triplet& triplet)
+ static std::vector<file_pack> extract_files_in_triplet(
+ const std::vector<StatusParagraphAndAssociatedFiles>& pgh_and_files,
+ const Triplet& triplet,
+ const size_t remove_chars = 0)
{
- std::vector<std::string> output;
+ std::vector<file_pack> output;
for (const StatusParagraphAndAssociatedFiles& t : pgh_and_files)
{
if (t.pgh.package.spec.triplet() != triplet)
@@ -158,10 +154,16 @@ namespace vcpkg::Install
continue;
}
- Util::Vectors::concatenate(&output, t.files);
+ const std::string name = t.pgh.package.displayname();
+
+ for (const std::string &file : t.files)
+ {
+ output.emplace_back(file_pack{std::string(file, remove_chars), name});
+ }
}
- std::sort(output.begin(), output.end());
+ std::sort(output.begin(), output.end(),
+ [](const file_pack &lhs, const file_pack &rhs) { return lhs.first < rhs.first; });
return output;
}
@@ -171,22 +173,21 @@ namespace vcpkg::Install
const std::vector<fs::path> package_file_paths = fs.get_files_recursive(package_dir);
const size_t package_remove_char_count = package_dir.generic_string().size() + 1; // +1 for the slash
auto package_files = Util::fmap(package_file_paths, [package_remove_char_count](const fs::path& path) {
- std::string as_string = path.generic_string();
- as_string.erase(0, package_remove_char_count);
- return std::move(as_string);
+ return std::move(std::string(path.generic_string(), package_remove_char_count));
});
return SortedVector<std::string>(std::move(package_files));
}
- static SortedVector<std::string> build_list_of_installed_files(
- const std::vector<StatusParagraphAndAssociatedFiles>& pgh_and_files, const Triplet& triplet)
+ static SortedVector<file_pack> build_list_of_installed_files(
+ const std::vector<StatusParagraphAndAssociatedFiles>& pgh_and_files,
+ const Triplet& triplet)
{
- std::vector<std::string> installed_files = extract_files_in_triplet(pgh_and_files, triplet);
const size_t installed_remove_char_count = triplet.canonical_name().size() + 1; // +1 for the slash
- remove_first_n_chars(&installed_files, installed_remove_char_count);
+ std::vector<file_pack> installed_files =
+ extract_files_in_triplet(pgh_and_files, triplet, installed_remove_char_count);
- return SortedVector<std::string>(std::move(installed_files));
+ return SortedVector<file_pack>(std::move(installed_files));
}
InstallResult install_package(const VcpkgPaths& paths, const BinaryControlFile& bcf, StatusParagraphs* status_db)
@@ -197,23 +198,57 @@ namespace vcpkg::Install
const SortedVector<std::string> package_files =
build_list_of_package_files(paths.get_filesystem(), package_dir);
- const SortedVector<std::string> installed_files = build_list_of_installed_files(pgh_and_files, triplet);
+ const SortedVector<file_pack> installed_files =
+ build_list_of_installed_files(pgh_and_files, triplet);
- std::vector<std::string> intersection;
- std::set_intersection(package_files.begin(),
- package_files.end(),
- installed_files.begin(),
+ struct intersection_compare
+ {
+ bool operator()(const std::string &lhs, const file_pack &rhs) { return lhs < rhs.first; }
+ bool operator()(const file_pack &lhs, const std::string &rhs) { return lhs.first < rhs; }
+ };
+
+ std::vector<file_pack> intersection;
+
+ std::set_intersection(installed_files.begin(),
installed_files.end(),
- std::back_inserter(intersection));
+ package_files.begin(),
+ package_files.end(),
+ std::back_inserter(intersection),
+ intersection_compare());
+
+ std::sort(intersection.begin(), intersection.end(),
+ [](const file_pack &lhs, const file_pack &rhs)
+ {
+ return lhs.second < rhs.second;
+ });
if (!intersection.empty())
{
const fs::path triplet_install_path = paths.installed / triplet.canonical_name();
System::printf(System::Color::error,
- "The following files are already installed in %s and are in conflict with %s\n",
+ "The following files are already installed in %s and are in conflict with %s\n\n",
triplet_install_path.generic_string(),
bcf.core_paragraph.spec);
- System::print2("\n ", Strings::join("\n ", intersection), "\n\n");
+
+ auto i = intersection.begin();
+ while (i != intersection.end()) {
+ System::print2("Installed by ", i->second, "\n ");
+ auto next = std::find_if(i, intersection.end(),
+ [i](const auto &val)
+ {
+ return i->second != val.second;
+ });
+
+ System::print2(Strings::join("\n ", i, next,
+ [](const file_pack &file)
+ {
+ return file.first;
+ }));
+ System::print2("\n\n");
+
+ i = next;
+ }
+
return InstallResult::FILE_CONFLICTS;
}