fix: do not copy whole dirs (doesnt work on nix-store)

This commit is contained in:
2025-12-09 15:46:17 +03:00
parent 7535bb51ce
commit 44a34eb216
3 changed files with 60 additions and 13 deletions

3
.gitignore vendored
View File

@@ -10,6 +10,9 @@ out
/AUR/pkg /AUR/pkg
/AUR/src /AUR/src
/result
/result-*
*.log *.log
*tar.zst *tar.zst
*tar.gz *tar.gz

View File

@@ -3,6 +3,7 @@
#include <core/palette/color.hpp> #include <core/palette/color.hpp>
#include <filesystem> #include <filesystem>
#include <fstream>
#include <stdexcept> #include <stdexcept>
#ifdef _WIN32 #ifdef _WIN32
@@ -56,25 +57,66 @@ std::filesystem::path config::get_data_dir()
#endif #endif
} }
void config::copy_file(const std::filesystem::path &src, const std::filesystem::path &dst)
{
if (std::filesystem::exists(dst))
return;
std::ifstream in(src, std::ios::binary);
std::ofstream out(dst, std::ios::binary);
out << in.rdbuf();
}
void config::copy_dir(const std::filesystem::path &src, const std::filesystem::path &dst)
{
for (auto const &entry : std::filesystem::recursive_directory_iterator(src))
{
auto rel = std::filesystem::relative(entry.path(), src);
auto out = dst / rel;
if (entry.is_directory())
{
std::filesystem::create_directories(out);
}
else if (entry.is_regular_file())
{
copy_file(entry.path(), out);
}
}
}
void config::copy_default_configs() void config::copy_default_configs()
{ {
std::filesystem::path user_config = get_user_config_dir(); std::filesystem::path user_dir = get_user_config_dir();
std::filesystem::path default_dir = get_data_dir(); std::filesystem::path system_dir = get_data_dir();
std::filesystem::create_directories(user_dir);
if (!std::filesystem::exists(user_config))
{ {
std::filesystem::create_directories(user_config); auto src = system_dir / "config.toml";
auto dst = user_dir / "config.toml";
std::filesystem::copy(default_dir / "config.toml", user_config / "config.toml"); if (!std::filesystem::exists(dst))
std::filesystem::copy(default_dir / "templates", user_config / "templates", copy_file(src, dst);
std::filesystem::copy_options::recursive);
std::filesystem::copy(default_dir / "palettes", user_config / "palettes",
std::filesystem::copy_options::recursive);
return;
} }
if (!std::filesystem::exists(user_config / "config.toml"))
{ {
std::filesystem::copy(default_dir / "config.toml", user_config / "config.toml"); auto src = system_dir / "templates";
auto dst = user_dir / "templates";
if (!std::filesystem::exists(dst))
std::filesystem::create_directories(dst);
copy_dir(src, dst);
}
{
auto src = system_dir / "palettes";
auto dst = user_dir / "palettes";
if (!std::filesystem::exists(dst))
std::filesystem::create_directories(dst);
copy_dir(src, dst);
} }
} }

View File

@@ -42,6 +42,8 @@ class config
std::string m_palettes_dir{}; std::string m_palettes_dir{};
std::unique_ptr<io::file> m_file; std::unique_ptr<io::file> m_file;
std::unordered_map<std::string, theme_template> m_themes{}; std::unordered_map<std::string, theme_template> m_themes{};
static void copy_file(const std::filesystem::path& src, const std::filesystem::path& dst);
static void copy_dir(const std::filesystem::path& src, const std::filesystem::path& dst);
void copy_default_configs(); void copy_default_configs();
}; };
} // namespace clrsync::core } // namespace clrsync::core