Manager: Deduplicate code between pulling and pushing functions
This commit is contained in:
+26
-31
@@ -100,38 +100,17 @@ void Dotfile::list(const std::vector<std::string>& targets)
|
||||
|
||||
void Dotfile::pull(const std::vector<std::string>& targets)
|
||||
{
|
||||
std::vector<std::string> dotfiles;
|
||||
std::vector<size_t> homeIndices;
|
||||
std::vector<size_t> systemIndices;
|
||||
|
||||
// Separate home and system targets
|
||||
forEachDotfile(targets, [&](const std::filesystem::directory_entry& path, size_t index) {
|
||||
dotfiles.push_back(path.path().string());
|
||||
if (isSystemTarget(path.path().string())) {
|
||||
systemIndices.push_back(index);
|
||||
}
|
||||
else {
|
||||
homeIndices.push_back(index);
|
||||
}
|
||||
});
|
||||
|
||||
sync(
|
||||
dotfiles, homeIndices, systemIndices,
|
||||
[](std::string* paths, const std::string& homeFile, const std::string& homeDirectory) {
|
||||
// homeFile = /home/<user>/dotfiles/<file>
|
||||
// copy: /home/<user>/<file> -> /home/<user>/dotfiles/<file>
|
||||
paths[0] = homeDirectory + homeFile.substr(s_workingDirectorySize);
|
||||
paths[1] = homeFile;
|
||||
},
|
||||
[](std::string* paths, const std::string& systemFile) {
|
||||
// systemFile = /home/<user>/dotfiles/<file>
|
||||
// copy: <file> -> /home/<user>/dotfiles/<file>
|
||||
paths[0] = systemFile.substr(s_workingDirectorySize);
|
||||
paths[1] = systemFile;
|
||||
});
|
||||
pullOrPush(SyncType::Pull, targets);
|
||||
}
|
||||
|
||||
void Dotfile::push(const std::vector<std::string>& targets)
|
||||
{
|
||||
pullOrPush(SyncType::Push, targets);
|
||||
}
|
||||
|
||||
// -----------------------------------------
|
||||
|
||||
void Dotfile::pullOrPush(SyncType type, const std::vector<std::string>& targets)
|
||||
{
|
||||
std::vector<std::string> dotfiles;
|
||||
std::vector<size_t> homeIndices;
|
||||
@@ -148,6 +127,23 @@ void Dotfile::push(const std::vector<std::string>& targets)
|
||||
}
|
||||
});
|
||||
|
||||
if (type == SyncType::Pull) {
|
||||
sync(
|
||||
dotfiles, homeIndices, systemIndices,
|
||||
[](std::string* paths, const std::string& homeFile, const std::string& homeDirectory) {
|
||||
// homeFile = /home/<user>/dotfiles/<file>
|
||||
// copy: /home/<user>/<file> -> /home/<user>/dotfiles/<file>
|
||||
paths[0] = homeDirectory + homeFile.substr(s_workingDirectorySize);
|
||||
paths[1] = homeFile;
|
||||
},
|
||||
[](std::string* paths, const std::string& systemFile) {
|
||||
// systemFile = /home/<user>/dotfiles/<file>
|
||||
// copy: <file> -> /home/<user>/dotfiles/<file>
|
||||
paths[0] = systemFile.substr(s_workingDirectorySize);
|
||||
paths[1] = systemFile;
|
||||
});
|
||||
}
|
||||
else {
|
||||
sync(
|
||||
dotfiles, homeIndices, systemIndices,
|
||||
[](std::string* paths, const std::string& homeFile, const std::string& homeDirectory) {
|
||||
@@ -162,10 +158,9 @@ void Dotfile::push(const std::vector<std::string>& targets)
|
||||
paths[0] = systemFile;
|
||||
paths[1] = systemFile.substr(s_workingDirectorySize);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------
|
||||
|
||||
void Dotfile::sync(const std::vector<std::string>& paths, const std::vector<size_t>& homeIndices, const std::vector<size_t>& systemIndices,
|
||||
const std::function<void(std::string*, const std::string&, const std::string&)>& generateHomePaths,
|
||||
const std::function<void(std::string*, const std::string&)>& generateSystemPaths)
|
||||
|
||||
@@ -18,6 +18,11 @@ public:
|
||||
Dotfile();
|
||||
virtual ~Dotfile();
|
||||
|
||||
enum class SyncType {
|
||||
Pull,
|
||||
Push,
|
||||
};
|
||||
|
||||
enum class ExcludeType {
|
||||
File,
|
||||
Directory,
|
||||
@@ -43,9 +48,11 @@ public:
|
||||
static void setExcludePaths(const std::vector<ExcludePath>& excludePaths) { s_excludePaths = excludePaths; }
|
||||
|
||||
private:
|
||||
void pullOrPush(SyncType type, const std::vector<std::string>& targets = {});
|
||||
void sync(const std::vector<std::string>& paths, const std::vector<size_t>& homeIndices, const std::vector<size_t>& systemIndices,
|
||||
const std::function<void(std::string*, const std::string&, const std::string&)>& generateHomePaths,
|
||||
const std::function<void(std::string*, const std::string&)>& generateSystemPaths);
|
||||
|
||||
void forEachDotfile(const std::vector<std::string>& targets, const std::function<void(const std::filesystem::directory_entry&, size_t)>& callback);
|
||||
bool filter(const std::filesystem::path& path);
|
||||
bool include(const std::filesystem::path& path, const std::vector<std::string>& targets);
|
||||
|
||||
Reference in New Issue
Block a user