zen-gitsync 2.1.8 → 2.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,6 +75,12 @@ $ g --cwd=<path>
75
75
  start /min cmd /k "g -y --path=你要同步的文件夹 --interval"
76
76
  ```
77
77
 
78
+ #### cmd 定时执行命令
79
+ ```shell
80
+ start /min cmd /k "g --cmd=\"echo hello\" --cmd-interval=5" # 每5秒执行一次echo hello
81
+ start /min cmd /k "g --cmd=\"echo at-time\" --at=23:59" # 在23:59执行一次echo at-time
82
+ ```
83
+
78
84
  #### 不显示git diff内容
79
85
  ```shell
80
86
  $ g --no-diff
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.1.8",
3
+ "version": "2.1.10",
4
4
  "description": "一个 git 自动查看差异并提交的工具",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -23,6 +23,8 @@
23
23
  "g:y": "g -y",
24
24
  "g:reset": "git reset --hard origin/main",
25
25
  "g:ui": "node ./src/gitCommit.js ui",
26
+ "g:test-cmd": "node ./src/gitCommit.js --cmd=\"echo zen-gitsync test\" --cmd-interval=5",
27
+ "g:test-cmd-at": "node ./src/gitCommit.js --cmd=\"echo at-time-test\" --at=21:09",
26
28
  "start:vue": "cd ./src/ui/client && npm run dev",
27
29
  "start:server": "node -e \"import('./src/ui/server/index.js').then(module => module.default())\""
28
30
  },
package/src/gitCommit.js CHANGED
@@ -12,6 +12,7 @@ import config from './config.js';
12
12
  import dateFormat from 'date-fns/format';
13
13
  import logUpdate from 'log-update';
14
14
  import startUIServer from './ui/server/index.js';
15
+ import { exec } from 'child_process';
15
16
 
16
17
  let countdownInterval = null;
17
18
 
@@ -138,7 +139,77 @@ async function main() {
138
139
 
139
140
  await handleConfigCommands();
140
141
 
141
- judgeInterval();
142
+ // ========== 新增:自定义cmd定时/定点执行功能 ==========
143
+ const cmdArg = process.argv.find(arg => arg.startsWith('--cmd='));
144
+ if (cmdArg) {
145
+ const cmd = cmdArg.split('=')[1].replace(/^['"]|['"]$/g, '');
146
+ const atArg = process.argv.find(arg => arg.startsWith('--at='));
147
+ const intervalArg = process.argv.find(arg => arg.startsWith('--cmd-interval='));
148
+ if (atArg) {
149
+ // 定点执行
150
+ const atTime = atArg.split('=')[1].replace(/^['"]|['"]$/g, '');
151
+ const now = new Date();
152
+ let target;
153
+ if (/^\d{2}:\d{2}$/.test(atTime)) {
154
+ // 只给了时:分,今天的
155
+ const [h, m] = atTime.split(':');
156
+ target = new Date(now.getFullYear(), now.getMonth(), now.getDate(), h, m, 0);
157
+ } else {
158
+ target = new Date(atTime);
159
+ }
160
+ const delay = target - now;
161
+ if (delay > 0) {
162
+ console.log(`将在 ${target.toLocaleString()} 执行: ${cmd}`);
163
+ setTimeout(() => {
164
+ console.log(`\n[自定义命令执行] ${new Date().toLocaleString()}\n> ${cmd}`);
165
+ exec(cmd, (err, stdout, stderr) => {
166
+ if (err) {
167
+ console.error(`[自定义命令错误]`, err.message);
168
+ }
169
+ if (stdout) console.log(`[自定义命令输出]\n${stdout}`);
170
+ if (stderr) console.error(`[自定义命令错误输出]\n${stderr}`);
171
+ });
172
+ }, delay);
173
+ } else {
174
+ console.log('指定时间已过,不执行自定义命令');
175
+ }
176
+ } else if (intervalArg) {
177
+ // 定时循环执行
178
+ const interval = parseInt(intervalArg.split('=')[1], 10) * 1000;
179
+ console.log(`每隔 ${interval/1000} 秒执行: ${cmd}`);
180
+ setInterval(() => {
181
+ console.log(`\n[自定义命令执行] ${new Date().toLocaleString()}\n> ${cmd}`);
182
+ exec(cmd, (err, stdout, stderr) => {
183
+ if (err) {
184
+ console.error(`[自定义命令错误]`, err.message);
185
+ }
186
+ if (stdout) console.log(`[自定义命令输出]\n${stdout}`);
187
+ if (stderr) console.error(`[自定义命令错误输出]\n${stderr}`);
188
+ });
189
+ }, interval);
190
+ } else {
191
+ // 立即执行一次
192
+ console.log(`[自定义命令立即执行] > ${cmd}`);
193
+ exec(cmd, (err, stdout, stderr) => {
194
+ if (err) {
195
+ console.error(`[自定义命令错误]`, err.message);
196
+ }
197
+ if (stdout) console.log(`[自定义命令输出]\n${stdout}`);
198
+ if (stderr) console.error(`[自定义命令错误输出]\n${stderr}`);
199
+ });
200
+ }
201
+ }
202
+ // ========== 新增功能结束 ==========
203
+
204
+ // 判断是否需要执行git自动提交
205
+ const hasGitTask = process.argv.some(arg =>
206
+ arg.startsWith('--interval') ||
207
+ arg === '-y' ||
208
+ arg.startsWith('-m')
209
+ );
210
+ if (hasGitTask || !cmdArg) {
211
+ judgeInterval();
212
+ }
142
213
  }
143
214
 
144
215
  const showStartInfo = (interval) => {
@@ -0,0 +1 @@
1
+ .card[data-v-a828da7e]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;transition:all .3s ease}.status-header[data-v-a828da7e]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #f0f0f0}.status-header h2[data-v-a828da7e]{margin:0;font-size:16px;font-weight:500;color:#303133}.header-actions[data-v-a828da7e]{display:flex;align-items:center;gap:8px}.card-content[data-v-a828da7e]{padding:16px;overflow-y:auto;flex:1;display:flex;flex-direction:column}.status-box[data-v-a828da7e]{white-space:pre-wrap;font-family:monospace;background-color:#f8f9fa;padding:16px;border-radius:8px;margin-bottom:20px;max-height:200px;overflow-y:auto;border:1px solid #f0f0f0;font-size:14px;line-height:1.5}.file-list-container[data-v-a828da7e]{flex:1;overflow:hidden;display:flex;flex-direction:column;gap:16px;height:auto;min-height:100px}.file-group[data-v-a828da7e]{background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;margin-bottom:0;display:flex;flex-direction:column;transition:box-shadow .3s ease}.file-group[data-v-a828da7e]:hover{box-shadow:0 4px 12px #0000000d}.file-group[data-v-a828da7e]{flex:0 1 auto}.file-group[data-v-a828da7e]:last-child{margin-bottom:0;flex:1 1 auto}.file-group-header[data-v-a828da7e]{font-size:14px;font-weight:700;padding:10px 16px;background-color:#f0f2f5;color:#606266;border-bottom:1px solid #ebeef5;flex-shrink:0}.file-list[data-v-a828da7e]{overflow-y:auto;min-height:40px;max-height:200px;flex-grow:1;padding:0;margin:0;scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.file-list[data-v-a828da7e]::-webkit-scrollbar{width:6px;height:6px}.file-list[data-v-a828da7e]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.file-list[data-v-a828da7e]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.file-list[data-v-a828da7e]::-webkit-scrollbar-track{background-color:transparent}.file-list[data-v-a828da7e]:empty{display:none}.empty-file-container[data-v-a828da7e]{overflow-y:hidden!important;display:flex;flex-direction:column;align-items:stretch;flex:1}.empty-file-group[data-v-a828da7e]{padding:16px;text-align:center;color:#909399;font-size:13px;font-style:italic;display:flex;align-items:center;justify-content:center;min-height:50px;background-color:#f8f9fa;border-radius:4px;margin:8px}.file-item[data-v-a828da7e]{padding:10px 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #ebeef5;cursor:pointer;transition:all .2s ease}.file-item[data-v-a828da7e]:last-child{border-bottom:none}.file-item[data-v-a828da7e]:hover{background-color:#ecf5ff}.file-info[data-v-a828da7e]{display:flex;align-items:center;flex-grow:1;overflow:hidden;white-space:nowrap;gap:10px}.file-status-indicator[data-v-a828da7e]{width:8px;height:8px;border-radius:50%;background-color:#409eff;flex-shrink:0}.file-status-indicator.added[data-v-a828da7e]{background-color:#67c23a}.file-status-indicator.modified[data-v-a828da7e]{background-color:#409eff}.file-status-indicator.deleted[data-v-a828da7e]{background-color:#f56c6c}.file-status-indicator.untracked[data-v-a828da7e]{background-color:#e6a23c}.file-path-container[data-v-a828da7e]{display:flex;flex-direction:column;overflow:hidden}.file-name[data-v-a828da7e]{font-weight:500;color:#303133;overflow:hidden;text-overflow:ellipsis;line-height:1.4}.file-directory[data-v-a828da7e]{font-size:12px;color:#909399;max-width:200px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-actions[data-v-a828da7e]{display:flex;gap:8px;opacity:0;transition:opacity .2s ease}.file-item:hover .file-actions[data-v-a828da7e]{opacity:1}.empty-status[data-v-a828da7e]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;background-color:#f9f9f9;border-radius:8px;flex-grow:1}.empty-icon[data-v-a828da7e]{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#f0f2f5;border-radius:50%;margin-bottom:16px;font-size:28px;color:#909399;animation:pulse-a828da7e 2s infinite ease-in-out}@keyframes pulse-a828da7e{0%{transform:scale(1);opacity:.7}50%{transform:scale(1.05);opacity:1}to{transform:scale(1);opacity:.7}}.empty-text[data-v-a828da7e]{font-size:18px;font-weight:500;color:#606266;margin-bottom:8px}.empty-subtext[data-v-a828da7e]{font-size:14px;color:#909399;margin-bottom:20px}.status-box-wrap[data-v-a828da7e]{height:100%;display:flex;flex-direction:column;gap:16px}.branch-status-info[data-v-a828da7e]{margin-bottom:0;background-color:#f8f9fa;border-radius:8px;overflow:hidden;border:1px solid #ebeef5;transition:all .3s ease}.branch-status-info[data-v-a828da7e]:hover{box-shadow:0 4px 12px #0000000d}.branch-sync-status[data-v-a828da7e]{display:flex;align-items:center;padding:12px 16px;border-left:3px solid #e6a23c;margin-bottom:0;background-color:#fdf6ec}.sync-status-content[data-v-a828da7e]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;width:100%}.status-badges[data-v-a828da7e]{display:flex;flex-direction:column;gap:8px;width:100%}.status-badge[data-v-a828da7e]{display:flex;align-items:center;width:100%;border-radius:4px;padding:8px 12px;transition:all .3s ease}.status-badge.el-tag--warning[data-v-a828da7e]{background-color:#fdf6ec;border-color:#faecd8}.status-badge.el-tag--info[data-v-a828da7e]{background-color:#f4f4f5;border-color:#e9e9eb}.status-badge[data-v-a828da7e]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000000d}.badge-content[data-v-a828da7e]{display:flex;align-items:center;gap:8px;font-size:13px}.diff-dialog[data-v-a828da7e]{height:calc(100vh - 150px)}[data-v-a828da7e] .el-dialog__body{height:calc(100vh - 320px);overflow:auto;padding:0}.diff-content[data-v-a828da7e]{flex:1;overflow-y:auto;padding:16px 20px;background-color:#fafafa;height:100%}.diff-formatted[data-v-a828da7e]{font-family:JetBrains Mono,Fira Code,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;white-space:pre-wrap;padding-bottom:20px}.no-diff[data-v-a828da7e]{display:flex;align-items:center;justify-content:center;height:100%;color:#909399;font-size:14px}.file-navigation[data-v-a828da7e]{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-top:1px solid #ebeef5;background-color:#f9f9fb}.counter-tag[data-v-a828da7e]{font-family:monospace;font-size:14px;padding:6px 12px;min-width:80px;text-align:center}.nav-button[data-v-a828da7e]{min-width:120px;transition:all .3s ease}.nav-button[data-v-a828da7e]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.diff-formatted[data-v-a828da7e]::-webkit-scrollbar,.diff-content[data-v-a828da7e]::-webkit-scrollbar{width:6px;height:6px}.diff-formatted[data-v-a828da7e]::-webkit-scrollbar-thumb,.diff-content[data-v-a828da7e]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-formatted[data-v-a828da7e]::-webkit-scrollbar-thumb:hover,.diff-content[data-v-a828da7e]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-formatted[data-v-a828da7e]::-webkit-scrollbar-track,.diff-content[data-v-a828da7e]::-webkit-scrollbar-track{background-color:transparent}.diff-formatted[data-v-a828da7e],.diff-content[data-v-a828da7e]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}.auto-update-switch[data-v-a828da7e] .el-switch__core{transition:all .3s ease-in-out;box-shadow:0 2px 5px #0000001a}.auto-update-switch[data-v-a828da7e] .el-switch__core:hover{box-shadow:0 2px 8px #0003}.auto-update-switch.is-checked[data-v-a828da7e] .el-switch__core{box-shadow:0 2px 5px #67c23a4d}.auto-update-switch.is-checked[data-v-a828da7e] .el-switch__core:hover{box-shadow:0 2px 8px #67c23a80}.el-button[data-v-a828da7e]{transition:all .3s ease}.el-button[data-v-a828da7e]:not(:disabled):hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.diff-header{font-weight:700;background-color:#e6f1fc;padding:8px 12px;margin:10px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:monospace}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:monospace;display:block;margin:2px 0;background-color:#fafbfc}@keyframes snakeBorder-417b2868{0%,to{border-top:2px solid #409EFF;border-right:2px solid transparent;border-bottom:2px solid transparent;border-left:2px solid transparent}25%{border-top:2px solid #409EFF;border-right:2px solid #67C23A;border-bottom:2px solid transparent;border-left:2px solid transparent}50%{border-top:2px solid transparent;border-right:2px solid #67C23A;border-bottom:2px solid #409EFF;border-left:2px solid transparent}75%{border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid #409EFF;border-left:2px solid #67C23A}}@keyframes glowPulse-417b2868{0%,to{box-shadow:0 0 8px #409eff66}50%{box-shadow:0 0 12px #67c23a80}}.card[data-v-417b2868]{background-color:#fff;border-radius:8px;box-shadow:0 2px 10px #00000008;border:1px solid rgba(0,0,0,.03);height:100%;width:100%;display:flex;flex-direction:column;overflow:hidden;position:relative}.card-header[data-v-417b2868]{padding:8px 16px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.card-header h2[data-v-417b2868]{margin:0;font-size:16px;font-weight:500;color:#303133}.card-content[data-v-417b2868]{padding:15px;overflow-y:auto;flex:1}.layout-container[data-v-417b2868]{display:flex;flex-direction:column;gap:15px;height:100%}.commit-section[data-v-417b2868]{flex:1;min-width:0}.actions-section[data-v-417b2868]{width:100%;flex-shrink:0}.actions-section h3[data-v-417b2868]{margin-top:0;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #dcdfe6;font-size:16px;color:#303133;font-weight:500}.operations-wrapper[data-v-417b2868]{display:flex;gap:10px}.action-groups[data-v-417b2868]{display:flex;flex-direction:column;gap:12px}.action-group[data-v-417b2868]{background-color:#f9f9f9;border-radius:6px;padding:8px 10px;box-shadow:0 1px 3px #0000000d;border-left:3px solid #409EFF;flex:1}.action-group[data-v-417b2868]:nth-child(2){border-left-color:#e6a23c}.action-group[data-v-417b2868]:nth-child(3){border-left-color:#909399}.group-title[data-v-417b2868]{font-size:13px;font-weight:700;margin-bottom:8px;color:#606266;text-align:left;display:block;position:relative;padding-left:6px;border-bottom:1px solid rgba(0,0,0,.06);padding-bottom:6px}.group-buttons[data-v-417b2868]{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px;padding:0}.action-button[data-v-417b2868]{font-size:14px;font-weight:500;flex:1;min-width:100px;border-radius:4px;height:36px;padding:0 10px}.action-button[data-v-417b2868]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.action-button[data-v-417b2868]:active{transform:translateY(0)}.command-text[data-v-417b2868],.command-text-long[data-v-417b2868]{display:none}.standard-commit-form[data-v-417b2868]{display:flex;flex-direction:column;gap:15px;margin-bottom:15px}.standard-commit-header[data-v-417b2868]{display:flex;flex-direction:column;gap:10px;width:100%}.type-scope-container[data-v-417b2868]{display:flex;gap:10px;width:100%;margin-bottom:10px}.type-select[data-v-417b2868]{width:35%}.scope-wrapper[data-v-417b2868]{display:flex;align-items:center;gap:5px;width:65%}.description-container[data-v-417b2868]{display:flex;align-items:center;gap:5px;width:100%}.scope-input[data-v-417b2868],.description-input[data-v-417b2868]{flex-grow:1}.settings-button[data-v-417b2868]{flex-shrink:0}.preview-section[data-v-417b2868]{background-color:#f5f7fa;padding:10px;border-radius:4px}.preview-title[data-v-417b2868]{font-weight:700;margin-bottom:5px}.preview-content[data-v-417b2868]{white-space:pre-wrap;font-family:monospace;margin:0;padding:10px;background-color:#ebeef5;border-radius:4px}.template-container[data-v-417b2868]{display:flex;flex-direction:column;height:calc(85vh - 100px);overflow-y:auto;padding:5px}.template-form[data-v-417b2868]{margin-bottom:20px;background-color:#f8f9fa;padding:15px;border-radius:6px;border:1px solid #ebeef5}.template-form-buttons[data-v-417b2868]{display:flex;gap:10px;margin-top:12px;justify-content:flex-end}.template-input[data-v-417b2868]{flex-grow:1}.template-list[data-v-417b2868]{overflow-y:auto;height:100%}.template-list h3[data-v-417b2868]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.template-item[data-v-417b2868]{margin-bottom:10px;transition:all .2s ease;border:1px solid #ebeef5}.template-item[data-v-417b2868]:hover{background-color:#f5f7fa;transform:translateY(-2px);box-shadow:0 2px 12px #0000001a}.template-content[data-v-417b2868]{flex-grow:1;margin-right:10px;word-break:break-all;padding:5px 0;color:#303133;font-weight:500}.template-actions[data-v-417b2868]{display:flex;gap:8px;justify-content:flex-end;min-width:180px;flex-shrink:0}.options-row[data-v-417b2868]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.code-command[data-v-417b2868]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;overflow-x:auto;white-space:pre;font-size:14px}@media (min-width: 768px){.layout-container[data-v-417b2868]{flex-direction:row}.commit-section[data-v-417b2868]{flex:3}.actions-section[data-v-417b2868]{width:320px}.operations-wrapper[data-v-417b2868]{flex-direction:column}}.git-config-warning[data-v-417b2868]{width:100%}.config-command[data-v-417b2868]{background-color:#2d2d2d;color:#f8f8f2;font-family:Courier New,Courier,monospace;padding:10px;border-radius:4px;margin-top:10px;white-space:pre}@keyframes pushing-pulse-417b2868{0%{box-shadow:0 0 #67c23a66}70%{box-shadow:0 0 0 15px #67c23a00}to{box-shadow:0 0 #67c23a00}}@keyframes pushing-border-417b2868{0%{border-color:#67c23a}50%{border-color:#85ce61}to{border-color:#67c23a}}.card.is-pushing[data-v-417b2868]{animation:pushing-border-417b2868 1.5s infinite ease-in-out;box-shadow:0 4px 12px #0000001a;transition:all .3s ease}.push-button[data-v-417b2868]{background-color:#67c23a;border-color:#67c23a}.push-button[data-v-417b2868]:hover{background-color:#85ce61;border-color:#85ce61}.push-button.is-loading[data-v-417b2868],.push-button.is-loading[data-v-417b2868]:hover,.push-button.is-loading[data-v-417b2868]:focus{animation:pushing-pulse-417b2868 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}.el-button.push-button.is-loading .el-loading-spinner[data-v-417b2868]{color:#fff!important}@keyframes one-click-push-glow-417b2868{0%{box-shadow:0 0 5px #67c23a80}50%{box-shadow:0 0 20px #67c23acc}to{box-shadow:0 0 5px #67c23a80}}.action-button.one-click-push[data-v-417b2868]{position:relative;overflow:hidden}.action-button.one-click-push.is-loading[data-v-417b2868],.action-button.one-click-push.is-loading[data-v-417b2868]:hover{animation:one-click-push-glow-417b2868 1.5s infinite;background-color:#67c23a!important;border-color:#67c23a!important}@keyframes push-success-417b2868{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.push-success-indicator[data-v-417b2868]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#fff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;animation:push-success-417b2868 .5s ease-out;z-index:9999;width:200px;height:200px}.push-success-icon[data-v-417b2868]{font-size:64px;color:#67c23a;margin-bottom:16px;animation:bounce-417b2868 .8s ease-in-out}@keyframes bounce-417b2868{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-20px)}60%{transform:translateY(-10px)}}.push-success-text[data-v-417b2868]{font-size:20px;font-weight:700;color:#303133;text-align:center}.reset-button[data-v-417b2868]{background-color:#909399;border-color:#909399}.reset-button[data-v-417b2868]:hover{background-color:#a6a9ad;border-color:#a6a9ad}.el-button+.el-button[data-v-417b2868]{margin-left:0}.pushing-indicator[data-v-417b2868]{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:#409eff;border-radius:12px;padding:20px 30px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:9999;width:200px;height:200px;color:#fff}.form-bottom-actions[data-v-417b2868]{display:flex;flex-direction:column;gap:10px;margin-top:15px;padding:12px;background-color:#f5f7fa;border-radius:6px;box-shadow:0 1px 3px #0000000d;border-left:3px solid #67C23A}.button-row[data-v-417b2868]{display:flex;justify-content:space-between;gap:10px;width:100%}.button-row .el-button[data-v-417b2868]{flex:1;min-width:100px}.full-width-button[data-v-417b2868]{width:100%;margin-top:5px;font-weight:500;height:40px}.form-bottom-actions .el-button[data-v-417b2868]{font-weight:500;border-radius:4px;transition:all .3s}.form-bottom-actions .el-button[data-v-417b2868]:hover{transform:translateY(-1px);box-shadow:0 2px 5px #00000026}.pushing-text[data-v-417b2868]{font-size:20px;font-weight:700;text-align:center}.pushing-spinner[data-v-417b2868]{margin-bottom:16px}.circular[data-v-417b2868]{height:64px;width:64px;animation:pushing-rotate-417b2868 2s linear infinite}.path[data-v-417b2868]{stroke:#fff;stroke-width:4;stroke-linecap:round;stroke-dasharray:90,150;stroke-dashoffset:0;animation:pushing-dash-417b2868 1.5s ease-in-out infinite}@keyframes pushing-rotate-417b2868{to{transform:rotate(360deg)}}@keyframes pushing-dash-417b2868{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.message-template-container[data-v-417b2868]{display:flex;flex-direction:column;height:calc(100vh - 278px);overflow:hidden}.templates-container[data-v-417b2868]{display:flex;gap:20px;margin-top:15px;flex:1;overflow:hidden}.message-templates-list[data-v-417b2868]{flex:3;display:flex;flex-direction:column;border-right:1px solid #ebeef5;padding-right:15px;height:calc(100vh - 432px)}.message-templates-list h3[data-v-417b2868]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.current-default-message[data-v-417b2868]{flex:2;display:flex;flex-direction:column;gap:15px;padding-left:15px}.current-default-message h3[data-v-417b2868]{margin-top:0;margin-bottom:15px;font-size:16px;font-weight:500;color:#303133;padding-bottom:8px;border-bottom:1px solid #ebeef5}.templates-scroll-area[data-v-417b2868]{overflow-y:auto;padding-right:5px;flex:1}.default-message-card[data-v-417b2868]{margin-bottom:15px;box-shadow:0 2px 8px #00000014;border-radius:4px;transition:all .3s ease}.default-message-card[data-v-417b2868]:hover{box-shadow:0 4px 12px #0000001f}.default-message-content[data-v-417b2868]{padding:12px 15px;background-color:#f0f9eb;border-left:3px solid #67c23a;font-weight:500;word-break:break-all;min-height:60px;display:flex;align-items:center;border-radius:0 4px 4px 0;color:#303133}.message-help-text[data-v-417b2868]{background-color:#f8f9fa;border-radius:4px;padding:15px;font-size:14px;color:#606266;border-left:3px solid #909399;margin-top:auto;box-shadow:0 2px 8px #0000000d}.message-help-text h4[data-v-417b2868]{margin-top:0;margin-bottom:10px;color:#303133;font-size:15px}.message-help-text p[data-v-417b2868]{margin:8px 0;line-height:1.5}.advanced-options-toggle[data-v-417b2868]{display:flex;align-items:center;justify-content:center;padding:8px 0;background-color:#f5f7fa;border-radius:4px;cursor:pointer;transition:all .3s ease;-webkit-user-select:none;user-select:none}.advanced-options-toggle[data-v-417b2868]:hover{background-color:#ebeef5;color:#409eff}.toggle-icon[data-v-417b2868]{margin-left:8px;transition:transform .3s ease}.toggle-icon.is-active[data-v-417b2868]{transform:rotate(180deg)}.advanced-fields[data-v-417b2868]{margin-top:10px;display:flex;flex-direction:column;gap:15px;animation:fade-in-417b2868 .3s ease-in-out}@keyframes fade-in-417b2868{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.git-cmd-tooltip{font-family:Consolas,Courier New,monospace!important;font-size:13px!important;font-weight:500!important;color:#303133!important;background-color:#f5f7fa!important;border:1px solid #dcdfe6!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 12px #0000001a!important}.template-dialog .el-dialog__header,.message-template-dialog .el-dialog__header{padding:15px 20px;margin-right:0;border-bottom:1px solid #ebeef5;background-color:#f8f9fa}.template-dialog .el-dialog__title,.message-template-dialog .el-dialog__title{font-size:16px;font-weight:600;color:#303133}.template-dialog .el-dialog__body,.message-template-dialog .el-dialog__body{padding:20px}.template-dialog .el-dialog__headerbtn,.message-template-dialog .el-dialog__headerbtn{top:15px;right:20px}.template-dialog .el-input__inner,.message-template-dialog .el-input__inner{height:40px;line-height:40px}.template-dialog .el-button,.message-template-dialog .el-button{border-radius:4px;font-weight:500}.template-dialog .el-card,.message-template-dialog .el-card{border-radius:4px;overflow:hidden}.template-dialog .el-card__body,.message-template-dialog .el-card__body{padding:12px 15px}.template-dialog .el-empty__image,.message-template-dialog .el-empty__image{width:80px;height:80px}.card[data-v-a24f735a]{background-color:#fff;border-radius:12px;box-shadow:0 2px 12px #0000000a;height:100%;width:100%;display:flex;flex-direction:column;border:1px solid rgba(0,0,0,.03);overflow:hidden;transition:all .3s ease}.log-header[data-v-a24f735a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:0;padding:12px 16px;background-color:#fff;border-bottom:1px solid #f0f0f0;position:sticky;top:0;z-index:100;flex-shrink:0}.header-left[data-v-a24f735a]{display:flex;align-items:center;gap:12px}.log-header h2[data-v-a24f735a]{margin:0;font-size:16px;font-weight:500}.log-actions[data-v-a24f735a]{display:flex;gap:12px}.action-button[data-v-a24f735a]{transition:all .3s ease;border-radius:8px;border:1px solid transparent;box-shadow:0 2px 4px #0000001a;font-weight:500;padding:8px 16px;min-width:120px;display:flex;align-items:center;justify-content:center;gap:8px}.action-button[data-v-a24f735a]:hover{transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.filter-button[data-v-a24f735a]{background:linear-gradient(135deg,#e6a23c,#f0c78a);color:#fff;min-width:90px}.filter-button.active-filter[data-v-a24f735a]{background:linear-gradient(135deg,#d48806,#e6a23c)}.filter-button .filter-badge[data-v-a24f735a] .el-badge__content{background-color:#f56c6c;color:#fff;border:2px solid white;box-shadow:0 0 0 1px #e6a23c}.view-mode-button[data-v-a24f735a]{background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff}.view-mode-button.active-view[data-v-a24f735a]{background:linear-gradient(135deg,#1890ff,#096dd9)}.commit-display-button[data-v-a24f735a]{background:linear-gradient(135deg,#67c23a,#85ce61);color:#fff}.commit-display-button.active-commits[data-v-a24f735a]{background:linear-gradient(135deg,#52c41a,#389e0d)}.refresh-button[data-v-a24f735a]{background:linear-gradient(135deg,#909399,#c0c4cc);color:#fff;min-width:unset;padding:8px;border-radius:50%;width:36px;height:36px}.refresh-button[data-v-a24f735a]:hover{background:linear-gradient(135deg,#606266,#909399)}.refresh-button-animated[data-v-a24f735a]{animation:spin-a24f735a 1s linear}@keyframes spin-a24f735a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.content-area[data-v-a24f735a]{padding:10px 16px;flex:1;min-height:100px;height:calc(100% - 52px);display:flex;flex-direction:column}.content-area-content[data-v-a24f735a]{height:100%}.content-area.with-filter[data-v-a24f735a]{height:calc(100% - 112px);padding-top:0}.content-area>div[data-v-a24f735a]{flex:1;display:flex;flex-direction:column}.el-table[data-v-a24f735a]{--el-table-border-color: #f0f0f0;--el-table-header-bg-color: #f8f9fa;border-radius:8px;overflow:hidden}[data-v-a24f735a] .el-table__header-wrapper{background-color:#f8f9fa}[data-v-a24f735a] .el-table__header th{background-color:#f8f9fa;color:#606266;font-weight:600;height:48px}[data-v-a24f735a] .el-table__row{transition:all .2s ease}[data-v-a24f735a] .el-table__row:hover{background-color:#ecf5ff!important}[data-v-a24f735a] .el-table--striped .el-table__row--striped{background-color:#fafafa}[data-v-a24f735a] .el-table__cell{padding:8px 0}.branch-container[data-v-a24f735a]{display:flex;flex-wrap:wrap;gap:6px}.branch-tag[data-v-a24f735a]{margin-right:0;border-radius:4px;transition:all .2s ease}.branch-tag[data-v-a24f735a]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.commit-count[data-v-a24f735a]{margin-bottom:12px;font-size:14px;color:#606266;text-align:right}.graph-view[data-v-a24f735a]{width:100%;flex:1;display:flex;flex-direction:column;overflow-y:auto;padding:0 8px}.graph-container[data-v-a24f735a]{width:100%;flex:1;min-height:500px;border:1px solid #ebeef5;border-radius:8px;padding:16px;background-color:#fff;position:relative;box-shadow:0 2px 8px #00000008}.graph-container svg[data-v-a24f735a]{transform-origin:top left;transition:transform .2s ease}.graph-controls[data-v-a24f735a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;background-color:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #ebeef5}.zoom-controls[data-v-a24f735a]{display:flex;gap:12px;align-items:center}.zoom-slider[data-v-a24f735a]{width:200px}.scale-info[data-v-a24f735a]{font-size:14px;color:#606266;background-color:#fff;padding:4px 10px;border-radius:4px;border:1px solid #ebeef5}.refresh-notification[data-v-a24f735a]{background-color:#f0f9eb;color:#67c23a;padding:10px 15px;border-radius:8px;font-size:14px;border-left:4px solid #67c23a;animation:fadeOut-a24f735a 2s forwards;position:fixed;top:20px;right:20px;z-index:9999;box-shadow:0 4px 12px #0000001a;max-width:300px;text-align:center}@keyframes fadeOut-a24f735a{0%{opacity:0;transform:translateY(-20px)}20%{opacity:1;transform:translateY(0)}80%{opacity:1}to{opacity:0}}.author-name[data-v-a24f735a]{cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;max-width:100%;font-weight:500}.commit-hash[data-v-a24f735a]{cursor:pointer;color:#409eff;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-weight:500;border-radius:4px;padding:2px 4px;background-color:#ecf5ff;transition:all .2s ease}.commit-hash[data-v-a24f735a]:hover{text-decoration:none;background-color:#d9ecff;box-shadow:0 2px 4px #0000000d}.commit-detail-container[data-v-a24f735a]{display:flex;flex-direction:column;gap:20px}.commit-info[data-v-a24f735a]{padding:16px;background-color:#f5f7fa;border-radius:8px;font-size:14px;display:flex;flex-direction:column;gap:16px}.commit-info-header[data-v-a24f735a]{display:flex;flex-wrap:wrap;gap:16px;align-items:center;background-color:#fff;padding:16px;border-radius:8px;border:1px solid #e4e7ed}.info-item[data-v-a24f735a]{display:flex;align-items:center;gap:8px}.item-label[data-v-a24f735a]{font-weight:700;color:#606266;white-space:nowrap}.item-value[data-v-a24f735a]{color:#333;word-break:break-all}.commit-message-container[data-v-a24f735a]{display:flex;flex-direction:column;gap:8px}.message-label[data-v-a24f735a]{font-weight:700;color:#606266}.message-content[data-v-a24f735a]{background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:pre-wrap;line-height:1.6;border:1px solid #e4e7ed;border-left:4px solid #409eff}.commit-files-diff[data-v-a24f735a]{margin-top:8px;display:flex;gap:20px;height:60vh}.files-list[data-v-a24f735a]{width:25%;overflow-y:auto;background-color:#f5f7fa;border-radius:8px;padding:16px}.files-list h3[data-v-a24f735a]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.files-list ul[data-v-a24f735a]{list-style:none;padding:0;margin:0}.files-list li[data-v-a24f735a]{padding:10px 12px;cursor:pointer;border-radius:4px;margin-bottom:6px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;transition:all .2s ease;border:1px solid transparent}.files-list li[data-v-a24f735a]:hover{background-color:#ecf5ff;border-color:#d9ecff}.files-list li.active-file[data-v-a24f735a]{background-color:#409eff;color:#fff;box-shadow:0 2px 6px #409eff4d}.file-diff[data-v-a24f735a]{flex:1;display:flex;flex-direction:column;background-color:#f5f7fa;border-radius:8px;padding:16px;overflow:hidden}.file-diff h3[data-v-a24f735a]{margin-top:0;padding-bottom:12px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:500}.diff-content[data-v-a24f735a]{flex:1;overflow-y:auto;background-color:#fff;padding:16px;border-radius:8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:13px;line-height:1.6;border:1px solid #ebeef5}.diff-content[data-v-a24f735a]::-webkit-scrollbar,.files-list[data-v-a24f735a]::-webkit-scrollbar{width:6px;height:6px}.diff-content[data-v-a24f735a]::-webkit-scrollbar-thumb,.files-list[data-v-a24f735a]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.diff-content[data-v-a24f735a]::-webkit-scrollbar-thumb:hover,.files-list[data-v-a24f735a]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.diff-content[data-v-a24f735a]::-webkit-scrollbar-track,.files-list[data-v-a24f735a]::-webkit-scrollbar-track{background-color:transparent}.diff-content[data-v-a24f735a],.files-list[data-v-a24f735a]{scrollbar-width:thin;scrollbar-color:rgba(144,147,153,.3) transparent}[data-v-a24f735a] .commit-detail-dialog{--el-dialog-margin-top: 7vh}[data-v-a24f735a] .commit-detail-dialog .el-dialog__body{padding:16px}.filter-panel-header[data-v-a24f735a]{background-color:#f5f7fa;padding:12px 16px;border-bottom:1px solid #e4e7ed;position:sticky;top:36px;z-index:99;transition:all .3s ease;flex-shrink:0;margin-bottom:10px;box-shadow:0 2px 8px #0000000d;border-radius:0 0 8px 8px}.filter-panel-header .filter-form[data-v-a24f735a]{display:flex;align-items:center;gap:12px;flex-wrap:nowrap;justify-content:space-between}.filter-panel-header .filter-item[data-v-a24f735a]{margin-right:0;flex:1;min-width:0}.filter-panel-header .filter-input[data-v-a24f735a]{width:100%}.filter-panel-header .filter-input.date-range[data-v-a24f735a]{width:100%;max-width:280px}.compact-label[data-v-a24f735a]{color:#909399;font-size:12px;margin-right:6px;white-space:nowrap;font-weight:700;border-right:1px solid #dcdfe6;padding-right:8px}.filter-action-button[data-v-a24f735a]{padding:8px 16px;border-radius:6px;transition:all .3s;min-width:70px;font-weight:500}.filter-action-button[data-v-a24f735a]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.filter-actions[data-v-a24f735a]{display:flex;align-items:center;gap:10px;white-space:nowrap;flex-shrink:0}.table-view-container[data-v-a24f735a]{display:flex;flex-direction:column;flex:1;min-height:400px}.log-table[data-v-a24f735a]{width:100%;height:100%;min-height:300px;flex:1}.load-more-container[data-v-a24f735a]{display:flex;flex-direction:column;align-items:center;padding:8px 0;border-top:1px dashed #ebeef5;gap:8px}.pagination-info[data-v-a24f735a]{font-size:13px;color:#909399;margin-bottom:4px}.loading-more[data-v-a24f735a]{display:flex;align-items:center;color:#909399;font-size:13px;gap:8px}.loading-spinner[data-v-a24f735a]{width:16px;height:16px;border:2px solid #dcdfe6;border-top-color:#409eff;border-radius:50%;animation:spinner-a24f735a 1s linear infinite}@keyframes spinner-a24f735a{to{transform:rotate(360deg)}}.load-more-button[data-v-a24f735a]{cursor:pointer;color:#409eff;font-size:13px;padding:6px 16px;border:1px solid #d9ecff;background-color:#ecf5ff;border-radius:4px;transition:all .3s;font-weight:500}.no-more-data[data-v-a24f735a]{color:#909399;font-size:13px;font-style:italic;display:flex;flex-direction:column;align-items:center}.total-loaded[data-v-a24f735a]{font-size:12px;margin-top:4px;color:#c0c4cc}.context-menu[data-v-a24f735a]{position:fixed;background:#fff;border:1px solid #dcdfe6;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:6px 0;z-index:3000;min-width:200px;animation:fadeIn-a24f735a .15s ease-out}@keyframes fadeIn-a24f735a{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.context-menu-item[data-v-a24f735a]{padding:10px 16px;cursor:pointer;font-size:14px;display:flex;align-items:center;transition:all .2s ease;color:#606266}.context-menu-item[data-v-a24f735a]:hover{background-color:#f5f7fa;color:#409eff}.context-menu-item i[data-v-a24f735a]{margin-right:10px;font-size:16px}.branch-graph-column[data-v-a24f735a]{padding:0!important;overflow:visible}.branch-graph-cell[data-v-a24f735a]{height:40px;width:100%;position:relative;padding:0;margin:0}.branch-graph-column .cell[data-v-a24f735a]{padding:0!important;height:100%;margin:0;overflow:visible}.el-table .branch-graph-column[data-v-a24f735a]{width:60px!important;padding:0!important}[data-v-a24f735a] .el-table .el-table__cell{padding:0!important}[data-v-a24f735a] .branch-graph-cell svg{display:block!important;width:100%!important;height:100%!important;overflow:visible!important;z-index:10!important}[data-v-a24f735a] .branch-graph-cell svg line,[data-v-a24f735a] .branch-graph-cell svg path{stroke-width:2!important}[data-v-a24f735a] .branch-graph-cell svg circle{r:6!important;stroke-width:2!important}.branch-graph-column[data-v-a24f735a]{min-width:60px!important;width:60px!important}.branch-graph-cell[data-v-a24f735a]{position:relative!important;overflow:visible!important;z-index:1!important}[data-v-a24f735a] .el-table--border .el-table__inner-wrapper tr{border:none!important}[data-v-a24f735a] .el-table--border .el-table__inner-wrapper td{border-right:none!important;border-bottom:none!important}[data-v-a24f735a] .el-table--border .el-table__inner-wrapper th{border-right:none!important}[data-v-a24f735a] .el-table--border,[data-v-a24f735a] .el-table--border .el-table__inner-wrapper{border:none!important}[data-v-a24f735a] .el-table--border:after,[data-v-a24f735a] .el-table--border:before,[data-v-a24f735a] .el-table__inner-wrapper:after,[data-v-a24f735a] .el-table__inner-wrapper:before{display:none!important}[data-v-a24f735a] .el-table tr{background-color:transparent!important}[data-v-a24f735a] .el-table--striped .el-table__body tr.el-table__row--striped td{background-color:#00000005!important}.el-table .el-table__cell .cell{word-break:break-all}.diff-header{font-weight:700;background-color:#e6f1fc;padding:10px 16px;margin:12px 0;border-radius:6px;color:#0366d6;border-bottom:1px solid #c8e1ff}.diff-old-file,.diff-new-file{color:#586069;padding:4px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-old-file{color:#cb2431}.diff-new-file{color:#22863a}.diff-hunk-header{color:#6f42c1;background-color:#f1f8ff;padding:4px 8px;margin:8px 0;border-radius:4px;font-family:JetBrains Mono,Fira Code,Consolas,monospace}.diff-added{background-color:#e6ffed;color:#22863a;padding:2px 8px;border-left:4px solid #22863a;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-removed{background-color:#ffeef0;color:#cb2431;padding:2px 8px;border-left:4px solid #cb2431;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0}.diff-context{color:#444;padding:2px 8px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;display:block;margin:2px 0;background-color:#fafbfc}.load-more-button:hover{background-color:#d9ecff;box-shadow:0 2px 6px #409eff26;transform:translateY(-1px)}body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f5f5f5;overflow:hidden;height:100vh}.main-container{position:fixed;top:60px;bottom:60px;left:0;right:0;padding:10px;overflow:hidden}.grid-layout{display:grid;grid-template-columns:2fr 8px 3fr;grid-template-rows:1fr 8px 1fr;grid-template-areas:"git-status v-resizer commit-form" "h-resizer h-resizer h-resizer" "log-list log-list log-list";gap:10px;height:100%}.git-status-panel{grid-area:git-status;overflow:hidden;max-height:100%;padding:0}.commit-form-panel{grid-area:commit-form;overflow:hidden;max-height:100%;padding:0}.log-list-panel{grid-area:log-list;overflow:hidden;max-height:100%;padding:0}.card{background-color:#fff;border-radius:8px;box-shadow:0 4px 12px #0000000d;border:1px solid rgba(0,0,0,.03);height:100%;overflow:hidden;display:flex;flex-direction:column}.main-header{background-color:#24292e;color:#fff;padding:0 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;top:0;left:0;right:0;z-index:1000;box-shadow:0 2px 10px #0003;height:60px;box-sizing:border-box}.header-left{display:flex;align-items:center;gap:10px;min-width:220px;flex:1}.logo{height:32px;width:auto}h1{margin:0;font-size:24px}.header-info{display:flex;align-items:center;gap:10px;justify-content:flex-end}#user-info{display:flex;align-items:center;background-color:#282c34b3;padding:6px 10px;border-radius:4px;border:1px solid rgba(255,255,255,.15);margin-right:10px;flex-shrink:0}.directory-selector{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:6px 10px;border:1px solid rgba(255,255,255,.15);box-shadow:0 2px 8px #00000026;flex-shrink:0}.directory-display{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:500px}.branch-label,.user-label,.user-name{font-weight:700;margin-right:5px}.user-email{color:#e0e0e0}.branch-name{font-family:monospace}.status-box{background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px;padding:15px;white-space:pre-wrap;font-family:monospace;overflow-y:auto}.tips{margin-top:20px;padding:15px;background-color:#f5f7fa;border-radius:5px;border-left:4px solid #409eff}.tips h3{margin-top:0;font-size:16px;margin-bottom:10px}.code-block{background-color:#2d2d2d;color:#f8f8f2;font-family:monospace;padding:10px 15px;border-radius:4px;margin-bottom:10px}.loading-container{display:flex;justify-content:center;align-items:center;height:100%}.loading-card{width:300px;text-align:center;padding:30px}.loading-spinner{font-size:48px;margin-bottom:20px;color:#409eff}.loading-text{font-size:18px;color:#606266}.user-settings-btn{margin-left:10px}.user-warning{color:#e6a23c;font-weight:700}.main-footer{background-color:#24292e;color:#fff;padding:10px 20px;display:flex;justify-content:space-between;align-items:center;position:fixed;bottom:0;left:0;right:0;z-index:100;box-shadow:0 -2px 10px #0000001a;height:60px;box-sizing:border-box}@media (max-width: 768px){.grid-layout{grid-template-columns:1fr;grid-template-rows:auto auto auto auto auto;grid-template-areas:"git-status" "v-resizer" "commit-form" "h-resizer" "log-list";gap:10px}.vertical-resizer{height:10px;cursor:row-resize}.vertical-resizer:after{width:30px;height:4px}.git-status-panel,.commit-form-panel,.log-list-panel{padding:0;max-height:none}.git-status-panel,.commit-form-panel{max-height:30vh}.log-list-panel{max-height:40vh}}.logo[data-v-98ed32bc]{will-change:filter;transition:filter .3s}.logo[data-v-98ed32bc]:hover{filter:drop-shadow(0 0 2em #42b883aa)}.branch-info[data-v-98ed32bc]{display:flex;align-items:center;gap:10px}.branch-wrapper[data-v-98ed32bc]{display:flex;align-items:center;background-color:#ffffff26;border-radius:4px;padding:8px 12px;box-shadow:0 2px 4px #0003;transition:all .3s}.branch-wrapper[data-v-98ed32bc]:hover{background-color:#fff3}.branch-label[data-v-98ed32bc]{font-weight:700;margin-right:10px;color:#fff}.branch-select[data-v-98ed32bc]{width:200px;margin-right:10px}.create-branch-btn[data-v-98ed32bc]{background-color:#2ea44f;border-color:#2ea44f;transition:all .3s;box-shadow:0 2px 4px #0003}.create-branch-btn[data-v-98ed32bc]:hover{background-color:#3bbc63;border-color:#3bbc63;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.footer-right[data-v-98ed32bc]{display:flex;align-items:center;gap:10px;color:#ffffffe6;font-size:13px;background-color:#ffffff1a;padding:8px 12px;border-radius:4px;box-shadow:0 2px 4px #0003}.repo-url-label[data-v-98ed32bc]{font-weight:700;margin-right:8px;color:#fff}.repo-url[data-v-98ed32bc]{color:#e6f7ff;font-family:monospace;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-url-btn[data-v-98ed32bc]{transition:all .3s;background-color:#1890ff;border-color:#1890ff;box-shadow:0 2px 4px #0003}.copy-url-btn[data-v-98ed32bc]:hover{background-color:#40a9ff;border-color:#40a9ff;transform:translateY(-2px);box-shadow:0 4px 8px #0003}.vertical-resizer[data-v-98ed32bc]{grid-area:v-resizer;background-color:#e8e8e8;cursor:col-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:8px;box-shadow:0 0 3px #0000001a}.vertical-resizer[data-v-98ed32bc]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:4px;height:50px;background-color:#a0a0a0;border-radius:4px;transition:background-color .2s,width .2s,box-shadow .2s}.vertical-resizer[data-v-98ed32bc]:hover,.vertical-resizer.active[data-v-98ed32bc]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.vertical-resizer[data-v-98ed32bc]:hover:after,.vertical-resizer.active[data-v-98ed32bc]:after{background-color:#409eff;width:6px;box-shadow:0 0 8px #409eff99}.horizontal-resizer[data-v-98ed32bc]{grid-area:h-resizer;background-color:#e8e8e8;cursor:row-resize;transition:background-color .2s,box-shadow .2s;position:relative;z-index:10;border-radius:8px;box-shadow:0 0 3px #0000001a}.horizontal-resizer[data-v-98ed32bc]:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:50px;height:4px;background-color:#a0a0a0;border-radius:4px;transition:background-color .2s,height .2s,box-shadow .2s}.horizontal-resizer[data-v-98ed32bc]:hover,.horizontal-resizer.active[data-v-98ed32bc]{background-color:#d0d0d0;box-shadow:0 0 5px #0003}.horizontal-resizer[data-v-98ed32bc]:hover:after,.horizontal-resizer.active[data-v-98ed32bc]:after{background-color:#409eff;height:6px;box-shadow:0 0 8px #409eff99}.directory-selector[data-v-98ed32bc]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;background-color:#282c34b3;border-radius:4px;padding:8px 12px;margin-bottom:8px;border:1px solid rgba(255,255,255,.2);box-shadow:0 2px 8px #0003}.directory-display[data-v-98ed32bc]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.directory-path[data-v-98ed32bc]{font-family:monospace;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;background-color:#0003;padding:4px 8px;border-radius:3px;border-left:3px solid #409EFF;flex:1;min-width:0;max-width:350px}.directory-actions[data-v-98ed32bc]{display:flex;gap:4px;margin-left:8px}.dir-button[data-v-98ed32bc]{padding:6px;height:28px;width:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#409eff,#53a8ff);color:#fff;border:none;box-shadow:0 2px 4px #0003;transition:all .3s}.dir-button[data-v-98ed32bc]:hover{transform:translateY(-1px);box-shadow:0 3px 6px #0000004d;background:linear-gradient(135deg,#53a8ff,#66b1ff)}.dir-button.el-button--info[data-v-98ed32bc]{background:linear-gradient(135deg,#909399,#a6a9ad)}.dir-button.el-button--info[data-v-98ed32bc]:hover{background:linear-gradient(135deg,#a6a9ad,#c0c4cc)}.directory-icon[data-v-98ed32bc]{display:flex;justify-content:center;align-items:center;width:24px;height:24px;border-radius:3px;background-color:#409eff1a;color:#409eff;margin-right:2px}.directory-input-group[data-v-98ed32bc]{display:flex;align-items:center;gap:8px;width:100%}.recent-directories[data-v-98ed32bc]{display:flex;flex-wrap:wrap;gap:4px}.recent-dir-tag[data-v-98ed32bc]{cursor:pointer;background-color:#e6f7ff;border:1px solid #91d5ff;padding:4px 8px;border-radius:4px}.directory-browser[data-v-98ed32bc]{width:100%;height:400px;overflow:auto}.current-path[data-v-98ed32bc]{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label[data-v-98ed32bc]{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value[data-v-98ed32bc]{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list[data-v-98ed32bc]{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item[data-v-98ed32bc]{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item[data-v-98ed32bc]:hover{background-color:#ecf5ff}.directory-item[data-v-98ed32bc]:last-child{border-bottom:none}.parent-dir[data-v-98ed32bc]{background-color:#f5f7fa;font-weight:500}.dir-icon[data-v-98ed32bc]{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name[data-v-98ed32bc]{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon[data-v-98ed32bc]{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon[data-v-98ed32bc]{transform:scale(1.1)}[data-v-98ed32bc] .directory-browser-dialog{border-radius:8px;overflow:hidden}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}[data-v-98ed32bc] .directory-browser-dialog .el-message-box__content{padding:20px}.el-message-box__message{width:100%}.directory-browser-dialog{border-radius:8px;overflow:hidden}.directory-browser-dialog .el-message-box__header{background-color:#f5f7fa;padding:15px 20px;border-bottom:1px solid #e4e7ed;position:relative}.directory-browser-dialog .el-message-box__title{color:#409eff;font-weight:500;font-size:18px}.directory-browser-dialog .el-message-box__headerbtn{position:absolute;top:15px;right:15px;width:24px;height:24px;border-radius:50%;background-color:#0000000d;transition:all .3s;display:flex;align-items:center;justify-content:center}.directory-browser-dialog .el-message-box__headerbtn:hover{background-color:#0000001a;transform:rotate(90deg)}.directory-browser-dialog .el-message-box__headerbtn .el-message-box__close{color:#606266;font-weight:700;font-size:16px}.directory-browser-dialog .el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.directory-browser-dialog .el-message-box__content{padding:20px}.directory-browser-dialog .el-message-box__btns{padding:10px 20px 15px;border-top:1px solid #e4e7ed}.directory-browser{width:100%;height:400px;overflow:auto}.current-path{padding:10px;background-color:#f5f7fa;border-radius:4px;margin-bottom:10px;border:1px solid #e4e7ed;display:flex;align-items:center;width:100%;box-sizing:border-box}.path-label{font-weight:700;margin-right:5px;white-space:nowrap;flex-shrink:0}.path-value{font-family:monospace;word-break:break-all;flex:1;min-width:0;background-color:#fff;padding:5px 8px;border-radius:3px;border:1px solid #dcdfe6;box-shadow:inset 0 1px 2px #0000000d;width:100%}.directory-list{list-style:none!important;padding:0;margin:0;border:1px solid #e4e7ed;border-radius:4px;max-height:300px;overflow-y:auto;background-color:#fff;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.directory-item{padding:10px 12px;border-bottom:1px solid #ebeef5;cursor:pointer;display:flex;align-items:center;transition:all .2s ease;position:relative;width:100%;box-sizing:border-box;list-style:none!important}.directory-item:hover{background-color:#ecf5ff}.directory-item:last-child{border-bottom:none}.parent-dir{background-color:#f5f7fa;font-weight:500}.dir-icon{margin-right:12px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0}.dir-name{display:flex;align-items:center;font-size:14px;line-height:1.4}.folder-icon{filter:drop-shadow(0 1px 2px rgba(0,0,0,.1));transition:all .2s ease}.directory-item:hover .folder-icon{transform:scale(1.1)}*{margin:0;padding:0}div{box-sizing:border-box}
@@ -0,0 +1,22 @@
1
+ import{d as Ut,r as c,o as ft,a as ls,E as r,l as os,b as yt,c as Ve,w as Qe,e as w,f,F as Te,g as e,h as s,i as Rt,u as o,j as l,k as Ot,m as Et,n as Ft,p as Oe,q as Nt,s as It,t as ns,v as W,x as ae,y as wt,z as b,A as _t,B as is,C as A,D as Ht,G as De,H as Xt,I as bt,J as ct,K as Wt,L as rs,M as Dt,N as nt,O as qe,P as Bt,Q as et,T as Gt,R as Jt,S as Mt,U as ut,V as rt,W as xt,X as Lt,Y as gt,Z as ht,_ as qt,$ as vt,a0 as cs,a1 as Yt,a2 as Zt,a3 as us,a4 as Ze,a5 as ds,a6 as fs,a7 as ps,a8 as jt,a9 as vs,aa as ms,ab as gs,ac as hs,ad as ys,ae as ws,af as _s,ag as bs,ah as at,ai as $s,aj as Cs,ak as Pt,al as ks,am as Ss,an as Ts,ao as ze,ap as xs,aq as Ls}from"./vendor-lzd7uK7e.js";(function(){const m=document.createElement("link").relList;if(m&&m.supports&&m.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))p(g);new MutationObserver(g=>{for(const U of g)if(U.type==="childList")for(const R of U.addedNodes)R.tagName==="LINK"&&R.rel==="modulepreload"&&p(R)}).observe(document,{childList:!0,subtree:!0});function x(g){const U={};return g.integrity&&(U.integrity=g.integrity),g.referrerPolicy&&(U.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?U.credentials="include":g.crossOrigin==="anonymous"?U.credentials="omit":U.credentials="same-origin",U}function p(g){if(g.ep)return;g.ep=!0;const U=x(g);fetch(g.href,U)}})();const At=300,dt=Ut("git",()=>{const ke=c(""),m=c([]),x=c(""),p=c(""),g=c(!1),U=c(!1),R=c(!1),j=c(0),I=c(""),ee=c(!1),z=c(!1),Z=c(!1),V=c(!1),k=c(0),H=c(0),X=c(!1),J=c(""),F=c(0),me=c(0);let S=null;const ne=c(!0),se=c([]),K=c({staged:[],unstaged:[],untracked:[]}),ie=c(""),de=c([]),L=c(!1),h=c(!1),E=c(!1),B=c(!1),N=c(!1);function ye(){ke.value="",m.value=[],x.value="",p.value="",g.value=!1,U.value=!1,R.value=!1,j.value=0,k.value=0,H.value=0,X.value=!1,J.value="",F.value=0,me.value=0,z.value=!1,Z.value=!1,V.value=!1,I.value="",ee.value=!1,se.value=[],K.value={staged:[],unstaged:[],untracked:[]},ie.value="",de.value=[],L.value=!1,h.value=!1,E.value=!1,B.value=!1,N.value=!1}async function re(){if(R.value)try{console.log("获取分支状态...");const d=await(await fetch("/api/branch-status")).json();d&&(k.value=d.ahead||0,H.value=d.behind||0,X.value=d.hasUpstream||!1,J.value=d.upstreamBranch||"",F.value=Date.now(),console.log(`分支状态更新:领先 ${k.value} 个提交,落后 ${H.value} 个提交,上游分支:${X.value?J.value:"无"}`))}catch(v){console.error("获取分支状态失败:",v),k.value=0,H.value=0,X.value=!1,J.value=""}}async function Ee(){const v=Date.now();if(v-j.value<1e3)return console.log("使用缓存的Git仓库状态:",R.value?"是":"不是"),R.value;try{const _=await(await fetch("/api/current_directory")).json();return R.value=_.isGitRepo===!0,j.value=v,console.log(`当前目录${R.value?"是":"不是"}Git仓库`),R.value}catch(d){return console.error("检查Git仓库状态失败:",d),R.value=!1,j.value=v,!1}}async function Le(){try{const d=await(await fetch("/api/branch")).json();d.branch&&(ke.value=d.branch)}catch(v){console.error("获取分支信息失败:",v)}}async function $(){if(R.value)try{console.log("获取所有分支...");const d=await(await fetch("/api/branches")).json();d.branches&&Array.isArray(d.branches)&&(m.value=d.branches,me.value=Date.now(),console.log(`获取到${d.branches.length}个分支`))}catch(v){console.error("获取所有分支信息失败:",v)}}async function we(v){console.log("切换到分支:",v);try{g.value=!0;const _=await(await fetch("/api/checkout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:v})})).json();return _.success?(r({message:`已切换到分支: ${v}`,type:"success"}),await Le(),await re(),!0):(r({message:`切换分支失败: ${_.error}`,type:"error"}),!1)}catch(d){return r({message:`切换分支失败: ${d.message}`,type:"error"}),!1}finally{g.value=!1}}async function ge(){try{const d=await(await fetch("/api/user-info")).json();d.name&&d.email&&(x.value=d.name,p.value=d.email)}catch(v){console.error("获取用户信息失败:",v)}}async function Ae(v,d){if(!v.trim())return r({message:"分支名称不能为空",type:"warning"}),!1;try{U.value=!0;const le=await(await fetch("/api/create-branch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({newBranchName:v,baseBranch:d||ke.value})})).json();return le.success?(r({message:`已创建并切换到分支: ${v}`,type:"success"}),await Le(),await re(),await $(),!0):(r({message:`创建分支失败: ${le.error}`,type:"error"}),!1)}catch(_){return r({message:`创建分支失败: ${_.message}`,type:"error"}),!1}finally{U.value=!1}}async function Fe(){try{const d=await(await fetch("/api/clear-user-config",{method:"POST"})).json();return d.success?(x.value="",p.value="",r({message:"已清除Git用户配置",type:"success"}),!0):(r({message:`清除配置失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`清除配置失败: ${v.message}`,type:"error"}),!1}}async function Ne(v,d){try{const le=await(await fetch("/api/restore-user-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:v,email:d})})).json();return le.success?(x.value=v,p.value=d,r({message:"已恢复Git用户配置",type:"success"}),!0):(r({message:`恢复配置失败: ${le.error}`,type:"error"}),!1)}catch(_){return r({message:`恢复配置失败: ${_.message}`,type:"error"}),!1}}async function Ie(){if(!R.value)return r({message:"当前目录不是Git仓库",type:"warning"}),!1;try{Z.value=!0;const d=await(await fetch("/api/pull",{method:"POST"})).json();return d.success?(r({message:"拉取成功",type:"success"}),await re(),!0):(d.needsMerge?r({message:`需要合并更改: ${d.pullOutput||"存在冲突需要手动解决"}`,type:"warning",duration:5e3}):r({message:`拉取失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`拉取失败: ${v.message}`,type:"error"}),!1}finally{Z.value=!1}}async function He(){if(!R.value)return r({message:"当前目录不是Git仓库",type:"warning"}),!1;try{V.value=!0;const d=await(await fetch("/api/fetch-all",{method:"POST"})).json();return d.success?(r({message:"获取所有远程分支信息成功",type:"success"}),await re(),!0):(r({message:`获取远程分支信息失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`获取远程分支信息失败: ${v.message}`,type:"error"}),!1}finally{V.value=!1}}function Ke(){S&&S.disconnect();try{const v="http://localhost:3000";if(console.log("尝试连接Socket.IO服务器:",v),S=os(v,{reconnectionDelayMax:1e4,reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1e3,timeout:2e4,autoConnect:!0,forceNew:!0,transports:["websocket","polling"]}),!S){console.error("Socket.IO初始化失败: socket为null");return}console.log("Socket.IO初始化成功,socket ID:",S.id||"未连接"),S.on("connect",()=>{console.log("成功连接到Socket.IO服务器"),ne.value&&S&&S.emit("start_monitoring")}),S.on("disconnect",d=>{console.log("与Socket.IO服务器断开连接:",d)}),S.on("git_status_update",d=>{ne.value&&(console.log("收到Git状态更新通知:",new Date().toLocaleTimeString()),d.status&&(ie.value=d.status),d.porcelain!==void 0&&Ye(d.porcelain))}),S.on("monitoring_status",d=>{console.log("文件监控状态:",d.active?"已启动":"已停止")}),S.on("connect_error",d=>{console.error("Socket连接错误:",d.message)}),S.on("connect_timeout",()=>{console.error("Socket连接超时")}),S.on("reconnect",d=>{console.log(`Socket重连成功,尝试次数: ${d}`),ne.value&&(console.log("重连后重新发送start_monitoring请求"),S==null||S.emit("start_monitoring"))}),S.on("reconnect_attempt",d=>{console.log(`Socket尝试重连,第 ${d} 次尝试`)}),S.on("reconnect_error",d=>{console.error("Socket重连错误:",d.message)}),S.on("reconnect_failed",()=>{console.error("Socket重连失败,已达到最大重试次数")}),S&&!S.connected&&(console.log("Socket未连接,尝试手动连接..."),S.connect())}catch(v){console.error("Socket.IO连接初始化失败:",v)}}function st(){if(console.log("toggleAutoUpdate调用,当前值:",ne.value),!S){console.error("无法切换自动更新状态: socket连接不存在"),r.error("无法连接到服务器,自动更新可能不会生效"),console.log("尝试重新建立socket连接..."),Ke(),localStorage.setItem("zen-gitsync-auto-update",ne.value.toString());return}try{ne.value?(console.log("发送start_monitoring命令..."),S.emit("start_monitoring"),r.success("自动更新已启用")):(console.log("发送stop_monitoring命令..."),S.emit("stop_monitoring"),r.info("自动更新已禁用")),localStorage.setItem("zen-gitsync-auto-update",ne.value.toString()),console.log("已保存自动更新设置到本地存储:",ne.value)}catch(v){console.error("切换自动更新状态时出错:",v),r.error(`切换自动更新失败: ${v.message}`)}}function Ye(v){if(v===void 0||v===""){de.value=[];return}const d=v.split(`
2
+ `),_=[];for(const le of d){const We=le.match(/^([ MADRCU\?]{2})\s+(.+)$/);if(We){let he="";const Ge=We[1],Be=Ge.charAt(0),Me=Ge.charAt(1);Be==="A"||Be==="M"||Be==="D"||Be==="R"?he="added":Be===" "&&Me==="M"?he="modified":Be===" "&&Me==="D"?he="deleted":Ge==="??"?he="untracked":he="other",_.push({path:We[2],type:he})}}de.value=_}async function Xe(v=!0){if(!R.value){console.log("当前目录不是Git仓库,跳过加载提交历史");return}try{L.value=!0,console.log("开始加载提交历史...");const d=new Date().getTime(),le=await(await fetch(`/api/log?page=1&_t=${d}`)).json();le&&le.data&&Array.isArray(le.data)?(se.value=[...le.data],console.log(`提交历史加载完成,共 ${se.value.length} 条记录`)):(console.warn("API返回的提交历史格式不正确:",le),se.value=[]),v&&r({message:"提交历史已更新",type:"success"})}catch(d){console.error("获取提交历史失败:",d),v&&r({message:`获取提交历史失败: ${d.message}`,type:"error"})}finally{L.value=!1}}async function Ce(){if(!R.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{h.value=!0;const d=await(await fetch("/api/status")).json();d.status&&(ie.value=d.status,K.value={staged:d.status.staged||[],unstaged:d.status.unstaged||[],untracked:d.status.untracked||[]}),await xe()}catch(v){console.error("获取Git状态失败:",v),r({message:`获取Git状态失败: ${v.message}`,type:"error"})}finally{h.value=!1}}async function xe(){if(console.log("开始获取Git状态(porcelain格式)..."),!R.value){console.log("当前目录不是Git仓库,跳过加载Git状态");return}try{const d=await(await fetch("/api/status_porcelain")).json();d.status!==void 0?Ye(d.status):de.value=[]}catch(v){console.error("获取Git状态(porcelain)失败:",v),r({message:`获取Git状态(porcelain)失败: ${v.message}`,type:"error"}),de.value=[]}}async function je(){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{E.value=!0;const d=await(await fetch("/api/add",{method:"POST"})).json();return d.success?(r({message:"文件已添加到暂存区",type:"success"}),Ce(),!0):(r({message:`添加文件失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`添加文件失败: ${v.message}`,type:"error"}),!1}finally{E.value=!1}}async function y(v){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{E.value=!0;const _=await(await fetch("/api/add-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:v})})).json();return _.success?(r({message:"文件已暂存",type:"success"}),Ce(),!0):(r({message:`暂存文件失败: ${_.error}`,type:"error"}),!1)}catch(d){return r({message:`暂存文件失败: ${d.message}`,type:"error"}),!1}finally{E.value=!1}}async function i(v){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const _=await(await fetch("/api/unstage-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:v})})).json();return _.success?(r({message:"已取消暂存文件",type:"success"}),Ce(),!0):(r({message:`取消暂存失败: ${_.error}`,type:"error"}),!1)}catch(d){return r({message:`取消暂存失败: ${d.message}`,type:"error"}),!1}finally{N.value=!1}}function O(v){return new Promise(d=>setTimeout(d,v))}async function D(v,d=!1){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{B.value=!0;const le=await(await fetch("/api/commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:v,hasNewlines:v.includes(`
3
+ `),noVerify:d})})).json();return le.success?(r({message:"提交成功",type:"success"}),Ce(),Xe(),re(),!0):(r({message:`提交失败: ${le.error}`,type:"error"}),!1)}catch(_){return r({message:`提交失败: ${_.message}`,type:"error"}),!1}finally{B.value=!1}}async function ue(){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{z.value=!0;const d=await(await fetch("/api/push",{method:"POST"})).json();return d.success?(r({message:"推送成功",type:"success"}),Ce(),Xe(),re(),!0):(r({message:`推送失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`推送失败: ${v.message}`,type:"error"}),!1}finally{z.value=!1}}async function Se(v,d=!1){return await je()?(await O(At),await D(v,d)):!1}async function _e(v,d=!1){try{return!await je()||(await O(At),!await D(v,d))?!1:(await O(At),await ue())}catch(_){try{(await(await fetch("/api/remove-lock",{method:"POST"})).json()).success&&r({message:"已清理锁定文件,请重试操作",type:"warning"})}catch(le){console.error("清理锁定文件失败:",le)}return r({message:`操作失败: ${_.message}`,type:"error"}),Ce(),Xe(),re(),!1}}async function fe(){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const d=await(await fetch("/api/reset-head",{method:"POST"})).json();return d.success?(r({message:"已重置暂存区",type:"success"}),Ce(),!0):(r({message:`重置暂存区失败: ${d.error}`,type:"error"}),!1)}catch(v){return r({message:`重置暂存区失败: ${v.message}`,type:"error"}),!1}finally{N.value=!1}}async function Re(v){if(!R.value)return r.warning("当前目录不是Git仓库"),!1;try{N.value=!0;const _=await(await fetch("/api/reset-to-remote",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:v})})).json();return _.success?(r({message:`已重置分支 ${v} 到远程状态`,type:"success"}),Ce(),Xe(),!0):(r({message:`重置分支失败: ${_.error}`,type:"error"}),!1)}catch(d){return r({message:`重置分支失败: ${d.message}`,type:"error"}),!1}finally{N.value=!1}}async function be(){if(R.value)try{ee.value=!0,console.log("获取远程仓库地址...");const d=await(await fetch("/api/remote-url")).json();d.success?(I.value=d.url||"",console.log(`获取到远程仓库地址: ${I.value}`)):(console.warn("获取远程仓库地址失败:",d.error),I.value="")}catch(v){console.error("获取远程仓库地址失败:",v),I.value=""}finally{ee.value=!1}}async function $e(){if(!I.value)return r({message:"没有可复制的远程仓库地址",type:"warning"}),!1;try{return await navigator.clipboard.writeText(I.value),r({message:"已复制远程仓库地址",type:"success"}),!0}catch(v){return console.error("复制远程仓库地址失败:",v),r({message:`复制失败: ${v.message}`,type:"error"}),!1}}return ft(()=>{const v=localStorage.getItem("zen-gitsync-auto-update");v!==null&&(ne.value=v==="true"),Ke()}),ls(()=>{S&&(S.disconnect(),S=null)}),{currentBranch:ke,allBranches:m,userName:x,userEmail:p,isChangingBranch:g,isCreatingBranch:U,isGitRepo:R,lastCheckedTime:j,branchAhead:k,branchBehind:H,hasUpstream:X,upstreamBranch:J,lastBranchStatusTime:F,lastBranchesTime:me,remoteUrl:I,isLoadingRemoteUrl:ee,log:se,status:K,statusText:ie,fileList:de,isLoadingLog:L,isLoadingStatus:h,isAddingFiles:E,isCommiting:B,isResetting:N,autoUpdateEnabled:ne,$reset:ye,checkGitRepo:Ee,getCurrentBranch:Le,getAllBranches:$,changeBranch:we,getUserInfo:ge,createBranch:Ae,clearUserConfig:Fe,restoreUserConfig:Ne,getBranchStatus:re,gitPull:Ie,gitFetchAll:He,isPushing:z,isGitPulling:Z,isGitFetching:V,initSocketConnection:Ke,toggleAutoUpdate:st,parseStatusPorcelain:Ye,fetchLog:Xe,fetchStatus:Ce,fetchStatusPorcelain:xe,addToStage:je,addFileToStage:y,unstageFile:i,commitChanges:D,pushToRemote:ue,addAndCommit:Se,addCommitAndPush:_e,resetHead:fe,resetToRemote:Re,getRemoteUrl:be,copyRemoteUrl:$e}}),As={class:"card"},Vs={class:"status-header"},Rs={class:"header-actions"},Bs={class:"card-content"},Ms={key:0,class:"status-box"},zs={key:1,class:"status-box-wrap"},Es={key:0,class:"branch-status-info"},Ds={class:"branch-sync-status"},Gs={class:"sync-status-content"},js={class:"status-badges"},Ps={class:"badge-content"},Us={class:"badge-content"},Os={key:1,class:"file-list-container"},Fs={key:0,class:"file-group"},Ns={class:"file-list"},Is=["onClick"],Hs={class:"file-info"},Xs={class:"file-path-container"},Ws={class:"file-name"},Js={class:"file-directory"},qs={class:"file-actions"},Ys={key:1,class:"file-group"},Zs={class:"file-list"},Ks=["onClick"],Qs={class:"file-info"},ea={class:"file-path-container"},ta={class:"file-name"},sa={class:"file-directory"},aa={class:"file-actions"},la={key:2,class:"file-group"},oa={class:"file-list"},na=["onClick"],ia={class:"file-info"},ra={class:"file-path-container"},ca={class:"file-name"},ua={class:"file-directory"},da={class:"file-actions"},fa={key:2,class:"empty-status"},pa={class:"empty-icon"},va={class:"diff-content"},ma=["innerHTML"],ga={key:1,class:"no-diff"},ha={class:"file-navigation"},ya={class:"file-counter"},wa=yt({__name:"GitStatus",props:{initialDirectory:{type:String,default:""}},setup(ke,{expose:m}){const x=ke,p=dt(),g=Ve(()=>p.isLoadingStatus),U=c(""),R=c(""),j=c(!1),I=c(!1),ee=c(-1),z=c(x.initialDirectory||"");async function Z(){try{if(!z.value){const h=await(await fetch("/api/current_directory")).json();z.value=h.directory||"未知目录"}if(!p.isGitRepo)return;await p.fetchStatus(),await p.getBranchStatus(),r({message:"Git 状态已刷新",type:"success"})}catch(L){r({message:"刷新失败: "+L.message,type:"error"})}}function V(L){if(!L)return"";const h=L.split(`
4
+ `);function E(B){return B.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}return h.map(B=>{const N=E(B);return B.startsWith("diff --git")?`<div class="diff-header">${N}</div>`:B.startsWith("---")?`<div class="diff-old-file">${N}</div>`:B.startsWith("+++")?`<div class="diff-new-file">${N}</div>`:B.startsWith("@@")?`<div class="diff-hunk-header">${N}</div>`:B.startsWith("+")?`<div class="diff-added">${N}</div>`:B.startsWith("-")?`<div class="diff-removed">${N}</div>`:`<div class="diff-context">${N}</div>`}).join("")}async function k(L){try{I.value=!0,U.value=L,ee.value=p.fileList.findIndex(E=>E.path===L);const h=p.fileList[ee.value];if(h&&h.type==="untracked"){try{const B=await(await fetch(`/api/file-content?file=${encodeURIComponent(L)}`)).json();B.success&&B.content?R.value=`diff --git a/${L} b/${L}
5
+ 新文件: ${L}
6
+ --- /dev/null
7
+ +++ b/${L}
8
+ @@ -0,0 +1,${B.content.split(`
9
+ `).length} @@
10
+ `+B.content.split(`
11
+ `).map(N=>`+${N}`).join(`
12
+ `):R.value=`这是一个新文件,尚未被Git跟踪。
13
+ 添加到暂存区后可以提交该文件。`}catch(E){console.error("获取未跟踪文件内容失败:",E),R.value=`这是一个新文件,尚未被Git跟踪。
14
+ 添加到暂存区后可以提交该文件。`}j.value=!0}else if(h&&h.type==="added"){const B=await(await fetch(`/api/diff-cached?file=${encodeURIComponent(L)}`)).json();R.value=B.diff||"没有变更",j.value=!0}else{const B=await(await fetch(`/api/diff?file=${encodeURIComponent(L)}`)).json();R.value=B.diff||"没有变更",j.value=!0}}catch(h){r({message:"获取文件差异失败: "+h.message,type:"error"}),R.value="获取差异失败: "+h.message}finally{I.value=!1}}async function H(){if(p.fileList.length===0||ee.value<=0)return;const L=ee.value-1,h=p.fileList[L];await k(h.path)}async function X(){if(p.fileList.length===0||ee.value>=p.fileList.length-1)return;const L=ee.value+1,h=p.fileList[L];await k(h.path)}function J(L){k(L.path)}async function F(L){await p.addFileToStage(L)}async function me(L){await p.unstageFile(L)}async function S(){await Z()}async function ne(){try{await p.gitPull(),await Z()}catch(L){console.error("拉取操作发生错误:",L)}}async function se(){try{await p.gitFetchAll(),await Z()}catch(L){console.error("获取远程分支信息操作发生错误:",L)}}async function K(L){try{await et.confirm(`确定要撤回文件 "${L}" 的所有修改吗?此操作无法撤销。`,"撤回修改",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const E=await(await fetch("/api/revert_file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filePath:L})})).json();E.success?(r.success("已撤回文件修改"),await Z()):r.error(E.error?`撤回失败: ${E.error}`:"撤回文件修改失败,请重试")}catch(h){if(h==="cancel"||h.message==="cancel")return;const E=h.message||"未知错误";E!=="undefined"?r.error(`撤回文件修改失败: ${E}`):r.error("撤回文件修改失败,请重试")}}function ie(L){const h=L.split("/");return h[h.length-1]}function de(L){const h=L.split("/");return h.length<=1?"":h.slice(0,-1).join("/")}return ft(()=>{Z()}),Qe(()=>p.autoUpdateEnabled,(L,h)=>{console.log(`自动更新状态变更: ${h} -> ${L}`),p.toggleAutoUpdate()},{immediate:!1}),m({refreshStatus:S}),(L,h)=>{const E=Ot,B=Rt,N=Oe,ye=_t,re=wt,Ee=bt,Le=Wt;return f(),w(Te,null,[e("div",As,[e("div",Vs,[h[2]||(h[2]=e("h2",null,"Git 状态",-1)),e("div",Rs,[s(B,{content:o(p).autoUpdateEnabled?"禁用自动更新文件状态":"启用自动更新文件状态",placement:"top","hide-after":1e3},{default:l(()=>[s(E,{modelValue:o(p).autoUpdateEnabled,"onUpdate:modelValue":h[0]||(h[0]=$=>o(p).autoUpdateEnabled=$),style:{"--el-switch-on-color":"#67C23A","--el-switch-off-color":"#909399","margin-right":"10px"},"inline-prompt":"","active-icon":o(Ft),"inactive-icon":o(Et),class:"auto-update-switch"},null,8,["modelValue","active-icon","inactive-icon"])]),_:1},8,["content"]),s(B,{content:"Git Pull (拉取远程更新)",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"primary",icon:o(Nt),circle:"",size:"small",onClick:ne,loading:o(p).isGitPulling,disabled:!o(p).hasUpstream},null,8,["icon","loading","disabled"])]),_:1}),s(B,{content:"Git Fetch All (获取所有远程分支)",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"info",icon:o(It),circle:"",size:"small",onClick:se,loading:o(p).isGitFetching},null,8,["icon","loading"])]),_:1}),s(B,{content:"刷新状态",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"primary",icon:o(ns),circle:"",size:"small",onClick:S,loading:g.value},null,8,["icon","loading"])]),_:1})])]),e("div",Bs,[o(p).isGitRepo?(f(),w("div",zs,[o(p).hasUpstream&&(o(p).branchAhead>0||o(p).branchBehind>0)?(f(),w("div",Es,[e("div",Ds,[e("div",Gs,[s(B,{content:"本地分支与远程分支的状态对比",placement:"top"},{default:l(()=>[e("div",js,[o(p).branchAhead>0?(f(),ae(re,{key:0,size:"small",type:"warning",class:"status-badge"},{default:l(()=>[e("span",Ps,[s(ye,null,{default:l(()=>[s(o(is))]),_:1}),b(" 你的分支领先 'origin/"+A(o(p).currentBranch)+"' "+A(o(p).branchAhead)+" 个提交 ",1)])]),_:1})):W("",!0),o(p).branchBehind>0?(f(),ae(re,{key:1,size:"small",type:"info",class:"status-badge"},{default:l(()=>[e("span",Us,[s(ye,null,{default:l(()=>[s(o(Ht))]),_:1}),b(" 你的分支落后 'origin/"+A(o(p).currentBranch)+"' "+A(o(p).branchBehind)+" 个提交 ",1)])]),_:1})):W("",!0)])]),_:1})])])])):W("",!0),o(p).fileList.length?(f(),w("div",Os,[o(p).fileList.some($=>$.type==="added")?(f(),w("div",Fs,[h[5]||(h[5]=e("div",{class:"file-group-header"},"已暂存的更改",-1)),e("div",Ns,[(f(!0),w(Te,null,De(o(p).fileList.filter($=>$.type==="added"),$=>(f(),w("div",{key:$.path,class:"file-item",onClick:we=>J($)},[e("div",Hs,[e("div",Xs,[e("span",Ws,A(ie($.path)),1),e("span",Js,A(de($.path)),1)])]),e("div",qs,[s(B,{content:"取消暂存",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"warning",size:"small",circle:"",onClick:nt(we=>me($.path),["stop"])},{default:l(()=>h[4]||(h[4]=[b("-")])),_:2},1032,["onClick"])]),_:2},1024)])],8,Is))),128))])])):W("",!0),o(p).fileList.some($=>$.type==="modified"||$.type==="deleted")?(f(),w("div",Ys,[h[7]||(h[7]=e("div",{class:"file-group-header"},"未暂存的更改",-1)),e("div",Zs,[(f(!0),w(Te,null,De(o(p).fileList.filter($=>$.type==="modified"||$.type==="deleted"),$=>(f(),w("div",{key:$.path,class:"file-item",onClick:we=>J($)},[e("div",Qs,[e("div",{class:qe(["file-status-indicator",$.type])},null,2),e("div",ea,[e("span",ta,A(ie($.path)),1),e("span",sa,A(de($.path)),1)])]),e("div",aa,[s(B,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"success",size:"small",circle:"",onClick:nt(we=>F($.path),["stop"])},{default:l(()=>h[6]||(h[6]=[b("+")])),_:2},1032,["onClick"])]),_:2},1024),s(B,{content:"撤回修改",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"danger",size:"small",icon:o(Bt),circle:"",onClick:nt(we=>K($.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,Ks))),128))])])):W("",!0),o(p).fileList.some($=>$.type==="untracked")?(f(),w("div",la,[h[10]||(h[10]=e("div",{class:"file-group-header"},"未跟踪的文件",-1)),e("div",oa,[(f(!0),w(Te,null,De(o(p).fileList.filter($=>$.type==="untracked"),$=>(f(),w("div",{key:$.path,class:"file-item",onClick:we=>J($)},[e("div",ia,[h[8]||(h[8]=e("div",{class:"file-status-indicator untracked"},null,-1)),e("div",ra,[e("span",ca,A(ie($.path)),1),e("span",ua,A(de($.path)),1)])]),e("div",da,[s(B,{content:"添加到暂存区",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"success",size:"small",circle:"",onClick:nt(we=>F($.path),["stop"])},{default:l(()=>h[9]||(h[9]=[b("+")])),_:2},1032,["onClick"])]),_:2},1024),s(B,{content:"删除文件",placement:"top","hide-after":1e3},{default:l(()=>[s(N,{type:"danger",size:"small",icon:o(Et),circle:"",onClick:nt(we=>K($.path),["stop"])},null,8,["icon","onClick"])]),_:2},1024)])],8,na))),128))])])):W("",!0)])):o(p).isGitRepo?(f(),w("div",fa,[e("div",pa,[s(ye,null,{default:l(()=>[s(o(Xt))]),_:1})]),h[11]||(h[11]=e("div",{class:"empty-text"},"没有检测到任何更改",-1)),h[12]||(h[12]=e("div",{class:"empty-subtext"},"工作区是干净的",-1))])):W("",!0)])):(f(),w("div",Ms,h[3]||(h[3]=[e("div",{class:"empty-status"},[e("p",null,"当前目录不是Git仓库")],-1)])))])]),s(Ee,{modelValue:j.value,"onUpdate:modelValue":h[1]||(h[1]=$=>j.value=$),title:`文件差异: ${U.value}`,width:"80%","destroy-on-close":"",class:"diff-dialog"},{footer:l(()=>[e("div",ha,[s(N,{type:"primary",icon:o(rs),onClick:H,disabled:ee.value<=0||o(p).fileList.length===0,plain:"",class:"nav-button"},{default:l(()=>h[13]||(h[13]=[b(" 上一个文件 ")])),_:1},8,["icon","disabled"]),e("div",ya,[s(re,{type:"info",effect:"plain",class:"counter-tag"},{default:l(()=>[b(A(ee.value+1)+" / "+A(o(p).fileList.length),1)]),_:1})]),s(N,{type:"primary",icon:o(Dt),onClick:X,disabled:ee.value>=o(p).fileList.length-1||o(p).fileList.length===0,plain:"",class:"nav-button"},{icon:l(()=>[s(ye,{class:"el-icon--right"},{default:l(()=>[s(o(Dt))]),_:1})]),default:l(()=>[h[14]||(h[14]=b(" 下一个文件 "))]),_:1},8,["icon","disabled"])])]),default:l(()=>[ct((f(),w("div",va,[R.value?(f(),w("div",{key:0,innerHTML:V(R.value),class:"diff-formatted"},null,8,ma)):(f(),w("div",ga,"该文件没有差异或是新文件"))])),[[Le,I.value]])]),_:1},8,["modelValue","title"])],64)}}}),$t=(ke,m)=>{const x=ke.__vccOpts||ke;for(const[p,g]of m)x[p]=g;return x},_a=$t(wa,[["__scopeId","data-v-a828da7e"]]),Kt=Ut("config",()=>{const ke=c(""),m=c([]),x=c([]),p=c([]),g=c(!1),U=c(!1),R=Ve(()=>({defaultCommitMessage:ke.value,descriptionTemplates:m.value,scopeTemplates:x.value,messageTemplates:p.value}));async function j(){if(U.value&&!g.value)return console.log("使用缓存的配置信息"),R.value;try{g.value=!0,console.log("加载配置信息...");const k=await(await fetch("/api/config/getConfig")).json();return ke.value=k.defaultCommitMessage||"",m.value=k.descriptionTemplates||[],x.value=k.scopeTemplates||[],p.value=k.messageTemplates||[],U.value=!0,console.log("配置信息加载完成"),R.value}catch(V){return console.error("加载配置失败:",V),r.error(`加载配置失败: ${V.message}`),null}finally{g.value=!1}}async function I(V){try{const H=await(await fetch("/api/config/saveDefaultMessage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({defaultCommitMessage:V})})).json();return H.success?(ke.value=V,r.success("默认提交信息已保存"),!0):(r.error(`保存失败: ${H.error}`),!1)}catch(k){return r.error(`保存失败: ${k.message}`),!1}}async function ee(V,k){try{const X=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:V,type:k})})).json();return X.success?(k==="description"?m.value.includes(V)||m.value.push(V):k==="scope"?x.value.includes(V)||x.value.push(V):k==="message"&&(p.value.includes(V)||p.value.push(V)),r.success("模板已保存"),!0):(r.error(`保存模板失败: ${X.error}`),!1)}catch(H){return r.error(`保存模板失败: ${H.message}`),!1}}async function z(V,k){try{const X=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:V,type:k})})).json();return X.success?(k==="description"?m.value=m.value.filter(J=>J!==V):k==="scope"?x.value=x.value.filter(J=>J!==V):k==="message"&&(p.value=p.value.filter(J=>J!==V)),r.success("模板已删除"),!0):(r.error(`删除模板失败: ${X.error}`),!1)}catch(H){return r.error(`删除模板失败: ${H.message}`),!1}}async function Z(V,k,H){try{const J=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:V,newTemplate:k,type:H})})).json();if(J.success){if(H==="description"){const F=m.value.indexOf(V);F!==-1&&(m.value[F]=k)}else if(H==="scope"){const F=x.value.indexOf(V);F!==-1&&(x.value[F]=k)}else if(H==="message"){const F=p.value.indexOf(V);F!==-1&&(p.value[F]=k)}return r.success("模板已更新"),!0}else return r.error(`更新模板失败: ${J.error}`),!1}catch(X){return r.error(`更新模板失败: ${X.message}`),!1}}return{defaultCommitMessage:ke,descriptionTemplates:m,scopeTemplates:x,messageTemplates:p,isLoading:g,isLoaded:U,config:R,loadConfig:j,saveDefaultMessage:I,saveTemplate:ee,deleteTemplate:z,updateTemplate:Z}}),ba={key:0,class:"pushing-indicator"},$a={key:0,class:"push-success-indicator"},Ca={class:"card-content"},ka={class:"layout-container"},Sa={key:0,class:"git-config-warning"},Ta={class:"commit-section"},xa={class:"commit-options"},La={class:"options-row"},Aa={class:"commit-mode-toggle"},Va={class:"no-verify-toggle"},Ra={key:0,class:"commit-form"},Ba={class:"description-container"},Ma={class:"input-actions"},za={class:"preview-section"},Ea={class:"preview-content code-command"},Da={class:"form-bottom-actions"},Ga={class:"button-row"},ja={key:0},Pa={key:0},Ua={key:1,class:"standard-commit-form"},Oa={class:"standard-commit-header"},Fa={class:"type-scope-container"},Na={class:"scope-wrapper"},Ia={class:"description-container"},Ha={class:"advanced-fields"},Xa={class:"preview-section"},Wa={class:"preview-content"},Ja={class:"preview-content code-command"},qa={class:"form-bottom-actions"},Ya={class:"button-row"},Za={key:0},Ka={key:0},Qa={class:"actions-section"},el={class:"action-groups"},tl={class:"operations-wrapper"},sl={class:"action-group"},al={class:"group-buttons"},ll={key:0},ol={key:0},nl={key:0},il={key:0},rl={class:"action-group"},cl={class:"group-buttons"},ul={class:"action-group reset-group"},dl={class:"group-buttons"},fl={key:0},pl={class:"template-container"},vl={class:"template-form"},ml={class:"template-form-buttons"},gl={class:"template-list"},hl={class:"template-content"},yl={class:"template-actions"},wl={class:"template-container"},_l={class:"template-form"},bl={class:"template-form-buttons"},$l={class:"template-list"},Cl={class:"template-content"},kl={class:"template-actions"},Sl={class:"template-container message-template-container"},Tl={class:"template-form"},xl={class:"template-form-buttons"},Ll={class:"templates-container"},Al={class:"message-templates-list"},Vl={class:"templates-scroll-area"},Rl={class:"template-content"},Bl={class:"template-actions"},Ml={class:"current-default-message"},zl={class:"default-message-content"},El={class:"message-help-text"},Dl=yt({__name:"CommitForm",setup(ke){const m=dt(),x=Kt(),p=c(""),g=c(!1),U=c("输入提交信息..."),R=c(""),j=c(!1),I=c("feat"),ee=c(""),z=c(""),Z=c(""),V=c(""),k=c([]),H=c(!1),X=c(""),J=c(!1),F=c(""),me=c(-1),S=c([]),ne=c(!1),se=c(""),K=c(!1),ie=c(""),de=c(-1),L=c(!1),h=c(""),E=c(!1),B=c(!1),N=[{value:"feat",label:"feat: 新功能"},{value:"fix",label:"fix: 修复bug"},{value:"docs",label:"docs: 文档修改"},{value:"style",label:"style: 样式修改"},{value:"refactor",label:"refactor: 代码重构"},{value:"test",label:"test: 测试代码"},{value:"chore",label:"chore: 构建/工具修改"}],ye=c([]),re=c(!1),Ee=c(""),Le=c(-1);Qe(j,a=>{localStorage.setItem("zen-gitsync-standard-commit",a.toString())}),Qe(E,a=>{localStorage.setItem("zen-gitsync-skip-hooks",a.toString())});const $=Ve(()=>{if(!j.value)return p.value||R.value;let a=`${I.value||""}`;return ee.value&&(a+=`(${ee.value})`),a+=`: ${z.value}`,Z.value&&(a+=`
15
+
16
+ ${Z.value}`),V.value&&(a+=`
17
+
18
+ ${V.value}`),a}),we=Ve(()=>{let a=`git commit -m "${$.value}"`;return E.value&&(a+=" --no-verify"),a});function ge(){const a=x.config;a&&(U.value=`输入提交信息 (默认: ${a.defaultCommitMessage})`,R.value=a.defaultCommitMessage||"",a.descriptionTemplates&&Array.isArray(a.descriptionTemplates)&&(k.value=a.descriptionTemplates),a.scopeTemplates&&Array.isArray(a.scopeTemplates)&&(S.value=a.scopeTemplates),a.messageTemplates&&Array.isArray(a.messageTemplates)&&(ye.value=a.messageTemplates))}async function Ae(){if(!X.value.trim()){r({message:"请输入模板内容",type:"warning"});return}try{if(J.value)await Fe();else{if(k.value.includes(X.value)){r({message:"该模板已存在",type:"warning"});return}await x.saveTemplate(X.value,"description")&&(k.value.includes(X.value)||k.value.push(X.value),k.value=[...k.value],X.value="")}}catch(a){r({message:`保存模板失败: ${a.message}`,type:"error"})}}async function Fe(){if(!X.value.trim()){r({message:"请输入模板内容",type:"warning"});return}try{if(await x.updateTemplate(F.value,X.value,"description")){const t=k.value.indexOf(F.value);t!==-1&&(k.value[t]=X.value),k.value=[...k.value],J.value=!1,F.value="",me.value=-1,X.value=""}}catch(a){r({message:`更新模板失败: ${a.message}`,type:"error"})}}function Ne(a,t){J.value=!0,F.value=a,me.value=t,X.value=a}function Ie(){J.value=!1,F.value="",me.value=-1,X.value=""}async function He(){if(!se.value.trim()){r({message:"请输入模板内容",type:"warning"});return}try{if(K.value)await Ke();else{if(S.value.includes(se.value)){r({message:"该模板已存在",type:"warning"});return}await x.saveTemplate(se.value,"scope")&&(S.value.includes(se.value)||S.value.push(se.value),S.value=[...S.value],se.value="")}}catch(a){r({message:`保存模板失败: ${a.message}`,type:"error"})}}async function Ke(){if(!se.value.trim()){r({message:"请输入模板内容",type:"warning"});return}try{if(await x.updateTemplate(ie.value,se.value,"scope")){const t=S.value.indexOf(ie.value);t!==-1&&(S.value[t]=se.value),S.value=[...S.value],K.value=!1,ie.value="",de.value=-1,se.value=""}}catch(a){r({message:`更新模板失败: ${a.message}`,type:"error"})}}function st(a,t){K.value=!0,ie.value=a,de.value=t,se.value=a}function Ye(){K.value=!1,ie.value="",de.value=-1,se.value=""}async function Xe(a){try{if(await et.confirm(`确定要删除描述模板 "${a}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await x.deleteTemplate(a,"description")){const te=k.value.indexOf(a);te!==-1&&k.value.splice(te,1),k.value=[...k.value]}}catch(t){if(t==="cancel")return;r({message:`删除模板失败: ${t.message}`,type:"error"})}}async function Ce(a){try{if(await et.confirm(`确定要删除作用域模板 "${a}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await x.deleteTemplate(a,"scope")){const te=S.value.indexOf(a);te!==-1&&S.value.splice(te,1),S.value=[...S.value]}}catch(t){if(t==="cancel")return;r({message:`删除模板失败: ${t.message}`,type:"error"})}}function xe(a){z.value=a,H.value=!1}function je(a){ee.value=a,ne.value=!1}function y(){H.value=!0}function i(){ne.value=!0}async function O(){try{await m.addToStage()&&m.fetchStatus()}catch(a){r({message:`添加文件失败: ${a.message}`,type:"error"})}}async function D(){if(!$.value.trim()){r({message:"提交信息不能为空",type:"warning"});return}try{await m.commitChanges($.value,E.value)&&(v(),m.fetchStatus(),m.fetchLog(),m.getBranchStatus())}catch(a){r({message:`提交失败: ${a.message}`,type:"error"})}}function ue(){g.value=!0,setTimeout(()=>{g.value=!1},2e3)}async function Se(){try{await m.pushToRemote(),ue(),m.getBranchStatus()}catch(a){r({message:`推送失败: ${a.message}`,type:"error"})}finally{}}async function _e(){try{await m.gitPull(),m.fetchStatus(),m.fetchLog()}catch(a){r({message:`拉取失败: ${a.message}`,type:"error"})}finally{}}async function fe(){try{await m.gitFetchAll(),await m.fetchStatus()}catch(a){r({message:`获取远程分支信息失败: ${a.message}`,type:"error"})}finally{}}async function Re(){if(!$.value.trim()){r({message:"提交信息不能为空",type:"warning"});return}try{await m.addAndCommit($.value,E.value),v(),m.fetchStatus(),m.fetchLog()}catch(a){r({message:`暂存并提交失败: ${a.message}`,type:"error"})}}async function be(){if(!$.value.trim()){r({message:"提交信息不能为空",type:"warning"});return}try{await m.addCommitAndPush($.value,E.value),v(),ue()}catch(a){r({message:`暂存、提交并推送失败: ${a.message}`,type:"error"})}}async function $e(){try{await et.confirm(`确定要重置当前分支 "${m.currentBranch}" 到远程状态吗?这将丢失所有未推送的提交和本地更改。`,"重置到远程分支",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await m.resetToRemote(m.currentBranch)&&(m.fetchStatus(),m.fetchLog())}catch(a){a!=="cancel"&&r({message:`重置到远程分支失败: ${a.message}`,type:"error"})}}function v(){p.value="",z.value="",Z.value="",V.value=""}function d(){h.value=R.value,L.value=!0}async function _(){if(!h.value.trim()){r({message:"请输入默认提交信息",type:"warning"});return}try{await x.saveDefaultMessage(h.value)&&(R.value=h.value,U.value=`输入提交信息 (默认: ${h.value})`,L.value=!1)}catch(a){r({message:`保存默认提交信息失败: ${a.message}`,type:"error"})}}const le=Ve(()=>m.fileList.some(a=>["modified","deleted","untracked"].includes(a.type))),We=Ve(()=>m.fileList.filter(a=>["modified","deleted","untracked"].includes(a.type)).length),he=Ve(()=>m.fileList.filter(a=>a.type==="added").length),Ge=Ve(()=>he.value>0),Be=Ve(()=>m.fileList.length>0),Me=Ve(()=>m.branchAhead>0),tt=Ve(()=>m.branchBehind>0),lt=Ve(()=>m.hasUpstream&&(Me.value||Ge.value&&$.value.trim())),pt=Ve(()=>Ge.value),Ct=Ve(()=>m.hasUpstream&&(Me.value||tt.value||Be.value));async function kt(){if(!h.value.trim()){r({message:"请输入模板内容",type:"warning"});return}try{if(re.value)await St();else{if(ye.value.includes(h.value)){r({message:"该模板已存在",type:"warning"});return}ye.value.push(h.value);const t=await(await fetch("/api/config/save-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:h.value,type:"message"})})).json();t.success?(r({message:"提交信息模板保存成功!",type:"success"}),h.value=""):r({message:"模板保存失败: "+t.error,type:"error"})}}catch(a){r({message:"模板保存失败: "+a.message,type:"error"})}}async function St(){try{if(Le.value>=0){const a=Ee.value,t=h.value;ye.value[Le.value]=t;const Q=await(await fetch("/api/config/update-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldTemplate:a,newTemplate:t,type:"message"})})).json();Q.success?(r({message:"提交信息模板更新成功!",type:"success"}),re.value=!1,Ee.value="",Le.value=-1,h.value=""):r({message:"模板更新失败: "+Q.error,type:"error"})}}catch(a){r({message:"模板更新失败: "+a.message,type:"error"})}}function Tt(a,t){re.value=!0,Ee.value=a,Le.value=t,h.value=a}function ot(){re.value=!1,Ee.value="",Le.value=-1,h.value=""}async function u(a){try{const t=ye.value.indexOf(a);t!==-1&&ye.value.splice(t,1);const Q=await(await fetch("/api/config/delete-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({template:a,type:"message"})})).json();Q.success?r({message:"提交信息模板删除成功!",type:"success"}):r({message:"模板删除失败: "+Q.error,type:"error"})}catch(t){r({message:"模板删除失败: "+t.message,type:"error"})}}function n(a){p.value=a,h.value=a}return ft(async()=>{const a=localStorage.getItem("zen-gitsync-standard-commit");a!==null&&(j.value=a==="true");const t=localStorage.getItem("zen-gitsync-skip-hooks");t!==null&&(E.value=t==="true"),Qe(()=>x.config,ge,{immediate:!0}),x.config||await x.loadConfig()}),(a,t)=>{const te=_t,Q=Jt,Y=Ot,T=Rt,oe=Mt,G=Oe,q=gt,pe=ht,ce=Yt,ve=us,Pe=Zt,C=bt,P=wt;return f(),w("div",{class:qe(["card",{"is-pushing":o(m).isPushing}])},[t[64]||(t[64]=e("div",{class:"card-header"},[e("h2",null,"提交更改")],-1)),s(Gt,{name:"el-fade-in-linear"},{default:l(()=>[o(m).isPushing?(f(),w("div",ba,t[15]||(t[15]=[e("div",{class:"pushing-spinner"},[e("svg",{viewBox:"0 0 50 50",class:"circular"},[e("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})])],-1),e("div",{class:"pushing-text"},"正在推送...",-1)]))):W("",!0)]),_:1}),s(Gt,{name:"el-fade-in-linear"},{default:l(()=>[g.value?(f(),w("div",$a,[s(te,{class:"push-success-icon"},{default:l(()=>[s(o(Ft))]),_:1}),t[16]||(t[16]=e("div",{class:"push-success-text"},"推送成功!",-1))])):W("",!0)]),_:1}),e("div",Ca,[e("div",ka,[o(m).userName===""||o(m).userEmail===""?(f(),w("div",Sa,[s(Q,{title:"Git用户信息未配置",type:"warning",closable:!1,"show-icon":""},{default:l(()=>t[17]||(t[17]=[e("p",null,"您需要配置Git用户名和邮箱才能提交代码。请使用以下命令配置:",-1),e("pre",{class:"config-command"},`git config --global user.name "Your Name"
19
+ git config --global user.email "your.email@example.com"`,-1)])),_:1})])):(f(),w(Te,{key:1},[e("div",Ta,[e("div",xa,[e("div",La,[e("div",Aa,[s(Y,{modelValue:j.value,"onUpdate:modelValue":t[0]||(t[0]=M=>j.value=M),"active-text":"标准化提交","inactive-text":"普通提交"},null,8,["modelValue"])]),e("div",Va,[s(T,{content:"跳过 Git 钩子检查 (--no-verify)",placement:"top"},{default:l(()=>[s(Y,{modelValue:E.value,"onUpdate:modelValue":t[1]||(t[1]=M=>E.value=M),"active-text":"跳过钩子 (--no-verify)"},null,8,["modelValue"])]),_:1})])])]),j.value?(f(),w("div",Ua,[e("div",Oa,[e("div",Fa,[s(pe,{modelValue:I.value,"onUpdate:modelValue":t[3]||(t[3]=M=>I.value=M),placeholder:"提交类型",class:"type-select",clearable:""},{default:l(()=>[(f(),w(Te,null,De(N,M=>s(q,{key:M.value,label:M.label,value:M.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),e("div",Na,[s(oe,{modelValue:ee.value,"onUpdate:modelValue":t[4]||(t[4]=M=>ee.value=M),placeholder:"作用域(可选)",class:"scope-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:o(ut),circle:"",size:"small",class:"settings-button",onClick:i},null,8,["icon"])])]),e("div",Ia,[s(oe,{modelValue:z.value,"onUpdate:modelValue":t[5]||(t[5]=M=>z.value=M),placeholder:"简短描述(必填)",class:"description-input",clearable:""},null,8,["modelValue"]),s(G,{type:"primary",icon:o(ut),circle:"",size:"small",class:"settings-button",onClick:y},null,8,["icon"])])]),e("div",{class:"advanced-options-toggle",onClick:t[6]||(t[6]=M=>B.value=!B.value)},[e("span",null,A(B.value?"收起":"正文及页脚"),1),s(te,{class:qe(["toggle-icon",{"is-active":B.value}])},{default:l(()=>[s(o(Ht))]),_:1},8,["class"])]),ct(e("div",Ha,[s(oe,{modelValue:Z.value,"onUpdate:modelValue":t[7]||(t[7]=M=>Z.value=M),type:"textarea",rows:4,placeholder:"正文(可选):详细描述本次提交的内容和原因",class:"body-input",clearable:""},null,8,["modelValue"]),s(oe,{modelValue:V.value,"onUpdate:modelValue":t[8]||(t[8]=M=>V.value=M),placeholder:"页脚(可选):如 Closes #123",class:"footer-input",clearable:""},null,8,["modelValue"])],512),[[qt,B.value]]),e("div",Xa,[t[22]||(t[22]=e("div",{class:"preview-title"},"提交信息预览:",-1)),e("pre",Wa,A($.value),1),t[23]||(t[23]=e("div",{class:"preview-title",style:{"margin-top":"10px"}},"Git提交命令预览:",-1)),e("pre",Ja,A(we.value),1)]),e("div",qa,[e("div",Ya,[s(G,{type:"primary",onClick:D,loading:o(m).isLoadingStatus,disabled:!Ge.value||!$.value.trim()},{default:l(()=>[t[24]||(t[24]=b(" 提交 ")),he.value>0?(f(),w("span",Za,"("+A(he.value)+")",1)):W("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:o(xt),onClick:Se,loading:o(m).isPushing,disabled:!lt.value,style:rt(Me.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:l(()=>[t[25]||(t[25]=b(" 推送 ")),Me.value?(f(),w("span",Ka,"("+A(o(m).branchAhead)+")",1)):W("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:o(Lt),onClick:be,loading:o(m).isAddingFiles||o(m).isCommiting||o(m).isPushing,disabled:!Be.value||!$.value.trim()||!o(m).hasUpstream,class:"full-width-button"},{default:l(()=>t[26]||(t[26]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])])):(f(),w("div",Ra,[e("div",Ba,[s(oe,{modelValue:p.value,"onUpdate:modelValue":t[2]||(t[2]=M=>p.value=M),placeholder:U.value,type:"textarea",rows:6,resize:"none",class:"commit-message-input"},null,8,["modelValue","placeholder"]),e("div",Ma,[s(G,{type:"primary",icon:o(ut),circle:"",size:"small",class:"settings-button",onClick:d},null,8,["icon"])])]),e("div",za,[t[18]||(t[18]=e("div",{class:"preview-title"},"Git提交命令预览:",-1)),e("pre",Ea,'git commit -m "'+A($.value||"<提交信息>")+'"'+A(E.value?" --no-verify":""),1)]),e("div",Da,[e("div",Ga,[s(G,{type:"primary",onClick:D,loading:o(m).isLoadingStatus,disabled:!Ge.value||!$.value.trim()},{default:l(()=>[t[19]||(t[19]=b(" 提交 ")),he.value>0?(f(),w("span",ja,"("+A(he.value)+")",1)):W("",!0)]),_:1},8,["loading","disabled"]),s(G,{type:"primary",icon:o(xt),onClick:Se,loading:o(m).isPushing,disabled:!lt.value,style:rt(Me.value?{backgroundColor:"#67c23a",borderColor:"#67c23a"}:{})},{default:l(()=>[t[20]||(t[20]=b(" 推送 ")),Me.value?(f(),w("span",Pa,"("+A(o(m).branchAhead)+")",1)):W("",!0)]),_:1},8,["icon","loading","disabled","style"])]),s(G,{type:"success",icon:o(Lt),onClick:be,loading:o(m).isAddingFiles||o(m).isCommiting||o(m).isPushing,disabled:!Be.value||!$.value.trim()||!o(m).hasUpstream,class:"full-width-button"},{default:l(()=>t[21]||(t[21]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled"])])]))]),e("div",Qa,[t[39]||(t[39]=e("h3",null,"Git 操作",-1)),e("div",el,[e("div",tl,[e("div",sl,[t[32]||(t[32]=e("div",{class:"group-title"},"基础操作",-1)),e("div",al,[s(T,{content:le.value?`暂存${We.value}个待更改文件`:"git add .",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"primary",onClick:O,loading:o(m).isAddingFiles,disabled:!le.value,class:"action-button"},{default:l(()=>[t[27]||(t[27]=b(" 暂存更改 ")),We.value>0?(f(),w("span",ll,"("+A(We.value)+")",1)):W("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(T,{content:Ge.value?`提交${he.value}个已暂存文件`:"git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"primary",onClick:D,loading:o(m).isLoadingStatus,disabled:!Ge.value||!$.value.trim(),class:"action-button"},{default:l(()=>[t[28]||(t[28]=b(" 提交 ")),he.value>0?(f(),w("span",ol,"("+A(he.value)+")",1)):W("",!0)]),_:1},8,["loading","disabled"])]),_:1},8,["content"]),s(T,{content:Me.value?`推送${o(m).branchAhead}个本地提交`:"git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"primary",icon:o(xt),onClick:Se,loading:o(m).isPushing,disabled:!lt.value,class:qe(["action-button","push-button",{"is-loading":o(m).isPushing}]),style:rt(Me.value?{backgroundColor:"#67c23a !important",borderColor:"#67c23a !important"}:{})},{default:l(()=>[t[29]||(t[29]=b(" 推送 ")),Me.value?(f(),w("span",nl,"("+A(o(m).branchAhead)+")",1)):W("",!0)]),_:1},8,["icon","loading","disabled","class","style"])]),_:1},8,["content"]),s(T,{content:tt.value?`拉取${o(m).branchBehind}个远程提交`:"git pull",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"primary",icon:o(Nt),onClick:_e,loading:o(m).isGitPulling,disabled:!o(m).hasUpstream,class:"action-button",style:rt(tt.value?{color:"white",backgroundColor:"#E6A23C",borderColor:"#E6A23C"}:{})},{default:l(()=>[t[30]||(t[30]=b(" 拉取 ")),tt.value?(f(),w("span",il,"("+A(o(m).branchBehind)+")",1)):W("",!0)]),_:1},8,["icon","loading","disabled","style"])]),_:1},8,["content"]),s(T,{content:"git fetch --all",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"info",icon:o(It),onClick:fe,loading:o(m).isGitFetching,class:"action-button"},{default:l(()=>t[31]||(t[31]=[b(" 获取所有远程分支 ")])),_:1},8,["icon","loading"])]),_:1})])]),e("div",rl,[t[35]||(t[35]=e("div",{class:"group-title"},"组合操作",-1)),e("div",cl,[s(T,{content:"git add + git commit",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"primary",icon:o(vt),onClick:Re,loading:o(m).isAddingFiles||o(m).isCommiting,disabled:!le.value||!$.value.trim(),class:"action-button"},{default:l(()=>t[33]||(t[33]=[b(" 暂存并提交 ")])),_:1},8,["icon","loading","disabled"])]),_:1}),s(T,{content:"git add + git commit + git push",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"success",icon:o(Lt),onClick:be,loading:o(m).isAddingFiles||o(m).isCommiting||o(m).isPushing,disabled:!Be.value||!$.value.trim()||!o(m).hasUpstream,class:qe(["action-button","one-click-push",{"is-loading":o(m).isAddingFiles||o(m).isCommiting||o(m).isPushing}])},{default:l(()=>t[34]||(t[34]=[b(" 一键推送所有 ")])),_:1},8,["icon","loading","disabled","class"])]),_:1})])])]),e("div",ul,[t[38]||(t[38]=e("div",{class:"group-title"},"重置操作",-1)),e("div",dl,[s(T,{content:pt.value?`撤销${he.value}个已暂存文件`:"git reset HEAD",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"warning",icon:o(Bt),onClick:o(m).resetHead,loading:o(m).isResetting,disabled:!pt.value,class:"action-button reset-button"},{default:l(()=>[t[36]||(t[36]=b(" 重置暂存区 ")),he.value>0?(f(),w("span",fl,"("+A(he.value)+")",1)):W("",!0)]),_:1},8,["icon","onClick","loading","disabled"])]),_:1},8,["content"]),s(T,{content:"git reset --hard origin/branch",placement:"top",effect:"light","popper-class":"git-cmd-tooltip"},{default:l(()=>[s(G,{type:"danger",icon:o(cs),onClick:$e,loading:o(m).isResetting,disabled:!Ct.value,class:"action-button danger-button"},{default:l(()=>t[37]||(t[37]=[b(" 重置到远程 ")])),_:1},8,["icon","loading","disabled"])]),_:1})])])])])],64))]),s(C,{title:"简短描述模板设置",modelValue:H.value,"onUpdate:modelValue":t[10]||(t[10]=M=>H.value=M),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:l(()=>[e("div",pl,[e("div",vl,[s(oe,{modelValue:X.value,"onUpdate:modelValue":t[9]||(t[9]=M=>X.value=M),placeholder:J.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",ml,[J.value?(f(),ae(G,{key:0,onClick:Ie},{default:l(()=>t[40]||(t[40]=[b("取消")])),_:1})):W("",!0),s(G,{type:"primary",onClick:Ae,disabled:!X.value.trim()},{default:l(()=>[b(A(J.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",gl,[t[44]||(t[44]=e("h3",null,"已保存模板",-1)),k.value.length===0?(f(),ae(ce,{key:0,description:"暂无保存的模板"})):W("",!0),(f(!0),w(Te,null,De(k.value,(M,Je)=>(f(),ae(Pe,{key:Je,class:"template-item"},{default:l(()=>[s(ve,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:l(()=>[e("div",hl,A(M),1),e("div",yl,[s(G,{type:"primary",size:"small",onClick:Ue=>xe(M)},{default:l(()=>t[41]||(t[41]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:o(vt),onClick:Ue=>Ne(M,Je)},{default:l(()=>t[42]||(t[42]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:Ue=>Xe(M)},{default:l(()=>t[43]||(t[43]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(C,{title:"作用域模板设置",modelValue:ne.value,"onUpdate:modelValue":t[12]||(t[12]=M=>ne.value=M),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"template-dialog"},{default:l(()=>[e("div",wl,[e("div",_l,[s(oe,{modelValue:se.value,"onUpdate:modelValue":t[11]||(t[11]=M=>se.value=M),placeholder:K.value?"编辑作用域模板内容":"输入新作用域模板",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",bl,[K.value?(f(),ae(G,{key:0,onClick:Ye},{default:l(()=>t[45]||(t[45]=[b("取消")])),_:1})):W("",!0),s(G,{type:"primary",onClick:He,disabled:!se.value.trim()},{default:l(()=>[b(A(K.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"])])]),e("div",$l,[t[49]||(t[49]=e("h3",null,"已保存作用域",-1)),S.value.length===0?(f(),ae(ce,{key:0,description:"暂无保存的作用域"})):W("",!0),(f(!0),w(Te,null,De(S.value,(M,Je)=>(f(),ae(Pe,{key:Je,class:"template-item"},{default:l(()=>[s(ve,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:l(()=>[e("div",Cl,A(M),1),e("div",kl,[s(G,{type:"primary",size:"small",onClick:Ue=>je(M)},{default:l(()=>t[46]||(t[46]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:o(vt),onClick:Ue=>st(M,Je)},{default:l(()=>t[47]||(t[47]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:Ue=>Ce(M)},{default:l(()=>t[48]||(t[48]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])])]),_:1},8,["modelValue"]),s(C,{title:"默认提交信息设置",modelValue:L.value,"onUpdate:modelValue":t[14]||(t[14]=M=>L.value=M),width:"80vw",top:"70px",style:{height:"calc(100vh - 140px)"},"close-on-click-modal":!1,class:"message-template-dialog"},{default:l(()=>[e("div",Sl,[e("div",Tl,[s(oe,{modelValue:h.value,"onUpdate:modelValue":t[13]||(t[13]=M=>h.value=M),placeholder:re.value?"编辑模板内容":"输入新模板内容",class:"template-input",clearable:""},null,8,["modelValue","placeholder"]),e("div",xl,[re.value?(f(),ae(G,{key:0,onClick:ot},{default:l(()=>t[50]||(t[50]=[b("取消")])),_:1})):W("",!0),s(G,{type:"primary",onClick:kt,disabled:!h.value.trim()},{default:l(()=>[b(A(re.value?"更新模板":"添加模板"),1)]),_:1},8,["disabled"]),s(G,{type:"success",onClick:_,disabled:!h.value.trim()},{default:l(()=>t[51]||(t[51]=[b(" 设为默认提交信息 ")])),_:1},8,["disabled"])])]),e("div",Ll,[e("div",Al,[t[55]||(t[55]=e("h3",null,"已保存模板",-1)),e("div",Vl,[ye.value.length===0?(f(),ae(ce,{key:0,description:"暂无保存的模板"})):W("",!0),(f(!0),w(Te,null,De(ye.value,(M,Je)=>(f(),ae(Pe,{key:Je,class:"template-item"},{default:l(()=>[s(ve,{justify:"space-between",align:"middle",style:{width:"100%"}},{default:l(()=>[e("div",Rl,A(M),1),e("div",Bl,[s(G,{type:"primary",size:"small",onClick:Ue=>n(M)},{default:l(()=>t[52]||(t[52]=[b("使用")])),_:2},1032,["onClick"]),s(G,{type:"warning",size:"small",icon:o(vt),onClick:Ue=>Tt(M,Je)},{default:l(()=>t[53]||(t[53]=[b("编辑")])),_:2},1032,["icon","onClick"]),s(G,{type:"danger",size:"small",onClick:Ue=>u(M)},{default:l(()=>t[54]||(t[54]=[b("删除")])),_:2},1032,["onClick"])])]),_:2},1024)]),_:2},1024))),128))])]),e("div",Ml,[t[63]||(t[63]=e("h3",null,"当前默认提交信息",-1)),R.value?(f(),ae(Pe,{key:0,class:"default-message-card"},{default:l(()=>[e("div",zl,A(R.value),1)]),_:1})):(f(),ae(ce,{key:1,description:"尚未设置默认提交信息","image-size":100})),e("div",El,[t[61]||(t[61]=e("h4",null,"关于默认提交信息",-1)),t[62]||(t[62]=e("p",null,"默认提交信息将在未输入提交信息时自动使用。",-1)),e("p",null,[t[58]||(t[58]=b("你可以通过点击左侧模板的")),s(P,{size:"small",type:"primary"},{default:l(()=>t[56]||(t[56]=[b("使用")])),_:1}),t[59]||(t[59]=b("按钮先选择喜欢的模板,然后点击上方")),s(P,{size:"small",type:"success"},{default:l(()=>t[57]||(t[57]=[b("设为默认提交信息")])),_:1}),t[60]||(t[60]=b("按钮保存。"))])])])])])]),_:1},8,["modelValue"])])],2)}}}),Gl=$t(Dl,[["__scopeId","data-v-417b2868"]]),jl={class:"card"},Pl={key:0,class:"refresh-notification"},Ul={class:"log-header"},Ol={class:"log-actions"},Fl={key:1,class:"filter-panel-header"},Nl={class:"filter-form"},Il={class:"filter-item"},Hl={class:"filter-item"},Xl={class:"filter-item"},Wl={class:"filter-item"},Jl={class:"filter-actions"},ql={key:0},Yl={key:1,class:"content-area-content"},Zl={key:0,class:"graph-view"},Kl={key:0,class:"commit-count"},Ql={class:"graph-controls"},eo={class:"zoom-controls"},to={class:"scale-info"},so={key:1,class:"table-view-container"},ao=["id"],lo=["onClick"],oo={class:"author-name"},no={key:0,class:"branch-container"},io={key:0,class:"load-more-container"},ro={class:"pagination-info"},co={key:0,class:"loading-more"},uo={key:2,class:"no-more-data"},fo={key:0,class:"total-loaded"},po={class:"commit-detail-container"},vo={key:0,class:"commit-info"},mo={class:"commit-info-header"},go={class:"info-item"},ho={class:"item-value"},yo={class:"info-item"},wo={class:"item-value"},_o={class:"info-item"},bo={class:"item-value"},$o={class:"commit-message-container"},Co=["innerHTML"],ko={class:"commit-files-diff"},So={class:"files-list"},To={key:1},xo=["onClick"],Lo={class:"file-diff"},Ao={key:0},Vo={key:1},Ro=["innerHTML"],it=.5,mt=1.5,Vt=.1,Bo=yt({__name:"LogList",setup(ke,{expose:m}){const x=dt();let p=[];const g=c(p),U=c(""),R=c(!1),j=Ve(()=>x.isLoadingLog||R.value),I=c(!1),ee=c(0),z=c(!1),Z=c(null),V=c(1),k=c(!0),H=c(!1),X=c(null),J=c(!1),F=c(null),me=c([]),S=c(""),ne=c(!1),se=c(""),K=c(1),ie=c(!1),de=c(!1),L=c([]),h=c(""),E=c(null),B=c([]),N=c([]),ye=c([]),re=c(!1),Ee=c(0),Le=c(0),$=c(null),we=c(new Map),ge=c([]),Ae=c(1),Fe=c(new Map),Ne=Ve(()=>g.value);async function Ie(u=!1,n=1){if(!dt().isGitRepo){U.value="当前目录不是Git仓库";return}try{n>1?H.value=!0:R.value=!0,console.log(`加载提交历史: page=${n}, all=${u}`);const t=new URLSearchParams;t.append("page",n.toString()),t.append("all",u.toString()),t.append("with_parents","true"),L.value.length>0&&t.append("author",L.value.join(",")),N.value.length>0&&t.append("branch",N.value.join(",")),h.value&&t.append("message",h.value),E.value&&Array.isArray(E.value)&&E.value.length===2&&(t.append("dateFrom",E.value[0]),t.append("dateTo",E.value[1])),t.append("_t",Date.now().toString());const Q=await(await fetch(`/api/log?${t.toString()}`)).json();if(!Q||!Q.data||!Array.isArray(Q.data)){console.error("API返回的数据格式不正确:",Q),U.value="加载提交历史失败: 服务器返回数据格式不正确";return}const Y=n>1;Y?Q.data.forEach(T=>p.push(T)):(p.length=0,Q.data.forEach(T=>p.push(T))),g.value=[...p],V.value=n,ee.value=Q.total||p.length,k.value=Q.hasMore===!0,console.log(`加载完成: 当前页=${V.value}, 是否有更多=${k.value}, 总条数=${ee.value}`),k.value||console.log("已加载所有提交记录"),Y||(ie.value=!0,setTimeout(()=>{ie.value=!1},2e3)),!Y&&z.value?setTimeout(He,0):!Y&&!z.value&&!u&&Ze(()=>{y(),setTimeout(ot,200)}),U.value=""}catch(t){U.value="加载提交历史失败: "+(t instanceof Error?t.message:String(t)),console.error("加载日志失败:",t),n>1&&(k.value=!1)}finally{n>1?H.value=!1:R.value=!1}}async function He(){if(console.log(`开始渲染图表...数据长度: ${p.length}`),!Z.value){console.error("图表容器未找到");return}if(p.length===0){console.error("没有日志数据可渲染");return}try{Z.value.innerHTML="",console.log(`创建gitgraph实例,分支: ${x.currentBranch||"main"}`);const u=Cs(Z.value,{orientation:"vertical-reverse",template:"metro",author:"提交者 <committer@example.com>"}),n={},a=u.branch(x.currentBranch||"main");n[x.currentBranch||"main"]=a,console.log(`开始创建提交图...共${p.length}条提交`),p.forEach((t,te)=>{let Q=a;if(t.branch){const Y=Ye(t.branch.split(",")[0]);n[Y]||(n[Y]=u.branch(Y)),Q=n[Y]}Q.commit({hash:t.hash,subject:t.message,author:`${t.author} <${t.email}>`}),te%10===0&&console.log(`已渲染 ${te+1}/${p.length} 个提交`)}),console.log("图表渲染完成"),setTimeout(()=>{Re()},100)}catch(u){console.error("渲染图表失败:",u),U.value="渲染图表失败: "+(u instanceof Error?u.message:String(u))}}function Ke(){z.value=!z.value,z.value&&p.length>0&&setTimeout(He,0)}function st(){I.value=!I.value,I.value||(k.value=!0),V.value=1,Ie(I.value),Ze(()=>{setTimeout(()=>{!z.value&&!I.value&&(y(),ot())},300)})}function Ye(u){return u.includes("HEAD -> ")?u.replace("HEAD -> ",""):u.includes("origin/")?u:u.trim()}function Xe(u){return u.includes("HEAD")?"success":u.includes("origin/")?"warning":"info"}const Ce=c(null),xe=c(null);function je(u){if(z.value||!k.value||H.value||j.value)return;const n=u.target,{scrollTop:a,scrollHeight:t,clientHeight:te}=n,Q=t-a-te;console.log("表格滚动:",{scrollTop:a,scrollHeight:t,clientHeight:te,scrollDistance:Q,hasMoreData:k.value,isLoadingMore:H.value,isLoading:j.value}),Q<=20&&(console.log("已滚动到底部,加载更多数据"),_())}function y(){if(console.log("设置表格滚动监听 - 开始"),!Ce.value){console.error("tableRef.value 不存在");return}const u=Ce.value.$el.querySelector(".el-table__body-wrapper");if(!u){console.error("未找到表格的body-wrapper元素");return}console.log("找到表格的body-wrapper元素"),xe.value=u,xe.value&&(xe.value.removeEventListener("scroll",je,!0),xe.value.addEventListener("scroll",je,!0),console.log("成功添加表格滚动监听"))}function i(){console.log("移除表格滚动监听 - 开始"),xe.value?(xe.value.removeEventListener("scroll",je,!0),console.log("成功移除表格滚动监听"),xe.value=null):console.log("tableBodyWrapper.value 不存在,无需移除监听")}ft(()=>{x.isGitRepo?(x.log.length>0?(console.log("使用已加载的日志数据"),p.length=0,x.log.forEach(u=>p.push(u)),ee.value=x.log.length,z.value?setTimeout(()=>{console.log(`准备渲染图表,数据长度: ${p.length}`),He()},100):setTimeout(()=>{Be()},100)):(console.log("初始加载日志数据"),Ie()),he()):U.value="当前目录不是Git仓库",Ze(()=>{setTimeout(()=>{y()},500)}),Ze(()=>{setTimeout(()=>{z.value||Be()},500)}),Qe(()=>Ce.value,u=>{u&&!z.value&&!I.value&&(console.log("表格引用已创建,设置滚动监听"),Ze(()=>{y()}))})}),Qe(()=>x.allBranches,u=>{u&&u.length>0?(ye.value=[...u].sort(),console.log(`分支数据更新,共 ${ye.value.length} 个分支`)):(ye.value=[],console.warn("gitStore 中没有分支数据"))},{immediate:!0}),ds(()=>{i(),X.value!==null&&(window.clearInterval(X.value),X.value=null)});function O(u,n){let a=null;return function(...t){a&&clearTimeout(a),a=window.setTimeout(()=>{u(...t),a=null},n)}}const D=O(Be,200);async function ue(){await x.fetchLog(!0),p.length=0,x.log.forEach(u=>p.push(u)),g.value=[...p],ee.value=x.log.length,V.value=1,k.value=!1,ie.value=!0,setTimeout(()=>{ie.value=!1},2e3),z.value?(await Ze(),He()):(we.value.clear(),ge.value=[],Ae.value=1,await Ze(),D())}Qe(()=>x.log,u=>{console.log("监听到gitStore.log变化,更新图表数据");try{p.length=0,Array.isArray(u)&&u.forEach(n=>n&&p.push(n)),ee.value=p.length,V.value=1,g.value=[...p],ie.value=!0,setTimeout(()=>{ie.value=!1},2e3),console.log(`数据更新完成,共${g.value.length}条记录,准备渲染图表`),z.value&&p.length>0&&setTimeout(He,0)}catch(n){console.error("更新日志数据失败:",n)}},{immediate:!0}),m({refreshLog:ue});function Se(){K.value<mt&&(K.value=Math.min(mt,K.value+Vt),fe())}function _e(){K.value>it&&(K.value=Math.max(it,K.value-Vt),fe())}function fe(){if(!Z.value)return;const u=Z.value.querySelector("svg");u&&(u.style.transform=`scale(${K.value})`,u.style.transformOrigin="top left")}function Re(){if(!Z.value)return;const u=Z.value.querySelector("svg");if(!u)return;const n=u.getBoundingClientRect().width/K.value,a=Z.value.clientWidth;n>a?K.value=Math.max(it,a/n):K.value=1,fe()}async function be(u){if(u){F.value=u,J.value=!0,ne.value=!0,me.value=[],S.value="",se.value="",console.log("提交详情对象:",JSON.stringify(u,null,2)),console.log("哈希值类型和长度:",typeof u.hash,u.hash?u.hash.length:0),console.log("提交信息类型和长度:",typeof u.message,u.message?u.message.length:0),console.log("提交分支:",u.branch);try{if(console.log(`获取提交详情: ${u.hash}`),!u.hash||u.hash.length<7){console.error("无效的提交哈希值:",u.hash),S.value="无效的提交哈希值",ne.value=!1;return}const n=await fetch(`/api/commit-files?hash=${u.hash}`);console.log("API响应状态: ",n.status);const a=await n.json();console.log("文件列表数据: ",a),a.success&&Array.isArray(a.files)?(me.value=a.files,me.value.length>0?await $e(u.hash,me.value[0]):(console.log("没有找到变更文件"),S.value="该提交没有变更文件")):(console.error("获取提交文件列表失败:",a.error||"未知错误"),S.value=`获取文件列表失败: ${a.error||"未知错误"}`)}catch(n){console.error("获取提交详情失败:",n),S.value=`获取提交详情失败: ${n.message}`}finally{ne.value=!1}}}async function $e(u,n){ne.value=!0,se.value=n;try{console.log(`获取文件差异: hash=${u}, file=${n}`);const a=await fetch(`/api/commit-file-diff?hash=${u}&file=${encodeURIComponent(n)}`);console.log("差异API响应状态: ",a.status);const t=await a.json();console.log("差异数据: ",t.success,typeof t.diff),t.success?S.value=t.diff||"没有变更内容":(console.error("获取差异失败: ",t.error),S.value=`获取差异失败: ${t.error||"未知错误"}`)}catch(a){console.error("获取文件差异失败:",a),S.value=`获取差异失败: ${a.message}`}finally{ne.value=!1}}function v(u){if(!u)return"";const n=u.split(`
20
+ `);function a(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}return n.map(t=>{const te=a(t);return t.startsWith("diff --git")?`<div class="diff-header">${te}</div>`:t.startsWith("---")?`<div class="diff-old-file">${te}</div>`:t.startsWith("+++")?`<div class="diff-new-file">${te}</div>`:t.startsWith("@@")?`<div class="diff-hunk-header">${te}</div>`:t.startsWith("+")?`<div class="diff-added">${te}</div>`:t.startsWith("-")?`<div class="diff-removed">${te}</div>`:`<div class="diff-context">${te}</div>`}).join("")}function d(u){return u?(console.log("格式化前的提交信息:",u),console.log("提交信息中的换行符数量:",(u.match(/\n/g)||[]).length),u.trim()):"(无提交信息)"}function _(){if(!k.value||H.value||j.value){console.log("不满足加载更多条件:",{hasMoreData:k.value,isLoadingMore:H.value,isLoading:j.value});return}console.log(`加载更多日志,当前页码: ${V.value},下一页: ${V.value+1}`),Ie(I.value,V.value+1)}function le(){L.value=[],N.value=[],h.value="",E.value=null,V.value=1,Ie(I.value,1)}function We(){V.value=1,Ie(I.value,1)}async function he(){try{console.log("获取所有可用作者...");const n=await(await fetch("/api/authors")).json();n.success&&Array.isArray(n.authors)?(B.value=n.authors.sort(),console.log(`获取到${B.value.length}位作者`)):(console.warn("从API获取作者列表失败,将从现有日志中提取作者列表"),Ge())}catch(u){console.error("获取作者列表失败:",u),Ge()}}function Ge(){const u=new Set;g.value.forEach(n=>{n.author&&u.add(n.author)}),B.value=Array.from(u).sort(),console.log(`从现有日志中提取了${B.value.length}位作者`)}function Be(){!Ce.value||z.value||(we.value.clear(),ge.value=[],Ae.value=1,Me(),Ze(()=>{lt()}))}function Me(){we.value.clear(),ge.value=[],Fe.value.clear();const u=new Map,n=new Map;g.value.forEach(q=>{q.hash&&(q.parents&&q.parents.length>0?(u.set(q.hash,[...q.parents]),q.parents.forEach(pe=>{var ce;n.has(pe)||n.set(pe,[]),(ce=n.get(pe))==null||ce.push(q.hash)})):u.set(q.hash,[]))});const a=0,t="#2196f3",te=["#e91e63","#4caf50","#ff9800","#9c27b0","#00bcd4","#ff5722","#607d8b"],Q=new Map;g.value.forEach(q=>{if(!q.hash||!q.branch)return;const pe=q.branch.match(/(HEAD -> |origin\/)?([^\s,]+)/g);if(pe&&pe.length>0){const ce=pe.find(ve=>ve.includes("HEAD -> "));if(ce){const ve=ce.replace("HEAD -> ","").trim();Q.set(q.hash,ve)}else{const ve=pe[0].replace("origin/","").trim();Q.set(q.hash,ve)}}});const Y=new Map;let T=0;Y.set("main",a),Y.set("master",a),T++;const oe=new Map;oe.set("main",t),oe.set("master",t);const G=new Map;return g.value.forEach((q,pe)=>{if(!q.hash)return;const ce=q.hash,ve=Q.get(ce)||"main";if(!Y.has(ve)){Y.set(ve,T++);const C=(Y.get(ve)||0)%te.length;oe.set(ve,te[C])}const Pe=Y.get(ve)||0;G.set(ce,Pe),we.value.set(ce,{hash:ce,parents:q.parents||[],column:Pe,row:pe,branch:ve}),Fe.value.has(ve)||Fe.value.set(ve,{name:ve,color:oe.get(ve)||t,column:Pe})}),g.value.forEach((q,pe)=>{if(!q.hash||!q.parents||q.parents.length===0)return;const ce=we.value.get(q.hash);if(!ce)return;const ve=ce.column,Pe=ce.branch||"main",C=oe.get(Pe)||t;q.parents.forEach((P,M)=>{const Je=g.value.findIndex(as=>as.hash===P);if(Je<0)return;const Ue=we.value.get(P);if(!Ue)return;const es=Ue.column,ts=Ue.branch||"main",ss=oe.get(ts)||t;let zt=C;q.parents&&q.parents.length>1&&M>0&&(zt=ss),ge.value.push({fromRow:pe,fromColumn:ve,toRow:Je,toColumn:es,color:zt})})}),Ae.value=T,{mainBranchColor:t,branchColorMap:oe}}let tt=!1;function lt(){if(tt){console.log("已有渲染进行中,跳过");return}try{tt=!0;const u=new Map;u.set("main","#2196f3"),u.set("master","#2196f3");const n="#2196f3";if(ge.value.length===0){if(console.log("branchLines为空,重新计算"),Me(),ge.value.length===0&&g.value.length>1){console.log("创建默认分支线");for(let a=0;a<g.value.length-1;a++)g.value[a].hash&&g.value[a+1].hash&&ge.value.push({fromRow:a,fromColumn:0,toRow:a+1,toColumn:0,color:n})}}else console.log(`使用现有分支线,数量: ${ge.value.length}`);g.value.forEach((a,t)=>{if(!a.hash)return;const te=`commit-graph-${a.hash.substring(0,7)}`,Q=document.getElementById(te);if(!Q||Q.querySelector("svg"))return;const Y=document.createElementNS("http://www.w3.org/2000/svg","svg");Y.setAttribute("width","100%"),Y.setAttribute("height","100%"),Y.setAttribute("viewBox","0 0 100 100"),Y.style.display="block",Y.style.overflow="visible",Q.innerHTML="",Q.appendChild(Y);const T=we.value.get(a.hash);if(!T)return;const oe=20,G=10+T.column*oe,q=50,pe=[];for(const C of ge.value)C.fromRow<t&&C.toRow>t&&pe.push({...C,type:"through",x:10+C.fromColumn*oe});for(const C of ge.value)C.fromRow===t&&pe.push({...C,type:"from",fromX:10+C.fromColumn*oe,toX:10+C.toColumn*oe});for(const C of ge.value)C.toRow===t&&pe.push({...C,type:"to",fromX:10+C.fromColumn*oe,toX:10+C.toColumn*oe});pe.length===0&&t<g.value.length-1&&(ge.value.length>0?pe.push({...ge.value[0],type:"from",fromX:G,toX:G}):pe.push({type:"from",fromX:G,toX:G,fromRow:t,fromColumn:0,toRow:t+1,toColumn:0,color:n})),pe.filter(C=>C.type==="through").forEach(C=>{const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",C.x.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",C.x.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",C.color),P.setAttribute("stroke-width","2"),Y.appendChild(P)}),pe.filter(C=>C.type==="to").forEach(C=>{if(C.fromColumn===C.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",C.toX.toString()),P.setAttribute("y1","-20"),P.setAttribute("x2",C.toX.toString()),P.setAttribute("y2",q.toString()),P.setAttribute("stroke",C.color),P.setAttribute("stroke-width","2"),Y.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");C.fromColumn<C.toColumn?P.setAttribute("d",`M${C.fromX},-20 C${C.fromX},15 ${C.toX},30 ${C.toX},${q}`):P.setAttribute("d",`M${C.fromX},-20 C${C.fromX},15 ${C.toX},30 ${C.toX},${q}`),P.setAttribute("stroke",C.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),Y.appendChild(P)}}),pe.filter(C=>C.type==="from").forEach(C=>{if(C.fromColumn===C.toColumn){const P=document.createElementNS("http://www.w3.org/2000/svg","line");P.setAttribute("x1",C.fromX.toString()),P.setAttribute("y1",q.toString()),P.setAttribute("x2",C.fromX.toString()),P.setAttribute("y2","120"),P.setAttribute("stroke",C.color),P.setAttribute("stroke-width","2"),Y.appendChild(P)}else{const P=document.createElementNS("http://www.w3.org/2000/svg","path");C.fromColumn<C.toColumn?P.setAttribute("d",`M${C.fromX},${q} C${C.fromX},70 ${C.toX},85 ${C.toX},120`):P.setAttribute("d",`M${C.fromX},${q} C${C.fromX},70 ${C.toX},85 ${C.toX},120`),P.setAttribute("stroke",C.color),P.setAttribute("stroke-width","2"),P.setAttribute("fill","none"),Y.appendChild(P)}});const ce=document.createElementNS("http://www.w3.org/2000/svg","circle");ce.setAttribute("cx",G.toString()),ce.setAttribute("cy",q.toString()),ce.setAttribute("r","6");const ve=T.branch||"",Pe=u.get(ve)||n;ce.setAttribute("fill",Pe),ce.setAttribute("stroke","#fff"),ce.setAttribute("stroke-width","2"),Y.appendChild(ce)})}catch(u){console.error("渲染分支图失败:",u),U.value="渲染分支图失败: "+(u instanceof Error?u.message:String(u))}finally{tt=!1}}Qe(()=>g.value,()=>{Ze(()=>{z.value||D()})},{deep:!0});function pt(u,n,a){console.log("handleContextMenu",u,n,a),a.preventDefault(),Ee.value=a.clientY,Le.value=a.clientX,$.value=u,re.value=!0;const t=()=>{re.value=!1,document.removeEventListener("click",t)};setTimeout(()=>{document.addEventListener("click",t)},0)}async function Ct(u){if(u)try{await et.confirm(`确定要撤销提交 ${u.hash.substring(0,7)} 吗?这将创建一个新的提交来撤销这次提交的更改。`,"撤销提交确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const a=await(await fetch("/api/revert-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:u.hash})})).json();a.success?(r.success(a.message||"已成功撤销提交"),ue(),x.fetchStatus(),x.getBranchStatus()):r.error(a.error||"撤销提交失败")}catch(n){n!=="cancel"&&(console.error("撤销提交出错:",n),r.error("撤销提交失败: "+(n.message||n)))}}async function kt(u){if(u)try{await et.confirm(`确定要将提交 ${u.hash.substring(0,7)} Cherry-Pick 到当前分支吗?`,"Cherry-Pick确认",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"});const a=await(await fetch("/api/cherry-pick-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:u.hash})})).json();a.success?(r.success(a.message||"已成功Cherry-Pick提交"),ue(),x.fetchStatus(),x.getBranchStatus()):r.error(a.error||"Cherry-Pick提交失败")}catch(n){n!=="cancel"&&(console.error("Cherry-Pick提交出错:",n),r.error("Cherry-Pick提交失败: "+(n.message||n)))}}async function St(u){if(u)try{await navigator.clipboard.writeText(u.hash),r.success(`已复制提交哈希: ${u.hash.substring(0,7)}`)}catch(n){console.error("复制提交哈希失败:",n),r.error(`复制提交哈希失败: ${n.message}`)}}async function Tt(u){if(u)try{await et.confirm(`确定要将当前分支重置(hard)到提交 ${u.hash.substring(0,7)} 吗?
21
+
22
+ 警告:这将丢失该提交之后的所有更改!`,"重置确认",{confirmButtonText:"确认重置",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0});const a=await(await fetch("/api/reset-to-commit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:u.hash})})).json();a.success?(r.success(a.message||"已成功重置到指定提交"),ue(),x.fetchStatus(),x.getBranchStatus()):r.error(a.error||"重置到指定提交失败")}catch(n){n!=="cancel"&&(console.error("重置到指定提交出错:",n),r.error("重置到指定提交失败: "+(n.message||n)))}}function ot(){if(console.log("检查是否需要加载更多数据"),z.value||!k.value||H.value||j.value||I.value){console.log("不满足加载条件:",{showGraphView:z.value,hasMoreData:k.value,isLoadingMore:H.value,isLoading:j.value,showAllCommits:I.value});return}if(!xe.value){console.log("表格容器不存在,重新设置滚动监听"),y();return}const{scrollTop:u,scrollHeight:n,clientHeight:a}=xe.value,t=n-u-a;console.log("表格滚动位置:",{scrollTop:u,scrollHeight:n,clientHeight:a,scrollDistance:t}),t<=50&&(console.log("表格已滚动到底部,加载更多数据"),_())}return Qe(()=>z.value,u=>{!u&&!I.value&&(console.log("切换到表格视图,设置滚动监听和定时检查"),Ze(()=>{y(),setTimeout(ot,200)}))}),(u,n)=>{var Y;const a=_t,t=Rt,te=Yt,Q=Wt;return f(),w(Te,null,[e("div",jl,[ie.value?(f(),w("div",Pl,"提交历史已刷新")):W("",!0),e("div",Ul,[n[14]||(n[14]=e("div",{class:"header-left"},[e("h2",null,"提交历史")],-1)),e("div",Ol,[z.value?W("",!0):(f(),ae(o(Oe),{key:0,type:de.value?"primary":"default",size:"small",onClick:n[0]||(n[0]=T=>de.value=!de.value),class:qe(["action-button filter-button",{"active-filter":de.value}])},{icon:l(()=>[s(a,null,{default:l(()=>[s(o(ps))]),_:1})]),default:l(()=>[n[13]||(n[13]=b(" 筛选 ")),Ne.value.length!==g.value.length?(f(),ae(o(fs),{key:0,value:Ne.value.length,class:"filter-badge"},null,8,["value"])):W("",!0)]),_:1},8,["type","class"])),s(o(Oe),{type:"primary",size:"small",onClick:Ke,class:qe(["action-button view-mode-button",{"active-view":z.value}])},{icon:l(()=>[s(a,null,{default:l(()=>[(f(),ae(jt(z.value?o(Xt):o(vs))))]),_:1})]),default:l(()=>[b(" "+A(z.value?"表格视图":"图表视图"),1)]),_:1},8,["class"]),s(o(Oe),{type:"success",size:"small",onClick:st,loading:j.value,class:qe(["action-button commit-display-button",{"active-commits":I.value}])},{icon:l(()=>[s(a,null,{default:l(()=>[(f(),ae(jt(I.value?o(ms):o(gs))))]),_:1})]),default:l(()=>[b(" "+A(I.value?"显示分页加载":"显示所有提交"),1)]),_:1},8,["loading","class"]),s(o(Oe),{circle:"",size:"small",onClick:n[1]||(n[1]=T=>ue()),class:qe([{"refresh-button-animated":ie.value},"action-button refresh-button"])},{default:l(()=>[j.value?(f(),ae(a,{key:1},{default:l(()=>[s(o(hs))]),_:1})):(f(),ae(a,{key:0},{default:l(()=>[s(o(Bt))]),_:1}))]),_:1},8,["class"])])]),de.value&&!z.value?(f(),w("div",Fl,[e("div",Nl,[e("div",Il,[s(o(ht),{modelValue:L.value,"onUpdate:modelValue":n[2]||(n[2]=T=>L.value=T),placeholder:"选择作者",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:l(()=>n[15]||(n[15]=[e("span",{class:"compact-label"},"作者",-1)])),default:l(()=>[(f(!0),w(Te,null,De(B.value,T=>(f(),ae(o(gt),{key:T,label:T,value:T},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Hl,[s(o(ht),{modelValue:N.value,"onUpdate:modelValue":n[3]||(n[3]=T=>N.value=T),placeholder:"选择分支",multiple:"",clearable:"",filterable:"",class:"filter-input",size:"small"},{prefix:l(()=>n[16]||(n[16]=[e("span",{class:"compact-label"},"分支",-1)])),default:l(()=>[(f(!0),w(Te,null,De(ye.value,T=>(f(),ae(o(gt),{key:T,label:T,value:T},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Xl,[s(o(Mt),{modelValue:h.value,"onUpdate:modelValue":n[4]||(n[4]=T=>h.value=T),placeholder:"提交信息关键词",clearable:"",class:"filter-input",size:"small"},{prefix:l(()=>n[17]||(n[17]=[e("span",{class:"compact-label"},"信息",-1)])),_:1},8,["modelValue"])]),e("div",Wl,[s(o(ys),{modelValue:E.value,"onUpdate:modelValue":n[5]||(n[5]=T=>E.value=T),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD","value-format":"YYYY-MM-DD",class:"filter-input date-range",size:"small"},{prefix:l(()=>n[18]||(n[18]=[e("span",{class:"compact-label"},"日期",-1)])),_:1},8,["modelValue"])]),e("div",Jl,[s(o(Oe),{type:"primary",size:"small",onClick:We,class:"filter-action-button"},{default:l(()=>n[19]||(n[19]=[b("应用")])),_:1}),s(o(Oe),{type:"info",size:"small",onClick:le,class:"filter-action-button"},{default:l(()=>n[20]||(n[20]=[b("重置")])),_:1})])])])):W("",!0),e("div",{class:qe(["content-area",{"with-filter":de.value&&!z.value}])},[U.value?(f(),w("div",ql,A(U.value),1)):(f(),w("div",Yl,[z.value?(f(),w("div",Zl,[o(p).length>0?(f(),w("div",Kl," 显示 "+A(o(p).length)+" 条提交记录 "+A(I.value?"(全部)":"(分页加载,每页100条)"),1)):W("",!0),e("div",Ql,[e("div",eo,[s(o(Oe),{type:"primary",circle:"",size:"small",onClick:_e,disabled:K.value<=it},{default:l(()=>[s(a,null,{default:l(()=>[s(o(ws))]),_:1})]),_:1},8,["disabled"]),s(o(_s),{modelValue:K.value,"onUpdate:modelValue":n[6]||(n[6]=T=>K.value=T),min:it,max:mt,step:Vt,onChange:fe,class:"zoom-slider"},null,8,["modelValue"]),s(o(Oe),{type:"primary",circle:"",size:"small",onClick:Se,disabled:K.value>=mt},{default:l(()=>[s(a,null,{default:l(()=>[s(o(bs))]),_:1})]),_:1},8,["disabled"]),s(o(Oe),{type:"primary",size:"small",onClick:Re},{default:l(()=>n[21]||(n[21]=[b(" 自适应大小 ")])),_:1})]),e("div",to," 缩放: "+A(Math.round(K.value*100))+"% ",1)]),e("div",{ref_key:"graphContainer",ref:Z,class:"graph-container"},null,512)])):(f(),w("div",so,[ct((f(),ae(o($s),{ref_key:"tableRef",ref:Ce,data:Ne.value,stripe:"",border:"",class:"log-table","empty-text":j.value?"加载中...":"没有匹配的提交记录",height:"500",onRowContextmenu:pt},{default:l(()=>[s(o(at),{width:"60","class-name":"branch-graph-column"},{default:l(T=>[e("div",{class:"branch-graph-cell",id:`commit-graph-${T.row.hash.substring(0,7)}`},null,8,ao)]),_:1}),s(o(at),{label:"提交哈希",width:"100",resizable:""},{default:l(T=>[e("span",{class:"commit-hash",onClick:oe=>be(T.row)},A(T.row.hash.substring(0,7)),9,lo)]),_:1}),s(o(at),{prop:"date",label:"日期",width:"120",resizable:""}),s(o(at),{label:"作者",width:"120",resizable:""},{default:l(T=>[s(t,{content:T.row.email,placement:"top","hide-after":1e3},{default:l(()=>[e("span",oo,A(T.row.author),1)]),_:2},1032,["content"])]),_:1}),s(o(at),{label:"分支",width:"180",resizable:""},{default:l(T=>[T.row.branch?(f(),w("div",no,[(f(!0),w(Te,null,De(T.row.branch.split(","),(oe,G)=>(f(),ae(o(wt),{key:G,size:"small",type:Xe(oe),class:"branch-tag"},{default:l(()=>[b(A(Ye(oe)),1)]),_:2},1032,["type"]))),128))])):W("",!0)]),_:1}),s(o(at),{prop:"message",label:"提交信息","min-width":"250"})]),_:1},8,["data","empty-text"])),[[Q,j.value]]),I.value?W("",!0):(f(),w("div",io,[e("div",ro,[e("span",null,"第 "+A(V.value)+" 页 "+A(ee.value>0?`/ 共 ${Math.ceil(ee.value/100)||1} 页`:"")+" (总计 "+A(ee.value)+" 条记录)",1)]),H.value?(f(),w("div",co,n[22]||(n[22]=[e("div",{class:"loading-spinner"},null,-1),e("span",null,"加载更多...",-1)]))):k.value?(f(),w("div",{key:1,class:"load-more-button",onClick:_},n[23]||(n[23]=[e("span",null,"加载更多",-1)]))):(f(),w("div",uo,[n[24]||(n[24]=e("span",null,"没有更多数据了",-1)),g.value.length>0?(f(),w("span",fo,"(已加载 "+A(g.value.length)+" 条记录)",1)):W("",!0)]))]))]))]))],2),s(o(bt),{modelValue:J.value,"onUpdate:modelValue":n[7]||(n[7]=T=>J.value=T),title:`提交详情: ${(Y=F.value)!=null&&Y.hash?F.value.hash.substring(0,7):"未知"}`,width:"80%","destroy-on-close":"",class:"commit-detail-dialog"},{default:l(()=>[ct((f(),w("div",po,[F.value?(f(),w("div",vo,[e("div",mo,[e("div",go,[n[25]||(n[25]=e("span",{class:"item-label"},"哈希:",-1)),e("span",ho,A(F.value.hash),1)]),e("div",yo,[n[26]||(n[26]=e("span",{class:"item-label"},"作者:",-1)),e("span",wo,A(F.value.author)+" <"+A(F.value.email)+">",1)]),e("div",_o,[n[27]||(n[27]=e("span",{class:"item-label"},"日期:",-1)),e("span",bo,A(F.value.date),1)])]),e("div",$o,[n[28]||(n[28]=e("div",{class:"message-label"},"提交信息:",-1)),e("div",{class:"message-content",innerHTML:d(F.value.message).replace(/\n/g,"<br>")},null,8,Co)])])):W("",!0),e("div",ko,[e("div",So,[n[29]||(n[29]=e("h3",null,"变更文件",-1)),me.value.length===0?(f(),ae(te,{key:0,description:"没有找到变更文件"})):(f(),w("ul",To,[(f(!0),w(Te,null,De(me.value,T=>(f(),w("li",{key:T,class:qe({"active-file":T===se.value}),onClick:oe=>$e(F.value.hash,T)},A(T),11,xo))),128))]))]),e("div",Lo,[se.value?(f(),w("h3",Ao," 文件差异: "+A(se.value),1)):(f(),w("h3",Vo,"文件差异")),!S.value&&!ne.value?(f(),ae(te,{key:2,description:"选择文件查看差异"})):S.value?(f(),w("div",{key:3,innerHTML:v(S.value),class:"diff-content"},null,8,Ro)):W("",!0)])])])),[[Q,ne.value]])]),_:1},8,["modelValue","title"])]),ct(e("div",{class:"context-menu",style:rt({top:Ee.value+"px",left:Le.value+"px"})},[e("div",{class:"context-menu-item",onClick:n[8]||(n[8]=T=>be($.value))},n[30]||(n[30]=[e("i",{class:"el-icon-view"},null,-1),b(" 查看详情 ")])),e("div",{class:"context-menu-item",onClick:n[9]||(n[9]=T=>St($.value))},n[31]||(n[31]=[e("i",{class:"el-icon-document-copy"},null,-1),b(" 复制提交哈希 ")])),e("div",{class:"context-menu-item",onClick:n[10]||(n[10]=T=>Tt($.value))},n[32]||(n[32]=[e("i",{class:"el-icon-refresh-right"},null,-1),b(" 重置到该提交(hard) ")])),e("div",{class:"context-menu-item",onClick:n[11]||(n[11]=T=>Ct($.value))},n[33]||(n[33]=[e("i",{class:"el-icon-delete"},null,-1),b(" 撤销提交 (Revert) ")])),e("div",{class:"context-menu-item",onClick:n[12]||(n[12]=T=>kt($.value))},n[34]||(n[34]=[e("i",{class:"el-icon-edit"},null,-1),b(" Cherry-Pick 到当前分支 ")]))],4),[[qt,re.value]])],64)}}}),Mo=$t(Bo,[["__scopeId","data-v-a24f735a"]]),zo="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20xmlns='http://www.w3.org/2000/svg'%3e%3c!--%20主分支%20--%3e%3cline%20x1='40'%20y1='40'%20x2='40'%20y2='160'%20stroke='%2334495e'%20stroke-width='8'%20stroke-linecap='round'%20/%3e%3c!--%20特性分支%20--%3e%3cpath%20d='M40,70%20C60,70%2080,90%2080,110%20L80,130'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20开发分支%20--%3e%3cpath%20d='M40,100%20C60,100%20100,110%20100,130%20L100,160'%20stroke='%232ecc71'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20修复分支%20--%3e%3cpath%20d='M40,130%20C60,130%20120,140%20120,160'%20stroke='%23e74c3c'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20合并点%20--%3e%3cpath%20d='M80,130%20C80,145%2060,145%2040,145'%20stroke='%233498db'%20stroke-width='8'%20stroke-linecap='round'%20stroke-linejoin='round'%20fill='none'%20/%3e%3c!--%20节点%20--%3e%3ccircle%20cx='40'%20cy='40'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='70'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='100'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='130'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='145'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='40'%20cy='160'%20r='10'%20fill='%2334495e'%20/%3e%3ccircle%20cx='80'%20cy='130'%20r='10'%20fill='%233498db'%20/%3e%3ccircle%20cx='100'%20cy='160'%20r='10'%20fill='%232ecc71'%20/%3e%3ccircle%20cx='120'%20cy='160'%20r='10'%20fill='%23e74c3c'%20/%3e%3c/svg%3e",Eo={class:"main-header"},Do={class:"header-left"},Go=["src"],jo={class:"header-info"},Po={key:0,id:"user-info"},Uo={class:"user-name"},Oo={class:"user-email"},Fo={key:1,id:"user-info"},No={class:"directory-selector"},Io={class:"directory-display"},Ho={class:"directory-icon"},Xo=["title"],Wo={class:"directory-actions"},Jo={class:"main-container"},qo={key:0,class:"loading-container"},Yo={class:"loading-spinner"},Zo={key:1,class:"grid-layout"},Ko={class:"git-status-panel"},Qo={key:0,class:"commit-form-panel"},en={key:0,class:"card"},tn={class:"tips"},sn={key:1,class:"commit-form-panel"},an={key:2,class:"log-list-panel"},ln={class:"dialog-footer"},on={class:"main-footer"},nn={key:0,class:"branch-info"},rn={class:"branch-wrapper"},cn={key:1,class:"footer-right"},un={class:"repo-url"},dn={class:"dialog-footer"},fn={class:"directory-input-group"},pn={class:"recent-directories"},vn={class:"dialog-footer"},mn=yt({__name:"App",setup(ke){const m=c(""),x=c(null),p=c(null),g=dt(),U=Kt(),R=c(!1),j=c("");function I(){U.config&&(m.value=`默认提交信息: ${U.config.defaultCommitMessage}`)}async function ee(){try{const i=await(await fetch("/api/current_directory")).json();return j.value=i.directory||"未知目录",i}catch(y){return console.error("获取当前目录失败:",y),{directory:"未知目录",isGitRepo:!1}}}ft(async()=>{console.log("---------- 页面初始化开始 ----------");try{const y=await ee();U.isLoaded||await U.loadConfig(),I(),g.isGitRepo=y.isGitRepo===!0,g.lastCheckedTime=Date.now(),g.isGitRepo?await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]):r.warning("当前目录不是Git仓库,部分功能将不可用")}catch(y){console.error("初始化失败:",y)}finally{R.value=!0,console.log("---------- 页面初始化完成 ----------"),setTimeout(()=>{N()},100)}});const z=c(!1),Z=c(""),V=c("");async function k(){await g.createBranch(Z.value,V.value)&&(z.value=!1,Z.value="",p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog())}function H(){V.value=g.currentBranch,z.value=!0}async function X(y){await g.changeBranch(y)&&(p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog())}const J=c(!1),F=c(""),me=c("");function S(){F.value=g.userName,me.value=g.userEmail,J.value=!0}async function ne(){if(!F.value||!me.value){r.warning("用户名和邮箱不能为空");return}await g.restoreUserConfig(F.value,me.value)&&(J.value=!1)}async function se(){await g.clearUserConfig()&&(F.value="",me.value="")}let K=!1,ie=!1,de=0,L=0,h="",E="";function B(){const y=document.querySelector(".grid-layout");if(!y)return;const i=getComputedStyle(y).gridTemplateColumns.split(" "),O=getComputedStyle(y).gridTemplateRows.split(" ");if(i.length>=3&&O.length>=3){const D=parseFloat(i[0]),ue=parseFloat(i[2]),Se=D+ue,_e=D/Se,fe=parseFloat(O[0]),Re=parseFloat(O[2]),be=fe+Re,$e=fe/be;localStorage.setItem("zen-gitsync-layout-left-ratio",_e.toString()),localStorage.setItem("zen-gitsync-layout-top-ratio",$e.toString()),console.log(`布局比例已保存 - 左侧: ${(_e*100).toFixed(0)}%, 上方: ${($e*100).toFixed(0)}%`)}}function N(){const y=document.querySelector(".grid-layout");if(!y)return;const i=localStorage.getItem("zen-gitsync-layout-left-ratio"),O=localStorage.getItem("zen-gitsync-layout-top-ratio");if(i){const D=parseFloat(i),ue=1-D;y.style.gridTemplateColumns=`${D}fr 8px ${ue}fr`,console.log(`已恢复左侧比例: ${(D*100).toFixed(0)}%`)}else y.style.gridTemplateColumns="1fr 8px 3fr";if(O){const D=parseFloat(O),ue=1-D;y.style.gridTemplateRows=`${D}fr 8px ${ue}fr`,console.log(`已恢复上方比例: ${(D*100).toFixed(0)}%`)}}function ye(y){var O;K=!0,de=y.clientX;const i=document.querySelector(".grid-layout");h=getComputedStyle(i).gridTemplateColumns,(O=document.getElementById("v-resizer"))==null||O.classList.add("active"),document.addEventListener("mousemove",re),document.addEventListener("mouseup",Ee),y.preventDefault()}function re(y){if(!K)return;const i=document.querySelector(".grid-layout"),O=y.clientX-de,D=h.split(" ");if(D.length>=3){const ue=parseFloat(D[0]),Se=parseFloat(D[2]),_e=ue+Se,fe=(ue+O/i.clientWidth*_e)/_e,Re=1-fe,be=.1,$e=.5;fe<be?i.style.gridTemplateColumns=`${be}fr 8px ${1-be}fr`:fe>$e?i.style.gridTemplateColumns=`${$e}fr 8px ${1-$e}fr`:i.style.gridTemplateColumns=`${fe}fr 8px ${Re}fr`}}function Ee(){var y;K=!1,(y=document.getElementById("v-resizer"))==null||y.classList.remove("active"),document.removeEventListener("mousemove",re),document.removeEventListener("mouseup",Ee),B()}function Le(y){var O;ie=!0,L=y.clientY;const i=document.querySelector(".grid-layout");E=getComputedStyle(i).gridTemplateRows,(O=document.getElementById("h-resizer"))==null||O.classList.add("active"),document.addEventListener("mousemove",$),document.addEventListener("mouseup",we),y.preventDefault()}function $(y){if(!ie)return;const i=document.querySelector(".grid-layout"),O=y.clientY-L,D=E.split(" ");if(D.length>=3){const ue=parseFloat(D[0]),Se=parseFloat(D[2]),_e=ue+Se,fe=(ue+O/i.clientHeight*_e)/_e,Re=1-fe,be=.2,$e=.8;fe<be?i.style.gridTemplateRows=`${be}fr 8px ${1-be}fr`:fe>$e?i.style.gridTemplateRows=`${$e}fr 8px ${1-$e}fr`:i.style.gridTemplateRows=`${fe}fr 8px ${Re}fr`}}function we(){var y;ie=!1,(y=document.getElementById("h-resizer"))==null||y.classList.remove("active"),document.removeEventListener("mousemove",$),document.removeEventListener("mouseup",we),B()}const ge=c(!1),Ae=c(""),Fe=c(!1),Ne=c([]);async function Ie(){if(!j.value){r.warning("当前目录路径为空");return}try{await navigator.clipboard.writeText(j.value),r.success("已复制目录路径")}catch(y){console.error("复制目录路径失败:",y),r.error(`复制失败: ${y.message}`)}}function He(){Ae.value=j.value,ge.value=!0,Ke()}async function Ke(){try{const i=await(await fetch("/api/recent_directories")).json();i.success&&Array.isArray(i.directories)&&(Ne.value=i.directories)}catch(y){console.error("获取最近目录失败:",y)}}async function st(){if(!Ae.value){r.warning("目录路径不能为空");return}try{Fe.value=!0;const i=await(await fetch("/api/change_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:Ae.value})})).json();i.success?(r.success("已切换工作目录"),j.value=i.directory,ge.value=!1,await Ye(i.directory),g.isGitRepo=i.isGitRepo,i.isGitRepo?(await Promise.all([g.getCurrentBranch(),g.getAllBranches(),g.getUserInfo(),g.getRemoteUrl()]),p.value&&p.value.refreshStatus(),x.value&&x.value.refreshLog()):(r.warning("当前目录不是Git仓库,部分功能将不可用"),g.$reset())):r.error(i.error||"切换目录失败")}catch(y){r.error(`切换目录失败: ${y.message}`)}finally{Fe.value=!1}}async function Ye(y){try{await fetch("/api/save_recent_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:y})})}catch(i){console.error("保存最近目录失败:",i)}}async function Xe(){try{if(!j.value){r.warning("当前目录路径为空");return}const i=await(await fetch("/api/open_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:j.value})})).json();i.success?r.success("已在文件管理器中打开目录"):i.error&&r.error(i.error)}catch(y){console.error("打开目录失败:",y),r.error(`打开目录失败: ${y.message}`)}}async function Ce(){try{const i=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:Ae.value||j.value})})).json();i.success?xe(i):i.error&&r.error(i.error)}catch(y){console.error("浏览目录失败:",y),r.error(`浏览目录失败: ${y.message}`)}}function xe(y){!y||!y.items||et.alert(ze("div",{class:"directory-browser"},[ze("div",{class:"current-path"},[ze("span",{class:"path-label"},"当前路径: "),ze("span",{class:"path-value"},y.path)]),ze("div",{class:"directory-list"},[y.parentPath?ze("div",{class:"directory-item parent-dir",onClick:()=>{je(y.parentPath)}},[ze("span",{class:"dir-icon"},ze("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#E6A23C"}},[ze("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),ze("span",{class:"dir-name"},"返回上级目录")]):null,...y.items.map(i=>ze("div",{class:"directory-item",onClick:()=>{je(i.path)}},[ze("span",{class:"dir-icon"},ze("svg",{class:"folder-icon",viewBox:"0 0 24 24",width:"20",height:"20",style:{fill:"#409EFF"}},[ze("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])),ze("span",{class:"dir-name"},i.name)]))])]),"浏览并选择目录",{confirmButtonText:"使用当前目录",customClass:"directory-browser-dialog",callback:i=>{i==="confirm"&&(Ae.value=y.path)}})}async function je(y){try{et.close(),setTimeout(async()=>{try{const O=await(await fetch("/api/browse_directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPath:y})})).json();O.success?xe(O):O.error&&r.error(O.error)}catch(i){console.error("浏览目录失败:",i),r.error(`浏览目录失败: ${i.message}`)}},100)}catch(i){console.error("处理目录选择时出错:",i),r.error(`处理目录选择时出错: ${i.message}`)}}return(y,i)=>{const O=_t,D=Oe,ue=Zt,Se=Mt,_e=Ss,fe=gt,Re=ht,be=ks,$e=bt,v=Jt,d=wt;return f(),w(Te,null,[e("header",Eo,[e("div",Do,[e("img",{src:o(zo),alt:"Zen GitSync Logo",class:"logo"},null,8,Go),i[14]||(i[14]=e("h1",null,"Zen GitSync UI",-1))]),e("div",jo,[o(g).userName&&o(g).userEmail?(f(),w("div",Po,[i[15]||(i[15]=e("span",{class:"user-label"},"用户:",-1)),e("span",Uo,A(o(g).userName),1),e("span",Oo,"<"+A(o(g).userEmail)+">",1),s(D,{type:"primary",size:"small",onClick:S,class:"user-settings-btn",circle:""},{default:l(()=>[s(O,null,{default:l(()=>[s(o(ut))]),_:1})]),_:1})])):(f(),w("div",Fo,[i[16]||(i[16]=e("span",{class:"user-label"},"用户: ",-1)),i[17]||(i[17]=e("span",{class:"user-warning"},"未配置",-1)),s(D,{type:"primary",size:"small",onClick:S,class:"user-settings-btn",circle:""},{default:l(()=>[s(O,null,{default:l(()=>[s(o(ut))]),_:1})]),_:1})])),e("div",No,[e("div",Io,[e("div",Ho,[s(O,null,{default:l(()=>[s(o(Pt))]),_:1})]),e("div",{class:"directory-path",title:j.value},A(j.value),9,Xo)]),e("div",Wo,[s(D,{type:"primary",size:"small",onClick:He,class:"dir-button",circle:"",title:"切换目录"},{default:l(()=>[s(O,null,{default:l(()=>i[18]||(i[18]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192H128zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32z"})],-1)])),_:1})]),_:1}),s(D,{type:"success",size:"small",onClick:Xe,class:"dir-button",circle:"",title:"在资源管理器中打开"},{default:l(()=>[s(O,null,{default:l(()=>i[19]||(i[19]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"})],-1)])),_:1})]),_:1}),s(D,{type:"info",size:"small",onClick:Ie,class:"dir-button",circle:"",title:"复制路径"},{default:l(()=>[s(O,null,{default:l(()=>i[20]||(i[20]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])])])]),e("main",Jo,[R.value?(f(),w("div",Zo,[e("div",Ko,[s(_a,{ref_key:"gitStatusRef",ref:p,"initial-directory":j.value},null,8,["initial-directory"])]),e("div",{class:"vertical-resizer",id:"v-resizer",onMousedown:ye},null,32),o(g).isGitRepo?(f(),w("div",Qo,[!o(g).userName||!o(g).userEmail?(f(),w("div",en,[i[26]||(i[26]=e("h2",null,"Git用户未配置",-1)),i[27]||(i[27]=e("p",null,"请先配置Git用户信息才能进行提交操作。",-1)),e("div",tn,[i[24]||(i[24]=e("h3",null,"您可以通过以下方式配置:",-1)),i[25]||(i[25]=e("ol",null,[e("li",null,"点击右上角的设置按钮,配置用户名和邮箱"),e("li",null,"或者使用命令行配置:"),e("div",{class:"code-block"},[b(' git config --global user.name "您的用户名"'),e("br"),b(' git config --global user.email "您的邮箱" ')])],-1)),s(D,{type:"primary",onClick:S},{default:l(()=>i[23]||(i[23]=[b(" 立即配置 ")])),_:1})])])):(f(),ae(Gl,{key:1}))])):(f(),w("div",sn,i[28]||(i[28]=[e("div",{class:"card",style:{padding:"20px"}},[e("h2",null,"Git仓库初始化"),e("p",null,"当前目录不是Git仓库,请先初始化Git仓库或切换到Git仓库目录。"),e("div",{class:"tips"},[e("h3",null,"可以使用以下命令初始化仓库:"),e("div",{class:"code-block"},"git init")])],-1)]))),e("div",{class:"horizontal-resizer",id:"h-resizer",onMousedown:Le},null,32),o(g).isGitRepo?(f(),w("div",an,[s(Mo,{ref_key:"logListRef",ref:x},null,512)])):W("",!0),s($e,{modelValue:z.value,"onUpdate:modelValue":i[3]||(i[3]=_=>z.value=_),title:"创建新分支",width:"30%","destroy-on-close":""},{footer:l(()=>[e("span",ln,[s(D,{onClick:i[2]||(i[2]=_=>z.value=!1)},{default:l(()=>i[29]||(i[29]=[b("取消")])),_:1}),s(D,{type:"primary",onClick:k,loading:o(g).isCreatingBranch},{default:l(()=>i[30]||(i[30]=[b(" 创建 ")])),_:1},8,["loading"])])]),default:l(()=>[s(be,{model:{newBranchName:Z.value,selectedBaseBranch:V.value}},{default:l(()=>[s(_e,{label:"新分支名称"},{default:l(()=>[s(Se,{modelValue:Z.value,"onUpdate:modelValue":i[0]||(i[0]=_=>Z.value=_),placeholder:"请输入新分支名称"},null,8,["modelValue"])]),_:1}),s(_e,{label:"基于分支"},{default:l(()=>[s(Re,{modelValue:V.value,"onUpdate:modelValue":i[1]||(i[1]=_=>V.value=_),placeholder:"选择基础分支",style:{width:"100%"}},{default:l(()=>[(f(!0),w(Te,null,De(o(g).allBranches,_=>(f(),ae(fe,{key:_,label:_,value:_},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):(f(),w("div",qo,[s(ue,{class:"loading-card"},{default:l(()=>[e("div",Yo,[s(O,{class:"is-loading"},{default:l(()=>i[21]||(i[21]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})],-1)])),_:1})]),i[22]||(i[22]=e("div",{class:"loading-text"},"加载中...",-1))]),_:1})]))]),e("footer",on,[o(g).currentBranch?(f(),w("div",nn,[e("div",rn,[i[32]||(i[32]=e("span",{class:"branch-label"},"当前分支:",-1)),s(Re,{modelValue:o(g).currentBranch,"onUpdate:modelValue":i[4]||(i[4]=_=>o(g).currentBranch=_),size:"small",onChange:X,loading:o(g).isChangingBranch,class:"branch-select"},{default:l(()=>[(f(!0),w(Te,null,De(o(g).allBranches,_=>(f(),ae(fe,{key:_,label:_,value:_},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"]),s(D,{type:"primary",size:"small",onClick:H,class:"create-branch-btn"},{default:l(()=>[s(O,null,{default:l(()=>[s(o(Ts))]),_:1}),i[31]||(i[31]=b(" 新建分支 "))]),_:1})])])):W("",!0),o(g).remoteUrl?(f(),w("div",cn,[i[34]||(i[34]=e("span",{class:"repo-url-label"},"远程仓库:",-1)),e("span",un,A(o(g).remoteUrl),1),s(D,{type:"primary",circle:"",size:"small",onClick:i[5]||(i[5]=_=>o(g).copyRemoteUrl()),class:"copy-url-btn",title:"复制仓库地址"},{default:l(()=>[s(O,null,{default:l(()=>i[33]||(i[33]=[e("svg",{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},[e("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z"}),e("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z"})],-1)])),_:1})]),_:1})])):W("",!0)]),s($e,{modelValue:J.value,"onUpdate:modelValue":i[9]||(i[9]=_=>J.value=_),title:"Git用户设置",width:"30%","destroy-on-close":""},{footer:l(()=>[e("span",dn,[s(D,{type:"danger",onClick:se},{default:l(()=>i[36]||(i[36]=[b(" 清除配置 ")])),_:1}),s(D,{onClick:i[8]||(i[8]=_=>J.value=!1)},{default:l(()=>i[37]||(i[37]=[b("取消")])),_:1}),s(D,{type:"primary",onClick:ne},{default:l(()=>i[38]||(i[38]=[b(" 保存 ")])),_:1})])]),default:l(()=>[s(be,null,{default:l(()=>[s(_e,{label:"用户名"},{default:l(()=>[s(Se,{modelValue:F.value,"onUpdate:modelValue":i[6]||(i[6]=_=>F.value=_),placeholder:"请输入Git用户名"},null,8,["modelValue"])]),_:1}),s(_e,{label:"邮箱"},{default:l(()=>[s(Se,{modelValue:me.value,"onUpdate:modelValue":i[7]||(i[7]=_=>me.value=_),placeholder:"请输入Git邮箱"},null,8,["modelValue"])]),_:1}),s(_e,null,{default:l(()=>[s(v,{type:"info",closable:!1,"show-icon":""},{default:l(()=>i[35]||(i[35]=[b(" 这些设置将影响全局Git配置,对所有Git仓库生效。 ")])),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),s($e,{modelValue:ge.value,"onUpdate:modelValue":i[13]||(i[13]=_=>ge.value=_),title:"切换工作目录",width:"50%","destroy-on-close":""},{footer:l(()=>[e("span",vn,[s(D,{onClick:i[11]||(i[11]=_=>ge.value=!1)},{default:l(()=>i[40]||(i[40]=[b("取消")])),_:1}),s(D,{type:"primary",onClick:i[12]||(i[12]=_=>st()),loading:Fe.value},{default:l(()=>i[41]||(i[41]=[b(" 切换 ")])),_:1},8,["loading"])])]),default:l(()=>[s(be,null,{default:l(()=>[s(_e,{label:"目录路径"},{default:l(()=>[e("div",fn,[s(Se,{modelValue:Ae.value,"onUpdate:modelValue":i[10]||(i[10]=_=>Ae.value=_),placeholder:"请输入目录路径"},null,8,["modelValue"]),s(D,{type:"primary",onClick:Ce},{default:l(()=>[s(O,null,{default:l(()=>[s(o(Pt))]),_:1}),i[39]||(i[39]=b(" 浏览 "))]),_:1})])]),_:1}),Ne.value.length>0?(f(),ae(_e,{key:0,label:"常用目录"},{default:l(()=>[e("div",pn,[(f(!0),w(Te,null,De(Ne.value,(_,le)=>(f(),ae(d,{key:le,class:"recent-dir-tag",onClick:We=>Ae.value=_,effect:"plain"},{default:l(()=>[b(A(_),1)]),_:2},1032,["onClick"]))),128))])]),_:1})):W("",!0)]),_:1})]),_:1},8,["modelValue"])],64)}}}),gn=$t(mn,[["__scopeId","data-v-98ed32bc"]]),Qt=xs(gn);Qt.use(Ls());Qt.mount("#app");