source-code-mgmt 1.1.0 → 1.1.1
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 +67 -52
- package/lib/client.js +24 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# source-code-mgmt — DSH 源代码管理插件
|
|
2
2
|
|
|
3
|
-
> 版本:**v1.1.
|
|
3
|
+
> 版本:**v1.1.1** | 更新日志见文末「[版本历史](#版本历史)」
|
|
4
4
|
|
|
5
5
|
> DSH Web GUI 侧边栏插件:把「环境检查 → SSH 配置 → 代码上传推送」整合进左栏底部的「代码管理」按钮,支持 GitHub / Gitee 双平台,一键管理代码仓库。
|
|
6
6
|
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
- **选择目录 →**:下拉右侧按钮,可手动输入/粘贴目录绝对路径或点击「浏览…」弹出原生文件夹选择器;确认后**持久化加入自定义目录列表**(插件独立存储于 `~/.dsh/storages/source-code-mgmt-dirs.json`,**不写入插件目录**,开源不泄漏个人路径),下次打开无需重新选择;手动添加的目录会以**自定义目录徽标**显示,末端带 **✕** 可一键删除该下拉记录(只删记录,不删实际文件夹)
|
|
31
31
|
- 显示仓库状态:平台来源、分支、远程地址、待提交改动数、领先/落后远程、>100MB 文件
|
|
32
32
|
- **查看详情**:有改动时「改动」行旁出现「查看」按钮 → 点击弹出窗口列出改动/新增/删除/重命名的**文件或文件夹名称**(只列名称不显示内容);本地与远程存在差异时「同步」行旁出现「查看」按钮 → 点击弹出窗口显示**本地领先/落后的具体提交列表**;无改动或已一致时不显示按钮
|
|
33
|
-
- **动态操作按钮**(git 操作平台无关,GitHub/Gitee
|
|
33
|
+
- **动态操作按钮**(git 操作平台无关,GitHub/Gitee 均可):根据本地与远程的相对状态**只显示当前状态对应的唯一动作**——
|
|
34
34
|
- 只有本地有更改 → 只显示「推送更改」(`git add` + `commit` + `push`)
|
|
35
|
-
- 只有远程有更新 →
|
|
36
|
-
- 本地和远程都有更新 →
|
|
35
|
+
- 只有远程有更新 → 只显示「拉取更新」(实现复用「强制对齐」逻辑:`git fetch` + `git reset --hard origin/<branch>`;因为本地干净无改动,reset 不会丢任何内容,等同快速前进到远程最新,直接执行不弹确认)
|
|
36
|
+
- 本地和远程都有更新 → 只显示提示 +「**强制对齐**」:「拉取更新并推送更改 / 强制推送 / 强制拉取」在此场景下容易因未提交改动、分支保护等原因失败且行为难预测,已不在界面展示;直接把本地**完全重置为远程状态**(`git fetch` + `git reset --hard origin/<branch>`,丢弃本地差异)
|
|
37
37
|
- 完全同步 → 显示「✓ 已是最新」
|
|
38
|
-
-
|
|
38
|
+
- 「**强制对齐**」(`git fetch` + `git reset --hard origin/<branch>`,把本地完全重置为远程状态)**只在「本地和远程都有更新」状态出现**,作为该状态的唯一操作按钮,用于解决「本地与远程文件相同却仍显示同步差异」的情况
|
|
39
39
|
- **创建 Git**:当所选目录**不是 git 仓库**但远程已存在同名仓库时显示该按钮,仅执行 `git init`(+设默认身份),**不拉取不推送**,由用户自行决定下一步是拉取还是推送
|
|
40
40
|
- **新建仓库并推送**:默认以**文件夹名**为仓库名(只读不可改),可选**私有/公开**;同名仓库已存在时**按钮禁用**并在下方提示「同名仓库已经创建」。若目录还是**全新的(尚无任何提交)**,会先自动 `git add` + 生成一个初始提交再创建,避免推送时报 "no commits found"
|
|
41
41
|
- GitHub:`gh repo create --private|--public --source=. --push`
|
|
@@ -51,55 +51,17 @@ DSH 打开时自动预取环境/SSH/工作区/仓库状态,点开面板**直
|
|
|
51
51
|
|
|
52
52
|
`pnpm add`(无论是 `link:`、`git+` 还是 npm)只会把插件写进 profile 的 `package.json` 依赖和 `node_modules`,**并不会自动把插件注册进 Cordis loader 树**。要让左栏底部出现「代码管理」按钮,**还必须激活它**(见下方「激活配置(安装后必做)」)+ **完全重启 dsh web**。这也是 dsh-update 等本地插件共用的激活方式。
|
|
53
53
|
|
|
54
|
-
###
|
|
54
|
+
### 方式一:从 npm 官方包安装(推荐)
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
```powershell
|
|
59
|
-
# 1. 进入你的 DSH profile 目录
|
|
60
|
-
cd ~/.dsh/profiles/web
|
|
61
|
-
|
|
62
|
-
# 2. 用 link 协议添加插件(指向本地源码绝对路径),会建立符号链接
|
|
63
|
-
pnpm add link:C:/path/to/source-code-mgmt
|
|
64
|
-
|
|
65
|
-
# 3. 激活插件:在 ~/.dsh/profiles/web/cordis.patch.yml 追加 insert 条目(见下)
|
|
66
|
-
# 4. 完全重启 dsh web(先停旧进程再启动,刷新页面不生效)
|
|
67
|
-
dsh web
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
**Linux / macOS:**
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
# 1. 进入你的 DSH profile 目录
|
|
74
|
-
cd ~/.dsh/profiles/web
|
|
75
|
-
|
|
76
|
-
# 2. 链接到插件源码目录(符号链接)
|
|
77
|
-
pnpm add link:/home/yourname/path/to/source-code-mgmt
|
|
78
|
-
|
|
79
|
-
# 3. 激活插件:在 ~/.dsh/profiles/web/cordis.patch.yml 追加 insert 条目
|
|
80
|
-
# 4. 完全重启 dsh web(先停旧进程再启动)
|
|
81
|
-
dsh web
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### 方式二:从 GitHub 安装(分发场景)
|
|
85
|
-
|
|
86
|
-
**Windows / Linux / macOS 通用:**
|
|
56
|
+
**最省事的方式**——只需一条命令,且不用先进 profile 目录,推荐给普通使用者。
|
|
87
57
|
|
|
58
|
+
**在任意目录执行:**
|
|
88
59
|
```bash
|
|
89
|
-
#
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
# 2. 从 GitHub 安装插件(实际下载源码到 node_modules)
|
|
93
|
-
pnpm add git+https://github.com/Zhucy123/source-code-mgmt.git
|
|
94
|
-
|
|
95
|
-
# 3. 激活插件:在 ~/.dsh/profiles/web/cordis.patch.yml 追加 insert 条目(见下)
|
|
96
|
-
# 4. 完全重启 dsh web(先停旧进程再启动)
|
|
97
|
-
dsh web
|
|
60
|
+
# 用 DSH 自带的插件命令(自动定位/初始化 web profile)
|
|
61
|
+
dsh plugin --profile web add source-code-mgmt
|
|
98
62
|
```
|
|
99
63
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
### 方式三:从 npm 安装(暂未发布)
|
|
64
|
+
或者等价地手动操作:
|
|
103
65
|
|
|
104
66
|
```bash
|
|
105
67
|
cd ~/.dsh/profiles/web
|
|
@@ -107,7 +69,7 @@ pnpm add source-code-mgmt
|
|
|
107
69
|
dsh web
|
|
108
70
|
```
|
|
109
71
|
|
|
110
|
-
>
|
|
72
|
+
> 说明:`dsh plugin --profile web add <包名>` 本质是「在 web profile 目录里执行 `pnpm add <包名>`」并顺带对账插件层,比手动 `cd` 更省心。但它**同样不会自动把插件激活**(不会替你写 `cordis.patch.yml` 的 insert 条目),所以装完后仍需下面「激活配置」里的步骤 + 完全重启。
|
|
111
73
|
|
|
112
74
|
### 激活配置(安装后必做)
|
|
113
75
|
|
|
@@ -139,6 +101,51 @@ dsh web
|
|
|
139
101
|
> }
|
|
140
102
|
> ```
|
|
141
103
|
|
|
104
|
+
### 方式二:从本地目录安装(开发/测试)
|
|
105
|
+
|
|
106
|
+
**Windows (PowerShell):**
|
|
107
|
+
|
|
108
|
+
```powershell
|
|
109
|
+
# 1. 进入你的 DSH profile 目录
|
|
110
|
+
cd ~/.dsh/profiles/web
|
|
111
|
+
|
|
112
|
+
# 2. 用 link 协议添加插件(指向本地源码绝对路径),会建立符号链接
|
|
113
|
+
pnpm add link:C:/path/to/source-code-mgmt
|
|
114
|
+
|
|
115
|
+
# 3. 激活插件:同上(见上方「激活配置」;追加 insert 条目后完全重启)
|
|
116
|
+
dsh web
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Linux / macOS:**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# 1. 进入你的 DSH profile 目录
|
|
123
|
+
cd ~/.dsh/profiles/web
|
|
124
|
+
|
|
125
|
+
# 2. 链接到插件源码目录(符号链接)
|
|
126
|
+
pnpm add link:/home/yourname/path/to/source-code-mgmt
|
|
127
|
+
|
|
128
|
+
# 3. 激活插件:同上(见上方「激活配置」;追加 insert 条目后完全重启)
|
|
129
|
+
dsh web
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 方式三:从 GitHub 安装(分发场景)
|
|
133
|
+
|
|
134
|
+
**Windows / Linux / macOS 通用:**
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 1. 进入你的 DSH profile 目录
|
|
138
|
+
cd ~/.dsh/profiles/web
|
|
139
|
+
|
|
140
|
+
# 2. 从 GitHub 安装插件(实际下载源码到 node_modules)
|
|
141
|
+
pnpm add git+https://github.com/Zhucy123/source-code-mgmt.git
|
|
142
|
+
|
|
143
|
+
# 3. 激活插件:同上(见上方「激活配置」;追加 insert 条目后完全重启)
|
|
144
|
+
dsh web
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
> 方式三装完同样**不会自动激活**(激活方式同方式一);且它是**实际拷贝**到 node_modules,改动源码需重新 `pnpm add` 拉取(不像 `link:` 是符号链接、改源码即生效)。
|
|
148
|
+
|
|
142
149
|
### 验证安装是否成功
|
|
143
150
|
|
|
144
151
|
安装 + 激活 + 重启后,可以核对以下几点:
|
|
@@ -146,7 +153,7 @@ dsh web
|
|
|
146
153
|
1. **依赖已写入**:`~/.dsh/profiles/web/package.json` 的 `dependencies` 里应有 `source-code-mgmt`。
|
|
147
154
|
2. **符号链接已建立(`link:` 方式)**:`~/.dsh/profiles/web/node_modules/source-code-mgmt` 指向源码目录(Windows 显示为 Junction)。
|
|
148
155
|
3. **激活条目已添加**:`~/.dsh/profiles/web/cordis.patch.yml` 里有 `source-code-mgmt` 的 insert 条目。
|
|
149
|
-
4.
|
|
156
|
+
4. **重启后按钮可见**:左栏底部出现「代码管理」按钮。
|
|
150
157
|
|
|
151
158
|
### 常见排障
|
|
152
159
|
|
|
@@ -219,7 +226,15 @@ pnpm add link:$(pwd)
|
|
|
219
226
|
|
|
220
227
|
## 版本历史
|
|
221
228
|
|
|
222
|
-
### v1.1.
|
|
229
|
+
### v1.1.1(当前)
|
|
230
|
+
本次更新:
|
|
231
|
+
|
|
232
|
+
- **「拉取更新」改用强制对齐的实现并直接执行**:「本地干净 + 远程有更新」状态的「拉取更新」按钮不再走 `git pull --ff-only`,而是复用「强制对齐」的 `git fetch` + `git reset --hard origin/<branch>` 逻辑——本地干净没有可丢失的改动,reset 等同快速前进到远程最新,且**不弹确认框直接执行**,结果更可靠(可绕过 rebase/merge 常见失败场景)
|
|
233
|
+
- **操作按钮只保留当前状态对应的唯一动作**:只有本地有改动(远程一致)→ 只显示「推送更改」;只有远程有更新(本地干净)→ 只显示「拉取更新」;「强制对齐」仅在「本地和远程都有更新」状态出现(该状态的唯一操作按钮),不再在推送/拉取/已同步状态里当作兜底显示
|
|
234
|
+
- **「本地有改动 + 远程有更新」状态只保留「强制对齐」**:此前该状态显示「拉取更新并推送更改 / 强制推送 / 强制拉取」三按钮,但这些操作容易因未提交改动、分支保护等失败且行为难预测(表现为点了没反应、不显示结果),现改为只显示提示 + 「强制对齐」按钮(`git fetch` + `git reset --hard`,本地完全重置为远程),与用户实际想要的「一键对齐」一致
|
|
235
|
+
- **修复「点了按钮没有任何反馈」**:操作回调先 `setErr` 再刷新仓库状态,随后 `loadRepo` 把错误提示无条件清空,导致失败时结果被立即抹掉、界面像什么都没发生;现在错误/结果会保留显示(切换目录 / 切换平台 / 手动刷新状态仍会清空旧提示),对齐失败等也能看到真实原因
|
|
236
|
+
|
|
237
|
+
### v1.1.0(历史)
|
|
223
238
|
本次更新:
|
|
224
239
|
|
|
225
240
|
- **② SSH 新增平台选择**:在「② SSH 密钥与连接」顶部增加下拉选择代码托管平台 **GitHub(默认)** / **Gitee**
|
package/lib/client.js
CHANGED
|
@@ -318,7 +318,10 @@ window.__ModuleLoader__.load({
|
|
|
318
318
|
provRef.current = prov;
|
|
319
319
|
|
|
320
320
|
const loadRepo = useCallback(async (d, keepRepo) => {
|
|
321
|
-
|
|
321
|
+
// 注意:不能在这里无条件清空 err —— 操作回调(推送/拉取/对齐等)会先
|
|
322
|
+
// setErr/setMsg 再调 loadRepo 刷新状态,此处清空会立刻抹掉刚设置的
|
|
323
|
+
// 结果/错误提示,造成「点了按钮没有任何反馈」。需要清空 err 的调用方
|
|
324
|
+
// (切换目录 / 切换平台 / 刷新状态)自行清空。
|
|
322
325
|
if (!keepRepo) setRepo(null);
|
|
323
326
|
try {
|
|
324
327
|
const p = provRef.current || "github";
|
|
@@ -409,6 +412,8 @@ window.__ModuleLoader__.load({
|
|
|
409
412
|
// 平台切换:gitee 时读取令牌状态;无论切到哪都刷新仓库(跟随平台检测/显示)
|
|
410
413
|
useEffect(() => {
|
|
411
414
|
if (prov === "gitee") void loadGiteeTokenStatus();
|
|
415
|
+
// 切换平台等同切换检测目标,清掉旧的错误提示,避免残留上一个平台的报错。
|
|
416
|
+
setErr(null);
|
|
412
417
|
if (dir || cache.defDir) loadRepo(dir || cache.defDir || "", true);
|
|
413
418
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
414
419
|
}, [prov]);
|
|
@@ -426,11 +431,15 @@ window.__ModuleLoader__.load({
|
|
|
426
431
|
}, [dir, loadRepo]);
|
|
427
432
|
|
|
428
433
|
const pull = useCallback(async () => {
|
|
434
|
+
// 「拉取更新」在“本地干净 + 远程有更新”状态出现:本地没有任何改动/提交,
|
|
435
|
+
// reset --hard 不会丢失任何内容,因此直接复用「强制对齐」的实现
|
|
436
|
+
// (git fetch + git reset --hard origin/<branch>),且无需弹确认框,
|
|
437
|
+
// 等同于把本地快速前进到远程最新状态。
|
|
429
438
|
setBusy(true); setMsg(null); setErr(null); setResult(null);
|
|
430
439
|
try {
|
|
431
|
-
const r = await jpost("/
|
|
440
|
+
const r = await jpost("/align", { dir: dir || undefined });
|
|
432
441
|
setResult(r);
|
|
433
|
-
if (r.ok) setMsg(
|
|
442
|
+
if (r.ok) setMsg("已拉取远程更新(本地已对齐到远程最新状态)");
|
|
434
443
|
else setErr(r.error || "拉取失败");
|
|
435
444
|
void loadRepo(dir, true);
|
|
436
445
|
} catch (e) { setErr("拉取失败:" + e); }
|
|
@@ -719,24 +728,27 @@ window.__ModuleLoader__.load({
|
|
|
719
728
|
btns.push(h(Btn, { key: "init", label: "创建 Git", onClick: initGit, tone: "primary", noBg: true, disabled: isBlocked, title: "仅初始化 git 仓库,不拉取不推送,由你决定下一步" }));
|
|
720
729
|
} else if (hasRemote) {
|
|
721
730
|
if (localChanges && remoteUpdates) {
|
|
722
|
-
//
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
731
|
+
// 本地和远程都有更新:原名展示「拉取更新并推送更改 / 强制推送 /
|
|
732
|
+
// 强制拉取」三按钮,但这三种操作在此场景下容易因未提交改动、
|
|
733
|
+
// 分支保护等原因失败且行为难预测,故不再展示——该状态唯一的
|
|
734
|
+
// 操作按钮是「强制对齐」(fetch + reset --hard,本地完全重置为远程)。
|
|
735
|
+
btns.push(h("span", { key: "both-note", style: { color: T.warn, fontSize: 12 } },
|
|
736
|
+
"本地有改动且远程有更新,可直接用「强制对齐」将本地重置为远程状态"));
|
|
737
|
+
if (repo && repo.isGitRepo) {
|
|
738
|
+
btns.push(h(Btn, { key: "align", label: "强制对齐", onClick: align, disabled: isBlocked, title: "本地完全重置为远程分支(丢弃本地差异),解决“文件相同仍显示同步差异”的情况" }));
|
|
739
|
+
}
|
|
726
740
|
} else if (localChanges) {
|
|
727
741
|
// 只有本地有更改 -> 只显示推送(正常 push)
|
|
728
742
|
btns.push(h(Btn, { key: "push", label: "推送更改", onClick: push, tone: "primary", noBg: true, disabled: isBlocked || repo?.repoExists === false }));
|
|
729
743
|
} else if (remoteUpdates) {
|
|
730
|
-
//
|
|
744
|
+
// 只有远程有更新(本地干净)-> 只显示「拉取更新」。
|
|
745
|
+
// 实现复用「强制对齐」逻辑(fetch + reset --hard):本地干净
|
|
746
|
+
// 无改动可丢,reset 等同快速前进到远程最新,直接执行不弹确认。
|
|
731
747
|
btns.push(h(Btn, { key: "pull", label: "拉取更新", onClick: pull, disabled: isBlocked || repo?.repoExists !== true }));
|
|
732
748
|
} else {
|
|
733
749
|
// 完全同步 -> 无按钮,显示已是最新
|
|
734
750
|
btns.push(h("span", { key: "synced", style: { color: T.success, fontSize: 13 } }, "✓ 已是最新"));
|
|
735
751
|
}
|
|
736
|
-
// 有远程时总是提供「强制对齐」作为兜底(本地完全重置为远程状态)
|
|
737
|
-
if (repo && repo.isGitRepo) {
|
|
738
|
-
btns.push(h(Btn, { key: "align", label: "强制对齐", onClick: align, disabled: isBlocked, title: "本地完全重置为远程分支(丢弃本地差异),解决“文件相同仍显示同步差异”的情况" }));
|
|
739
|
-
}
|
|
740
752
|
}
|
|
741
753
|
return h("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", alignItems: "center" } },
|
|
742
754
|
btns,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "source-code-mgmt",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "DSH plugin: source code management in the sidebar footer — env checks (git/gh), SSH ed25519 key setup, GitHub/Gitee dual-platform (SSH config 443 + Gitee OpenAPI), connectivity test, push / new repo, and auto-ignore files over 100MB with per-file skipped reasons. Cross-platform (Windows / Linux / macOS).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|