|
|
@ -71,11 +71,11 @@ void Dotfile::add(const std::vector<std::string>& targets) |
|
|
|
|
|
|
|
|
|
|
|
sync( |
|
|
|
sync( |
|
|
|
targets, homePaths, systemPaths, |
|
|
|
targets, homePaths, systemPaths, |
|
|
|
[](std::string* paths, std::string homePath, size_t homeSize) { |
|
|
|
[](std::string* paths, const std::string& homePath, const std::string& homeDirectory) { |
|
|
|
paths[0] = homePath; |
|
|
|
paths[0] = homePath; |
|
|
|
paths[1] = homePath.substr(homeSize + 1); |
|
|
|
paths[1] = homePath.substr(homeDirectory.size() + 1); |
|
|
|
}, |
|
|
|
}, |
|
|
|
[](std::string* paths, std::string systemPath) { |
|
|
|
[](std::string* paths, const std::string& systemPath) { |
|
|
|
paths[0] = systemPath; |
|
|
|
paths[0] = systemPath; |
|
|
|
paths[1] = systemPath.substr(1); |
|
|
|
paths[1] = systemPath.substr(1); |
|
|
|
}); |
|
|
|
}); |
|
|
@ -98,11 +98,45 @@ 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> homeFiles; |
|
|
|
|
|
|
|
std::vector<size_t> systemFiles; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Separate home and system targets
|
|
|
|
|
|
|
|
forEachDotfile(targets, [&](const std::filesystem::directory_entry& path, size_t index, size_t) { |
|
|
|
|
|
|
|
dotfiles.push_back(path.path().string()); |
|
|
|
|
|
|
|
if (isSystemTarget(path.path().string())) { |
|
|
|
|
|
|
|
systemFiles.push_back(index); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
homeFiles.push_back(index); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t workingDirectory = s_workingDirectory.string().size(); |
|
|
|
|
|
|
|
sync( |
|
|
|
|
|
|
|
dotfiles, homeFiles, systemFiles, |
|
|
|
|
|
|
|
[&](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(workingDirectory); |
|
|
|
|
|
|
|
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(workingDirectory); |
|
|
|
|
|
|
|
paths[1] = systemFile; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------
|
|
|
|
// -----------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
void Dotfile::sync(const std::vector<std::string>& files, const std::vector<size_t>& homeIndices, const std::vector<size_t>& systemIndices, |
|
|
|
void Dotfile::sync(const std::vector<std::string>& files, const std::vector<size_t>& homeIndices, const std::vector<size_t>& systemIndices, |
|
|
|
const std::function<void(std::string*, std::string, size_t)>& generateHomePaths, |
|
|
|
const std::function<void(std::string*, const std::string&, const std::string&)>& generateHomePaths, |
|
|
|
const std::function<void(std::string*, std::string)>& generateSystemPaths) |
|
|
|
const std::function<void(std::string*, const std::string&)>& generateSystemPaths) |
|
|
|
{ |
|
|
|
{ |
|
|
|
bool root = !geteuid() ? true : false; |
|
|
|
bool root = !geteuid() ? true : false; |
|
|
|
if (!systemIndices.empty() && !root) { |
|
|
|
if (!systemIndices.empty() && !root) { |
|
|
@ -160,10 +194,10 @@ void Dotfile::sync(const std::vector<std::string>& files, const std::vector<size |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// /home/<user>/
|
|
|
|
// /home/<user>/
|
|
|
|
std::string home = "/home/" + std::string(user->pw_name); |
|
|
|
std::string homeDirectory = "/home/" + std::string(user->pw_name); |
|
|
|
for (size_t i : homeIndices) { |
|
|
|
for (size_t i : homeIndices) { |
|
|
|
std::string paths[2]; |
|
|
|
std::string paths[2]; |
|
|
|
generateHomePaths(paths, files.at(i), home.size()); |
|
|
|
generateHomePaths(paths, files.at(i), homeDirectory); |
|
|
|
copy(paths[0], paths[1], true); |
|
|
|
copy(paths[0], paths[1], true); |
|
|
|
} |
|
|
|
} |
|
|
|
// /
|
|
|
|
// /
|
|
|
@ -174,7 +208,7 @@ void Dotfile::sync(const std::vector<std::string>& files, const std::vector<size |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Dotfile::forEachDotfile(const std::vector<std::string>& targets, const std::function<void(std::filesystem::directory_entry, size_t, size_t)>& callback) |
|
|
|
void Dotfile::forEachDotfile(const std::vector<std::string>& targets, const std::function<void(const std::filesystem::directory_entry&, size_t, size_t)>& callback) |
|
|
|
{ |
|
|
|
{ |
|
|
|
size_t workingDirectory = s_workingDirectory.string().size(); |
|
|
|
size_t workingDirectory = s_workingDirectory.string().size(); |
|
|
|
|
|
|
|
|
|
|
|