Prompt rebuild if external hash changes

This commit is contained in:
Curtis.Bezault 2019-07-23 15:26:13 -07:00
parent 459908ae14
commit 2f2a45595f
4 changed files with 52 additions and 6 deletions

View File

@ -7,6 +7,13 @@
namespace vcpkg namespace vcpkg
{ {
enum class ConsistencyState : unsigned
{
UNKNOWN = 0,
CONSISTENT,
INCONSISTENT,
};
/// <summary> /// <summary>
/// Built package metadata /// Built package metadata
/// </summary> /// </summary>
@ -23,6 +30,8 @@ namespace vcpkg
std::string dir() const; std::string dir() const;
bool is_consistent() const;
PackageSpec spec; PackageSpec spec;
std::string version; std::string version;
std::string description; std::string description;
@ -33,6 +42,8 @@ namespace vcpkg
std::string abi; std::string abi;
SourceParagraph::TYPE type; SourceParagraph::TYPE type;
std::unordered_map<std::string, std::string> external_files; std::unordered_map<std::string, std::string> external_files;
mutable ConsistencyState consistency = ConsistencyState::UNKNOWN;
}; };
struct BinaryControlFile struct BinaryControlFile

View File

@ -1,6 +1,7 @@
#include "pch.h" #include "pch.h"
#include <vcpkg/base/checks.h> #include <vcpkg/base/checks.h>
#include <vcpkg/base/hash.h>
#include <vcpkg/base/system.print.h> #include <vcpkg/base/system.print.h>
#include <vcpkg/base/util.h> #include <vcpkg/base/util.h>
#include <vcpkg/binaryparagraph.h> #include <vcpkg/binaryparagraph.h>
@ -27,6 +28,32 @@ namespace vcpkg
static const std::string EXTERNALFILES = "External-Files"; static const std::string EXTERNALFILES = "External-Files";
} }
bool BinaryParagraph::is_consistent() const
{
switch (consistency)
{
case ConsistencyState::UNKNOWN :
for (const auto& file_hash : external_files)
{
const auto& realfs = Files::get_real_filesystem();
if (realfs.is_regular_file(file_hash.first) &&
Hash::get_file_hash(realfs, file_hash.first, "SHA1") != file_hash.second)
{
consistency = ConsistencyState::INCONSISTENT;
return false;
}
}
consistency = ConsistencyState::CONSISTENT;
return true;
case ConsistencyState::CONSISTENT : return true;
case ConsistencyState::INCONSISTENT : return false;
}
Checks::unreachable(VCPKG_LINE_INFO);
}
BinaryParagraph::BinaryParagraph() = default; BinaryParagraph::BinaryParagraph() = default;
BinaryParagraph::BinaryParagraph(std::unordered_map<std::string, std::string> fields) BinaryParagraph::BinaryParagraph(std::unordered_map<std::string, std::string> fields)

View File

@ -475,11 +475,15 @@ namespace vcpkg::Build
{ {
hashes.emplace_back(external_file, it_hash->second); hashes.emplace_back(external_file, it_hash->second);
} }
else if (fs.is_regular_file(external_file)) else if (Files::get_real_filesystem().is_regular_file(external_file))
{ {
auto emp = s_hash_cache.emplace(external_file.u8string(), auto emp = s_hash_cache.emplace(
Hash::get_file_hash(fs, external_file, "SHA1")); external_file.u8string(),
hashes.emplace_back(external_file, emp.first->second); Hash::get_file_hash(
Files::get_real_filesystem(),
external_file, "SHA1"));
hashes.emplace_back(external_file.u8string(), emp.first->second);
} }
else else
{ {

View File

@ -664,13 +664,17 @@ namespace vcpkg::Dependencies
if (auto p_installed = cluster.installed.get()) if (auto p_installed = cluster.installed.get())
{ {
if (p_installed->original_features.find(feature) != p_installed->original_features.end()) if (p_installed->original_features.find(feature) != p_installed->original_features.end() &&
p_installed->ipv.core->package.is_consistent())
{ {
return MarkPlusResult::SUCCESS; return MarkPlusResult::SUCCESS;
} }
} }
// This feature was or will be uninstalled, therefore we need to rebuild //The feature was not previously installed or the external files of the
//port are no longer consistent with the last installation of this port
//(they've either been modified or removed). Mark the cluster
//(aka the entire port) to be removed before re-adding it.
mark_minus(cluster, graph, graph_plan, prevent_default_features); mark_minus(cluster, graph, graph_plan, prevent_default_features);
return follow_plus_dependencies(feature, cluster, graph, graph_plan, prevent_default_features); return follow_plus_dependencies(feature, cluster, graph, graph_plan, prevent_default_features);