vcpkg/toolsrc/src/commands_update.cpp

74 lines
2.6 KiB
C++
Raw Normal View History

2017-01-28 04:49:09 +08:00
#include "pch.h"
2017-04-28 09:08:52 +08:00
#include "Paragraphs.h"
#include "vcpkg_Commands.h"
2017-04-28 09:08:52 +08:00
#include "vcpkg_System.h"
#include "vcpkglib.h"
namespace vcpkg::Commands::Update
{
2017-04-04 07:03:31 +08:00
bool OutdatedPackage::compare_by_name(const OutdatedPackage& left, const OutdatedPackage& right)
2017-03-30 09:14:48 +08:00
{
return left.spec.name() < right.spec.name();
}
2017-04-04 07:29:11 +08:00
std::vector<OutdatedPackage> find_outdated_packages(const VcpkgPaths& paths, const StatusParagraphs& status_db)
2017-03-30 06:10:28 +08:00
{
2017-04-28 09:08:52 +08:00
const std::map<std::string, VersionT> src_names_to_versions =
Paragraphs::load_all_port_names_and_versions(paths.get_filesystem(), paths.ports);
2017-03-30 08:33:08 +08:00
const std::vector<StatusParagraph*> installed_packages = get_installed_ports(status_db);
2017-04-04 07:03:31 +08:00
std::vector<OutdatedPackage> output;
2017-03-30 08:33:08 +08:00
for (const StatusParagraph* pgh : installed_packages)
2017-03-30 06:10:28 +08:00
{
const auto it = src_names_to_versions.find(pgh->package.spec.name());
2017-03-30 06:10:28 +08:00
if (it == src_names_to_versions.end())
{
// Package was not installed from portfile
continue;
}
if (it->second != pgh->package.version)
{
output.push_back({pgh->package.spec, VersionDiff(pgh->package.version, it->second)});
2017-03-30 06:10:28 +08:00
}
}
2017-03-30 08:33:08 +08:00
return output;
2017-03-30 06:10:28 +08:00
}
2017-04-04 07:29:11 +08:00
void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths)
{
args.check_exact_arg_count(0);
2017-02-18 07:32:10 +08:00
args.check_and_get_optional_command_arguments({});
System::println("Using local portfile versions. To update the local portfiles, use `git pull`.");
2017-03-30 08:33:08 +08:00
const StatusParagraphs status_db = database_load_check(paths);
2017-04-28 09:08:52 +08:00
const auto outdated_packages =
SortedVector<OutdatedPackage>(find_outdated_packages(paths, status_db), &OutdatedPackage::compare_by_name);
2017-03-30 08:33:08 +08:00
if (outdated_packages.empty())
{
System::println("No packages need updating.");
}
else
{
2017-05-08 17:45:01 +08:00
std::string install_line;
System::println("The following packages differ from their port versions:");
2017-03-30 08:33:08 +08:00
for (auto&& package : outdated_packages)
{
2017-05-08 17:45:01 +08:00
install_line += package.spec.to_string();
install_line += " ";
2017-04-08 07:17:54 +08:00
System::println(" %-32s %s", package.spec, package.version_diff.to_string());
}
System::println("\n"
2017-04-28 09:08:52 +08:00
"To update these packages, run\n"
2017-05-04 15:29:17 +08:00
" .\\vcpkg remove --outdated\n"
" .\\vcpkg install " +
install_line);
}
Checks::exit_success(VCPKG_LINE_INFO);
}
}