Add command x-vsinstances
MODIFY
include/vcpkg/commands.h
include/vcpkg/commands.h
@@ -119,6 +119,12 @@ namespace vcpkg::Commands
void perform_and_exit(const VcpkgCmdArguments& args);
}
+ namespace X_VSInstances
+ {
+ extern const CommandStructure COMMAND_STRUCTURE;
+ void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths);
+ }
+
namespace Hash
{
void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths);

MODIFY
include/vcpkg/visualstudio.h
include/vcpkg/visualstudio.h
namespace vcpkg::VisualStudio
{
+ std::vector<std::string> get_visual_studio_instances(const VcpkgPaths& paths);
+
std::vector<Toolset> find_toolset_instances_preferred_first(const VcpkgPaths& paths);
}

MODIFY
src/vcpkg/commands.cpp
src/vcpkg/commands.cpp
@@ -46,6 +46,7 @@ namespace vcpkg::Commands
{"autocomplete", &Autocomplete::perform_and_exit},
{"hash", &Hash::perform_and_exit},
{"fetch", &Fetch::perform_and_exit},
+ {"x-vsinstances", &X_VSInstances::perform_and_exit},
};
return t;
}

ADD
src/vcpkg/commands.xvsinstances.cpp
+#include "pch.h"
+
+#include <vcpkg/commands.h>
+#include <vcpkg/help.h>
+#include <vcpkg/visualstudio.h>
+
+namespace vcpkg::Commands::X_VSInstances
+{
+ const CommandStructure COMMAND_STRUCTURE = {
+ Help::create_example_string("x-vsinstances"),
+ 0,
+ 0,
+ {{}, {}},
+ nullptr,
+ };
+
+ void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths)
+ {
+ const ParsedArguments parsed_args = args.parse_arguments(COMMAND_STRUCTURE);
+
+ const auto instances = vcpkg::VisualStudio::get_visual_studio_instances(paths);
+ for (const std::string& instance : instances)
+ {
+ System::println(instance);
+ }
+
+ Checks::exit_success(VCPKG_LINE_INFO);
+ }
+}

MODIFY
src/vcpkg/visualstudio.cpp
src/vcpkg/visualstudio.cpp
@@ -22,6 +22,17 @@ namespace vcpkg::VisualStudio
LEGACY
};
+ static std::string release_type_to_string(const ReleaseType& release_type)
+ {
+ switch (release_type)
+ {
+ case ReleaseType::STABLE: return "STABLE";
+ case ReleaseType::PRERELEASE: return "PRERELEASE";
+ case ReleaseType::LEGACY: return "LEGACY";
+ default: Checks::unreachable(VCPKG_LINE_INFO);
+ }
+ }
+
static bool preferred_first_comparator(const VisualStudioInstance& left, const VisualStudioInstance& right)
{
const auto get_preference_weight = [](const ReleaseType& type) -> int {
@@ -51,10 +62,15 @@ namespace vcpkg::VisualStudio
std::string version;
ReleaseType release_type;
+ std::string to_string() const
+ {
+ return Strings::format("%s, %s, %s", root_path.u8string(), version, release_type_to_string(release_type));
+ }
+
std::string major_version() const { return version.substr(0, 2); }
};
- static std::vector<VisualStudioInstance> get_visual_studio_instances(const VcpkgPaths& paths)
+ static std::vector<VisualStudioInstance> get_visual_studio_instances_internal(const VcpkgPaths& paths)
{
const auto& fs = paths.get_filesystem();
std::vector<VisualStudioInstance> instances;
@@ -125,6 +141,13 @@ namespace vcpkg::VisualStudio
return instances;
}
+ std::vector<std::string> get_visual_studio_instances(const VcpkgPaths& paths)
+ {
+ std::vector<VisualStudioInstance> sorted {get_visual_studio_instances_internal(paths)};
+ std::sort(sorted.begin(), sorted.end(), VisualStudioInstance::preferred_first_comparator);
+ return Util::fmap(sorted, [](const VisualStudioInstance& instance) { return instance.to_string(); });
+ }
+
std::vector<Toolset> find_toolset_instances_preferred_first(const VcpkgPaths& paths)
{
using CPU = System::CPUArchitecture;
@@ -137,7 +160,7 @@ namespace vcpkg::VisualStudio
std::vector<Toolset> found_toolsets;
std::vector<Toolset> excluded_toolsets;
- const SortedVector<VisualStudioInstance> sorted{get_visual_studio_instances(paths),
+ const SortedVector<VisualStudioInstance> sorted {get_visual_studio_instances_internal(paths),
VisualStudioInstance::preferred_first_comparator};
const bool v140_is_available = Util::find_if(sorted, [&](const VisualStudioInstance& vs_instance) {

MODIFY
vcpkglib/vcpkglib.vcxproj
vcpkglib/vcpkglib.vcxproj
<ClCompile Include="..\src\vcpkg\commands.search.cpp" />
<ClCompile Include="..\src\vcpkg\commands.upgrade.cpp" />
<ClCompile Include="..\src\vcpkg\commands.version.cpp" />
+ <ClCompile Include="..\src\vcpkg\commands.xvsinstances.cpp" />
<ClCompile Include="..\src\vcpkg\dependencies.cpp" />
<ClCompile Include="..\src\vcpkg\export.cpp" />
<ClCompile Include="..\src\vcpkg\globalstate.cpp" />

MODIFY
vcpkglib/vcpkglib.vcxproj.filters
vcpkglib/vcpkglib.vcxproj.filters
<ClCompile Include="..\src\vcpkg\base\downloads.cpp">
<Filter>Source Files\vcpkg\base</Filter>
</ClCompile>
+ <ClCompile Include="..\src\vcpkg\commands.xvsinstances.cpp">
+ <Filter>Source Files\vcpkg</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\include\pch.h">

Add command x-vsinstances