出版
This commit is contained in:
commit
71dbaa1812
17
.clang-format
Normal file
17
.clang-format
Normal file
@ -0,0 +1,17 @@
|
||||
BasedOnStyle: LLVM
|
||||
IndentWidth: 4
|
||||
PointerAlignment: Left
|
||||
AccessModifierOffset: -4
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
AfterFunction: true
|
||||
AfterClass: true
|
||||
Cpp11BracedListStyle: true
|
||||
ReflowComments: true
|
||||
SpacesBeforeTrailingComments: 3
|
||||
TabWidth: 4
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||
ColumnLimit: 80
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortFunctionsOnASingleLine: None
|
||||
AllowShortEnumsOnASingleLine: false
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
build
|
||||
.vs
|
||||
.cache
|
||||
cmake-*
|
40
.vscode/settings.json
vendored
Normal file
40
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"files.autoSave": "onFocusChange",
|
||||
"editor.fontSize": 14,
|
||||
"editor.fontFamily": "'FiraCode Nerd Font Mono', 'FiraCode Nerd Font Mono', 'FiraCode Nerd Font Mono'",
|
||||
"cmake.configureOnOpen": true,
|
||||
"cmake.debugConfig": {
|
||||
"console": "integratedTerminal",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "-gdb-set charset utf-8",
|
||||
"text": "-gdb-set charset UTF-8"
|
||||
},
|
||||
{
|
||||
"description": "Enable gdb pretty-printing",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
"SemiWorkCode", "From"
|
||||
]
|
||||
},
|
||||
"cmake.environment": {
|
||||
"PATH": "${env::PATH};D:/library/wxWidgets/lib/vc_x64_dll"
|
||||
},
|
||||
// "cmake.configureSettings": {
|
||||
// "CMAKE_TOOLCHAIN_FILE": "${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||
// },
|
||||
"cmake.options.statusBarVisibility": "visible",
|
||||
"cmake.generator": "Ninja",
|
||||
"C_Cpp.default.compileCommands": "${workspaceRoot}/build/compile_commands.json",
|
||||
"C_Cpp.default.cppStandard": "c++17",
|
||||
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
|
||||
"editor.inlayHints.enabled": "off",
|
||||
"editor.unicodeHighlight.allowedLocales": {
|
||||
"ja": true,
|
||||
"zh-hant": true,
|
||||
"zh-hans": true
|
||||
}
|
||||
}
|
21
CMakeLists.txt
Normal file
21
CMakeLists.txt
Normal file
@ -0,0 +1,21 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(msync LANGUAGES CXX)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
list(APPEND CMAKE_PREFIX_PATH "D:/library/wxWidgets/lib/cmake")
|
||||
|
||||
if (MSVC)
|
||||
add_compile_options(/source-charset:utf-8)
|
||||
endif()
|
||||
|
||||
find_package(wxWidgets REQUIRED COMPONENTS core base xml)
|
||||
include(${wxWidgets_USE_FILE})
|
||||
|
||||
message(STATUS "System: ${CMAKE_SYSTEM_NAME}")
|
||||
message(STATUS "Compiler CXX ID: ${CMAKE_CXX_COMPILER_ID}")
|
||||
|
||||
add_executable(msync main.cpp)
|
||||
target_link_libraries(msync PRIVATE ${wxWidgets_LIBRARIES})
|
||||
set_target_properties(msync PROPERTIES WIN32_EXECUTABLE FALSE)
|
7
config/msync.xml
Normal file
7
config/msync.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Root>
|
||||
<Item Name="SemiWorkCode" WinWorkPath="D:/work" UnixWorkPath="/home/lebo/mwork">
|
||||
<Exclude>.git</Exclude>
|
||||
<Exclude>build</Exclude>
|
||||
</Item>
|
||||
</Root>
|
173
main.cpp
Normal file
173
main.cpp
Normal file
@ -0,0 +1,173 @@
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#include <wx/app.h>
|
||||
#include <wx/arrstr.h>
|
||||
#include <wx/filename.h>
|
||||
#include <wx/log.h>
|
||||
#include <wx/stdpaths.h>
|
||||
#include <wx/utils.h>
|
||||
#include <wx/xml/xml.h>
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
struct Configure {
|
||||
wxString name;
|
||||
wxString work_dir;
|
||||
wxArrayString exclude;
|
||||
};
|
||||
|
||||
static wxString work_path;
|
||||
static wxString cw_work_path;
|
||||
|
||||
bool parse_xml(const wxString& filepath, const wxString& name,
|
||||
Configure& config)
|
||||
{
|
||||
wxXmlDocument xmlDoc;
|
||||
if (!xmlDoc.Load(filepath)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
wxXmlNode* root = xmlDoc.GetRoot();
|
||||
auto c = root->GetChildren();
|
||||
if (!c) {
|
||||
wxLogMessage("解析Xml失败。");
|
||||
return false;
|
||||
}
|
||||
bool find = false;
|
||||
while (c) {
|
||||
if (c->GetName() != "Item") {
|
||||
c = c->GetNext();
|
||||
continue;
|
||||
}
|
||||
if (c->GetAttribute("Name") != name) {
|
||||
c = c->GetNext();
|
||||
continue;
|
||||
}
|
||||
find = true;
|
||||
config.name = name;
|
||||
#ifdef _WIN32
|
||||
config.work_dir = c->GetAttribute("WinWorkPath");
|
||||
#else
|
||||
config.work_dir = c->GetAttribute("UnixWorkPath");
|
||||
#endif
|
||||
auto p = c->GetChildren();
|
||||
while (p) {
|
||||
config.exclude.push_back(p->GetNodeContent());
|
||||
p = p->GetNext();
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!find) {
|
||||
wxLogMessage("未找到%s的配置。", name);
|
||||
return false;
|
||||
} else {
|
||||
wxLogMessage("找到%s的配置。", name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
wxString ConvertToCygwinPath(const wxString& path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
// 提取驱动器字母
|
||||
wxString drive = path.BeforeFirst('\\').Upper();
|
||||
drive.erase(1, 1);
|
||||
wxString restPath = path.AfterFirst('\\');
|
||||
|
||||
// 替换为 Cygwin 格式
|
||||
wxString cygwinPath = "/cygdrive/" + drive.Lower();
|
||||
if (!restPath.empty()) {
|
||||
cygwinPath.append("/" + restPath);
|
||||
}
|
||||
cygwinPath.Replace("\\", "/");
|
||||
return cygwinPath;
|
||||
#else
|
||||
return path;
|
||||
#endif
|
||||
}
|
||||
|
||||
wxString get_cmd(Configure& config, bool to_cur)
|
||||
{
|
||||
wxString cmd_str;
|
||||
|
||||
#if _WIN32
|
||||
wxString cmd = work_path + "cwrsync\\bin\\rsync.exe ";
|
||||
cmd_str.append(cmd);
|
||||
#else
|
||||
cmd_str.append("rsync ");
|
||||
dest_str = work_path + config.name;
|
||||
source_str = config.work_dir + config.name;
|
||||
#endif
|
||||
|
||||
cmd_str.append("-av");
|
||||
wxString dir_str;
|
||||
|
||||
if (to_cur) {
|
||||
fs::path path(config.work_dir.ToStdString());
|
||||
path.append(config.name.ToStdString());
|
||||
dir_str.append(ConvertToCygwinPath(wxString(path.string())));
|
||||
dir_str.append(" " + cw_work_path);
|
||||
} else {
|
||||
fs::path path(cw_work_path.ToStdString());
|
||||
path.append(config.name.ToStdString());
|
||||
dir_str.append(wxString(path.string()));
|
||||
dir_str.append(" " + ConvertToCygwinPath(config.work_dir));
|
||||
}
|
||||
|
||||
for (const auto& data : config.exclude) {
|
||||
cmd_str.append(" --exclude=" + data);
|
||||
}
|
||||
cmd_str.append(" ");
|
||||
cmd_str.append(dir_str);
|
||||
wxLogMessage(cmd_str);
|
||||
return cmd_str;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
// 确保当前程序能够与所使用的 wxWidgets 库兼容
|
||||
wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program");
|
||||
wxInitializer initializer;
|
||||
if (!initializer) {
|
||||
std::cout << "初始化失败。" << std::endl;
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (argc < 3) {
|
||||
std::cout << "需要传入文件夹名称[XXX]及方向[From/To]。" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
wxString oper_dir(argv[1]);
|
||||
wxString direct(argv[2]);
|
||||
|
||||
if (direct != "From" && direct != "To") {
|
||||
std::cout << "方向不合法,必须是[From/To]。";
|
||||
return -3;
|
||||
}
|
||||
|
||||
// 读取配置文件 msync.xml
|
||||
const wxStandardPaths& stdpath = wxStandardPaths::Get();
|
||||
wxString exe_path = stdpath.GetExecutablePath();
|
||||
wxFileName file_name(exe_path);
|
||||
work_path = file_name.GetPathWithSep();
|
||||
cw_work_path = ConvertToCygwinPath(work_path);
|
||||
wxString config_path = work_path + "msync.xml";
|
||||
|
||||
Configure config;
|
||||
if (!parse_xml(config_path, oper_dir, config)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
auto command = get_cmd(config, direct == "From");
|
||||
wxArrayString output;
|
||||
// 使用 wxExecute 执行命令
|
||||
long result = wxExecute(command, output, wxEXEC_SYNC);
|
||||
wxLogMessage("命令执行结果:%d", result);
|
||||
wxString out_str;
|
||||
for (const auto& data : output) {
|
||||
out_str.append(data + "\n");
|
||||
}
|
||||
wxLogMessage("命令输出:%s", out_str);
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user