Skip to content

Commit 1e3bbd3

Browse files
committed
Improve:Surge模块管理和万象方案更新的路径问题优化
1 parent 0db0194 commit 1e3bbd3

8 files changed

Lines changed: 111 additions & 35 deletions

File tree

Rime-Wanxiang-Updater/components/HomeView.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,21 @@ export function HomeView() {
100100
const selected = current.schemeEdition === "base" ? "base" : `pro (${current.proSchemeKey})`
101101
setLocalSelectedScheme(selected)
102102

103-
let installRoot = current.hamsterRootPath
103+
let installRoot = ""
104104
try {
105105
const { rimeDir } = await detectRimeDir(current)
106106
if (rimeDir) installRoot = rimeDir
107107
} catch {}
108+
if (!installRoot && !current.hamsterBookmarkName) {
109+
installRoot = current.hamsterRootPath
110+
}
108111

109112
const candidates: string[] = []
110113
if (installRoot) candidates.push(installRoot)
111-
if (current.hamsterRootPath && current.hamsterRootPath !== installRoot) {
114+
if (!current.hamsterBookmarkName && current.hamsterRootPath && current.hamsterRootPath !== installRoot) {
112115
candidates.push(current.hamsterRootPath)
113116
}
114-
if (current.hamsterRootPath) {
117+
if (!current.hamsterBookmarkName && current.hamsterRootPath) {
115118
candidates.push(
116119
Path.join(current.hamsterRootPath, "RimeUserData", "wanxiang"),
117120
Path.join(current.hamsterRootPath, "RIME", "Rime"),

Rime-Wanxiang-Updater/components/SettingsView.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,12 @@ export function SettingsView(props: {
197197
setBookmarkIdx(idx >= 0 ? idx : 0)
198198
if (idx >= 0) {
199199
const matched = cleaned[idx]
200-
const resolved = fm?.bookmarkedPath
201-
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [matched.name])) ?? matched.path)
202-
: matched.path
200+
const canUseByName = fm?.bookmarkExists
201+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [matched.name]))
202+
: true
203+
const resolved = fm?.bookmarkedPath && canUseByName
204+
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [matched.name])) ?? "")
205+
: (matched.name ? "" : matched.path)
203206
const pathChanged = resolved !== targetPath || matched.name !== targetName
204207
if (pathChanged) {
205208
setCfg((c) => ({ ...c, hamsterRootPath: resolved, hamsterBookmarkName: matched.name }))
@@ -210,10 +213,17 @@ export function SettingsView(props: {
210213
} catch {}
211214
}
212215
} else if (!targetPath) {
216+
const first = cleaned[0]
217+
const canUseByName = fm?.bookmarkExists
218+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [first.name]))
219+
: true
220+
const resolved = fm?.bookmarkedPath && canUseByName
221+
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [first.name])) ?? first.path)
222+
: first.path
213223
setCfg((c) => ({
214224
...c,
215-
hamsterRootPath: cleaned[0].path,
216-
hamsterBookmarkName: cleaned[0].name,
225+
hamsterRootPath: resolved,
226+
hamsterBookmarkName: first.name,
217227
}))
218228
}
219229
} else {
@@ -308,9 +318,16 @@ export function SettingsView(props: {
308318
if (b?.path) {
309319
;(async () => {
310320
const fm: any = (globalThis as any).FileManager ?? Runtime.FileManager
311-
const resolved = fm?.bookmarkedPath
312-
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [b.name])) ?? b.path)
313-
: b.path
321+
const canUseByName = fm?.bookmarkExists
322+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [b.name]))
323+
: true
324+
const resolved = fm?.bookmarkedPath && canUseByName
325+
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [b.name])) ?? "")
326+
: (b.name ? "" : b.path)
327+
if (!resolved) {
328+
showInfo("书签不可用", "书签路径不可用,请在设置页重新选择书签文件夹。")
329+
return
330+
}
314331
const next: AppConfig = {
315332
...cfg,
316333
hamsterRootPath: resolved,

Rime-Wanxiang-Updater/utils/hamster.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,19 @@ async function resolveBookmarkPath(rawPath: string, bookmarkName?: string): Prom
1919
const fm = Runtime.FileManager
2020
const raw = String(rawPath ?? "").trim()
2121
const name = String(bookmarkName ?? "").trim()
22+
if (!raw && !name) return ""
2223
if (!fm?.bookmarkedPath) return raw
2324
try {
2425
if (name) {
25-
const resolvedByName = await callMaybeAsync(fm.bookmarkedPath, fm, [name])
26-
if (resolvedByName) return String(resolvedByName)
26+
let nameExists = true
27+
if (fm?.bookmarkExists) {
28+
const existed = await callMaybeAsync(fm.bookmarkExists, fm, [name])
29+
nameExists = !!existed
30+
}
31+
if (nameExists) {
32+
const resolvedByName = await callMaybeAsync(fm.bookmarkedPath, fm, [name])
33+
if (resolvedByName) return String(resolvedByName)
34+
}
2735
}
2836
} catch {}
2937
if (!fm?.getAllFileBookmarks) return raw
@@ -43,6 +51,8 @@ async function resolveBookmarkPath(rawPath: string, bookmarkName?: string): Prom
4351
if (match?.path) return String(match.path)
4452
}
4553
} catch {}
54+
// 配置了书签名但无法解引用时,不再回退旧路径(避免用到失效授权路径)
55+
if (name) return ""
4656
return raw
4757
}
4858

Rime-Wanxiang-Updater/utils/update_tasks.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,14 @@ function dictPattern(cfg: AppConfig): string {
192192
}
193193

194194
async function requireInstallRoot(cfg: AppConfig): Promise<string> {
195-
if (cfg.hamsterRootPath) return cfg.hamsterRootPath
196195
try {
197196
const { rimeDir } = await detectRimeDir(cfg)
198197
if (rimeDir) return rimeDir
199198
} catch {}
199+
if (cfg.hamsterBookmarkName) {
200+
throw new Error("书签路径不可用,请在设置页重新选择书签文件夹")
201+
}
202+
if (cfg.hamsterRootPath) return cfg.hamsterRootPath
200203
throw new Error("未选择安装目录(请到设置选择文件夹)")
201204
}
202205

Rime-Wanxiang-Updater/utils/updater.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ export async function doUpdate(
8686
params.onStage?.("解析目录...")
8787
const { engine, rimeDir } = await detectRimeDir(cfg)
8888
const installRoot = getInstallRoot(cfg)
89+
if (!rimeDir && cfg.hamsterBookmarkName) {
90+
throw new Error("书签路径不可用,请在设置页重新选择书签文件夹")
91+
}
8992
const installDir = rimeDir || installRoot
9093
if (!installDir) throw new Error("未选择安装路径(请到设置里选择文件夹)")
9194

Surge-Module-Manager/components/HomeView.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,21 @@ export function HomeView() {
105105
return idx > 0 ? String(m.filePath).slice(0, idx) : undefined
106106
}
107107

108-
async function refreshModules() {
109-
await ensureStorage()
110-
const resolved = await getModulesDirResolved()
111-
setResolvedBaseDir(resolved)
112-
const list = sortModules(await loadModules())
113-
setModules(list)
108+
async function refreshModules(resetStageOnSuccess = false) {
109+
try {
110+
await ensureStorage()
111+
const resolved = await getModulesDirResolved()
112+
setResolvedBaseDir(resolved)
113+
const list = sortModules(await loadModules())
114+
setModules(list)
115+
if (resetStageOnSuccess) {
116+
setStage("就绪")
117+
setProgress("")
118+
}
119+
} catch (e: any) {
120+
setModules([])
121+
setStage(String(e?.message ?? e))
122+
}
114123
}
115124

116125
useEffect(() => {
@@ -137,13 +146,13 @@ export function HomeView() {
137146
initial={loadConfig()}
138147
onDone={(next) => {
139148
setCfg(next)
140-
void refreshModules()
149+
void refreshModules(true)
141150
}}
142151
/>
143152
),
144153
})
145154
setCfg(loadConfig())
146-
await refreshModules()
155+
await refreshModules(true)
147156
}
148157

149158
async function addModule() {

Surge-Module-Manager/components/SettingsView.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,10 @@ export function SettingsView(props: {
127127
setBookmarkIdx(idx >= 0 ? idx : 0)
128128
if (idx >= 0) {
129129
const matched = cleaned[idx]
130-
const resolved = fm?.bookmarkedPath
130+
const canUseByName = fm?.bookmarkExists
131+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [matched.name]))
132+
: true
133+
const resolved = fm?.bookmarkedPath && canUseByName
131134
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [matched.name])) ?? matched.path)
132135
: matched.path
133136
const pathChanged = resolved !== targetPath || matched.name !== targetName
@@ -141,7 +144,10 @@ export function SettingsView(props: {
141144
}
142145
} else if (!targetPath) {
143146
const first = cleaned[0]
144-
const resolved = fm?.bookmarkedPath
147+
const canUseByName = fm?.bookmarkExists
148+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [first.name]))
149+
: true
150+
const resolved = fm?.bookmarkedPath && canUseByName
145151
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [first.name])) ?? first.path)
146152
: first.path
147153
setCfg((c) => ({ ...c, baseDir: resolved, baseBookmarkName: first.name }))
@@ -278,7 +284,10 @@ function deleteCategoryAt(indices: number[]) {
278284
if (b?.path) {
279285
void (async () => {
280286
const fm: any = (globalThis as any).FileManager
281-
const resolved = fm?.bookmarkedPath
287+
const canUseByName = fm?.bookmarkExists
288+
? !!(await callMaybeAsync(fm.bookmarkExists, fm, [b.name]))
289+
: true
290+
const resolved = fm?.bookmarkedPath && canUseByName
282291
? String((await callMaybeAsync(fm.bookmarkedPath, fm, [b.name])) ?? b.path)
283292
: b.path
284293
const next: AppConfig = { ...cfg, baseDir: resolved, baseBookmarkName: b.name }

Surge-Module-Manager/utils/storage.tsx

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,20 @@ export function getModulesDir(): string {
6060
async function resolveBookmarkedPath(rawPath: string, bookmarkName?: string): Promise<string> {
6161
const fm = fmOrThrow()
6262
const raw = String(rawPath ?? "").trim()
63-
if (!raw) return ""
63+
const name = String(bookmarkName ?? "").trim()
64+
if (!raw && !name) return ""
6465
if (!fm?.bookmarkedPath) return raw
6566

66-
if (bookmarkName) {
67-
const byName = await callMaybeAsync(fm.bookmarkedPath, fm, [bookmarkName])
68-
if (byName) return String(byName)
67+
if (name) {
68+
let nameExists = true
69+
if (fm?.bookmarkExists) {
70+
const existed = await callMaybeAsync(fm.bookmarkExists, fm, [name])
71+
nameExists = !!existed
72+
}
73+
if (nameExists) {
74+
const byName = await callMaybeAsync(fm.bookmarkedPath, fm, [name])
75+
if (byName) return String(byName)
76+
}
6977
}
7078
if (!fm?.getAllFileBookmarks) return raw
7179

@@ -75,25 +83,36 @@ async function resolveBookmarkedPath(rawPath: string, bookmarkName?: string): Pr
7583
const match = arr.find((b: any) => {
7684
const p = normalizePath(String(b?.path ?? ""))
7785
const n = String(b?.name ?? "")
78-
return (p && p === target) || (bookmarkName ? n === bookmarkName : false)
86+
return (p && p === target) || (name ? n === name : false)
7987
})
80-
if (!match?.name) return raw
81-
const resolved = await callMaybeAsync(fm.bookmarkedPath, fm, [match.name])
82-
return resolved ? String(resolved) : raw
88+
if (match?.name) {
89+
const resolved = await callMaybeAsync(fm.bookmarkedPath, fm, [match.name])
90+
if (resolved) return String(resolved)
91+
}
92+
93+
// If bookmark name is configured but cannot be resolved, do not trust stale raw path.
94+
if (name) return ""
95+
return raw
8396
}
8497

8598
export async function getModulesDirResolved(baseDir?: string): Promise<string> {
8699
const cfg = loadConfig()
87100
const configured = String(cfg.baseDir ?? "").trim()
101+
const bookmarkName = String(cfg.baseBookmarkName ?? "").trim()
88102
const target = String(baseDir ?? "").trim()
89103
if (!configured && !target) return getModulesDir()
90104

91105
if (!target) {
92-
return configured ? await resolveBookmarkedPath(configured, cfg.baseBookmarkName) : getModulesDir()
106+
if (!configured) return getModulesDir()
107+
const resolved = await resolveBookmarkedPath(configured, bookmarkName)
108+
if (resolved) return resolved
109+
return bookmarkName ? "" : configured
93110
}
94111

95112
if (configured && normalizePath(target) === normalizePath(configured)) {
96-
return await resolveBookmarkedPath(target, cfg.baseBookmarkName)
113+
const resolved = await resolveBookmarkedPath(target, bookmarkName)
114+
if (resolved) return resolved
115+
return bookmarkName ? "" : target
97116
}
98117
return target
99118
}
@@ -123,6 +142,9 @@ export async function ensureStorage(): Promise<void> {
123142
const cfg = loadConfig()
124143
if (cfg.baseDir) {
125144
const resolved = await getModulesDirResolved(cfg.baseDir)
145+
if (!resolved) {
146+
throw new Error("书签路径不可用,请在设置页重新选择书签文件夹")
147+
}
126148
await ensureDir(resolved)
127149
return
128150
}

0 commit comments

Comments
 (0)