aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/commands_portsdiff.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src/commands_portsdiff.cpp')
-rw-r--r--toolsrc/src/commands_portsdiff.cpp82
1 files changed, 47 insertions, 35 deletions
diff --git a/toolsrc/src/commands_portsdiff.cpp b/toolsrc/src/commands_portsdiff.cpp
index 0cf47bb2e..557f17bc2 100644
--- a/toolsrc/src/commands_portsdiff.cpp
+++ b/toolsrc/src/commands_portsdiff.cpp
@@ -4,27 +4,55 @@
#include "vcpkg_Maps.h"
#include "SourceParagraph.h"
#include "Paragraphs.h"
+#include "ImmutableSortedVector.h"
namespace vcpkg::Commands::PortsDiff
{
- static void do_print_name_and_version(const std::vector<std::string>& ports_to_print, const std::map<std::string, version_t>& names_and_versions)
+ template <class T>
+ struct set_element_presence
{
- for (const std::string& name : ports_to_print)
+ static set_element_presence create(std::vector<T> left, std::vector<T> right)
{
- const version_t& version = names_and_versions.at(name);
- System::println("%-20s %-16s", name, version);
+ // TODO: This can be done with one pass instead of three passes
+ set_element_presence output;
+ std::set_difference(left.cbegin(), left.cend(), right.cbegin(), right.cend(), std::back_inserter(output.only_left));
+ std::set_intersection(left.cbegin(), left.cend(), right.cbegin(), right.cend(), std::back_inserter(output.both));
+ std::set_difference(right.cbegin(), right.cend(), left.cbegin(), left.cend(), std::back_inserter(output.only_right));
+
+ return output;
}
- }
- static void do_print_name_and_previous_version_and_current_version(const std::vector<std::string>& ports_to_print,
- const std::map<std::string, version_t>& previous_names_and_versions,
- const std::map<std::string, version_t>& current_names_and_versions)
+ std::vector<T> only_left;
+ std::vector<T> both;
+ std::vector<T> only_right;
+ };
+
+ static std::vector<name_and_version_diff_t> find_updated_ports(const std::vector<std::string>& ports,
+ const std::map<std::string, version_t>& previous_names_and_versions,
+ const std::map<std::string, version_t>& current_names_and_versions)
{
- for (const std::string& name : ports_to_print)
+ std::vector<name_and_version_diff_t> output;
+ for (const std::string& name : ports)
{
const version_t& previous_version = previous_names_and_versions.at(name);
const version_t& current_version = current_names_and_versions.at(name);
- System::println("%-20s %-16s -> %s", name, previous_version, current_version);
+ if (previous_version == current_version)
+ {
+ continue;
+ }
+
+ output.push_back({ name, version_diff_t(previous_version, current_version) });
+ }
+
+ return output;
+ }
+
+ static void do_print_name_and_version(const std::vector<std::string>& ports_to_print, const std::map<std::string, version_t>& names_and_versions)
+ {
+ for (const std::string& name : ports_to_print)
+ {
+ const version_t& version = names_and_versions.at(name);
+ System::println("%-20s %-16s", name, version);
}
}
@@ -83,48 +111,32 @@ namespace vcpkg::Commands::PortsDiff
std::vector<std::string> current_ports = Maps::extract_keys(current_names_and_versions);
std::vector<std::string> previous_ports = Maps::extract_keys(previous_names_and_versions);
- std::vector<std::string> added_ports;
- std::set_difference(
- current_ports.cbegin(), current_ports.cend(),
- previous_ports.cbegin(), previous_ports.cend(),
- std::back_inserter(added_ports));
+ const set_element_presence<std::string> setp = set_element_presence<std::string>::create(current_ports, previous_ports);
+ const std::vector<std::string>& added_ports = setp.only_left;
if (!added_ports.empty())
{
System::println("\nThe following %d ports were added:\n", added_ports.size());
do_print_name_and_version(added_ports, current_names_and_versions);
}
- std::vector<std::string> removed_ports;
- std::set_difference(
- previous_ports.cbegin(), previous_ports.cend(),
- current_ports.cbegin(), current_ports.cend(),
- std::back_inserter(removed_ports));
-
+ const std::vector<std::string>& removed_ports = setp.only_right;
if (!removed_ports.empty())
{
System::println("\nThe following %d ports were removed:\n", removed_ports.size());
do_print_name_and_version(removed_ports, previous_names_and_versions);
}
- std::vector<std::string> potentially_updated_ports;
- std::set_intersection(
- current_ports.cbegin(), current_ports.cend(),
- previous_ports.cbegin(), previous_ports.cend(),
- std::back_inserter(potentially_updated_ports));
-
- std::vector<std::string> updated_ports;
- std::copy_if(potentially_updated_ports.cbegin(), potentially_updated_ports.cend(), std::back_inserter(updated_ports),
- [&](const std::string& port) -> bool
- {
- return current_names_and_versions.at(port) != previous_names_and_versions.at(port);
- }
- );
+ const std::vector<std::string>& common_ports = setp.both;
+ const std::vector<name_and_version_diff_t> updated_ports = find_updated_ports(common_ports, previous_names_and_versions, current_names_and_versions);
if (!updated_ports.empty())
{
System::println("\nThe following %d ports were updated:\n", updated_ports.size());
- do_print_name_and_previous_version_and_current_version(updated_ports, previous_names_and_versions, current_names_and_versions);
+ for (const name_and_version_diff_t& p : updated_ports)
+ {
+ System::println("%-20s %-16s", p.name, p.version_diff.toString());
+ }
}
if (added_ports.empty() && removed_ports.empty() && updated_ports.empty())