aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/commands_update.cpp
blob: 71ea4b0636388ac8361b5d39fe69c03f23a109c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "pch.h"

#include "Paragraphs.h"
#include "vcpkg_Commands.h"
#include "vcpkg_System.h"
#include "vcpkglib.h"

namespace vcpkg::Commands::Update
{
    bool OutdatedPackage::compare_by_name(const OutdatedPackage& left, const OutdatedPackage& right)
    {
        return left.spec.name() < right.spec.name();
    }

    std::vector<OutdatedPackage> find_outdated_packages(const VcpkgPaths& paths, const StatusParagraphs& status_db)
    {
        const std::map<std::string, VersionT> src_names_to_versions =
            Paragraphs::load_all_port_names_and_versions(paths.get_filesystem(), paths.ports);
        const std::vector<StatusParagraph*> installed_packages = get_installed_ports(status_db);

        std::vector<OutdatedPackage> output;
        for (const StatusParagraph* pgh : installed_packages)
        {
            const auto it = src_names_to_versions.find(pgh->package.spec.name());
            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)});
            }
        }

        return output;
    }

    void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths)
    {
        args.check_exact_arg_count(0);
        args.check_and_get_optional_command_arguments({});
        System::println("Using local portfile versions. To update the local portfiles, use `git pull`.");

        const StatusParagraphs status_db = database_load_check(paths);

        const auto outdated_packages =
            SortedVector<OutdatedPackage>(find_outdated_packages(paths, status_db), &OutdatedPackage::compare_by_name);

        if (outdated_packages.empty())
        {
            System::println("No packages need updating.");
        }
        else
        {
            std::string install_line;
            System::println("The following packages differ from their port versions:");
            for (auto&& package : outdated_packages)
            {
                install_line += package.spec.to_string();
                install_line += " ";
                System::println("    %-32s %s", package.spec, package.version_diff.to_string());
            }
            System::println("\n"
                            "To update these packages, run\n"
                            "    .\\vcpkg remove --outdated\n"
                            "    .\\vcpkg install " +
                            install_line);
        }

        Checks::exit_success(VCPKG_LINE_INFO);
    }
}