Merge pull request #7828 from spycrab/updatecommon2

UpdaterCommon: Prevent duplicate downloads and respect symlinks
This commit is contained in:
spycrab 2019-02-28 13:04:15 +01:00 committed by GitHub
commit 3c2ebec84e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 15 deletions

View File

@ -187,6 +187,11 @@ static bool DownloadContent(const std::vector<TodoList::DownloadOp>& to_download
auto& download = to_download[i]; auto& download = to_download[i];
std::string hash_filename = HexEncode(download.hash.data(), download.hash.size()); std::string hash_filename = HexEncode(download.hash.data(), download.hash.size());
// File already exists, skipping
if (File::Exists(temp_path + DIR_SEP + hash_filename))
continue;
UI::SetDescription("Downloading " + download.filename + "... (File " + std::to_string(i + 1) + UI::SetDescription("Downloading " + download.filename + "... (File " + std::to_string(i + 1) +
" of " + std::to_string(to_download.size()) + ")"); " of " + std::to_string(to_download.size()) + ")");
UI::SetCurrentMarquee(false); UI::SetCurrentMarquee(false);
@ -279,9 +284,9 @@ std::optional<std::string> FindOrCreateTempDir(const std::string& base_path)
std::string temp_path = base_path + DIR_SEP + UPDATE_TEMP_DIR; std::string temp_path = base_path + DIR_SEP + UPDATE_TEMP_DIR;
int counter = 0; int counter = 0;
File::DeleteDirRecursively(temp_path);
do do
{
if (!File::Exists(temp_path))
{ {
if (File::CreateDir(temp_path)) if (File::CreateDir(temp_path))
{ {
@ -290,15 +295,7 @@ std::optional<std::string> FindOrCreateTempDir(const std::string& base_path)
else else
{ {
fprintf(log_fp, "Couldn't create temp directory.\n"); fprintf(log_fp, "Couldn't create temp directory.\n");
return {};
}
}
else if (File::IsDirectory(temp_path))
{
return temp_path;
}
else
{
// Try again with a counter appended to the path. // Try again with a counter appended to the path.
std::string suffix = UPDATE_TEMP_DIR + std::to_string(counter); std::string suffix = UPDATE_TEMP_DIR + std::to_string(counter);
temp_path = base_path + DIR_SEP + suffix; temp_path = base_path + DIR_SEP + suffix;
@ -385,8 +382,14 @@ static bool UpdateFiles(const std::vector<TodoList::UpdateOp>& to_update,
#ifndef _WIN32 #ifndef _WIN32
struct stat file_stats; struct stat file_stats;
if (stat(path.c_str(), &file_stats) != 0) if (lstat(path.c_str(), &file_stats) != 0)
return false; continue;
if (S_ISLNK(file_stats.st_mode))
{
fprintf(log_fp, "%s is symlink, skipping\n", path.c_str());
continue;
}
permission = file_stats.st_mode; permission = file_stats.st_mode;
#endif #endif