Skip to content

Commit 0f081f9

Browse files
committed
Rime-Wanxiang-Updater:new:支持预发布版本下载更新~
1 parent bb73d71 commit 0f081f9

8 files changed

Lines changed: 139 additions & 24 deletions

File tree

Rime-Wanxiang-Updater/components/HomeView.tsx

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,39 @@ function normalizeMark(value: string | undefined): string {
310310
return String(value ?? "").trim().toLowerCase()
311311
}
312312

313-
function buildUpdateDecision(localMeta: MetaBundle | undefined, remote: AllUpdateResult): UpdateDecision {
314-
const schemeRemoteMark = normalizeMark(remote.scheme?.tag ?? remote.scheme?.name)
313+
function schemeRemoteDisplayMark(cfg: AppConfig, remote: AllUpdateResult["scheme"] | null | undefined): string {
314+
return String(
315+
(cfg.usePrereleaseScheme
316+
? (remote?.remoteIdOrSha ?? remote?.tag ?? remote?.name)
317+
: (remote?.tag ?? remote?.name))
318+
?? ""
319+
).trim()
320+
}
321+
322+
function schemeLocalDisplayMark(cfg: AppConfig, metaScheme: MetaBundle["scheme"] | undefined): string {
323+
return String(
324+
(cfg.usePrereleaseScheme
325+
? metaScheme?.remoteIdOrSha
326+
: metaScheme?.remoteTagOrName)
327+
?? ""
328+
).trim()
329+
}
330+
331+
function schemeStoredDisplayMark(metaScheme: MetaBundle["scheme"] | undefined): string {
332+
return String(
333+
((metaScheme?.usePrereleaseScheme ? metaScheme?.remoteIdOrSha : metaScheme?.remoteTagOrName)
334+
?? metaScheme?.remoteTagOrName
335+
?? metaScheme?.remoteIdOrSha
336+
?? "")
337+
).trim()
338+
}
339+
340+
function buildUpdateDecision(localMeta: MetaBundle | undefined, remote: AllUpdateResult, cfg: AppConfig): UpdateDecision {
341+
const schemeRemoteMark = normalizeMark(schemeRemoteDisplayMark(cfg, remote.scheme))
315342
const dictRemoteMark = normalizeMark(remote.dict?.remoteIdOrSha)
316343
const modelRemoteMark = normalizeMark(remote.model?.remoteIdOrSha)
317344
return {
318-
scheme: !!(schemeRemoteMark && normalizeMark(localMeta?.scheme?.remoteTagOrName) !== schemeRemoteMark),
345+
scheme: !!(schemeRemoteMark && normalizeMark(schemeLocalDisplayMark(cfg, localMeta?.scheme)) !== schemeRemoteMark),
319346
dict: !!(dictRemoteMark && normalizeMark(localMeta?.dict?.remoteIdOrSha) !== dictRemoteMark),
320347
model: !!(modelRemoteMark && normalizeMark(localMeta?.model?.remoteIdOrSha) !== modelRemoteMark),
321348
}
@@ -779,7 +806,7 @@ export function HomeView() {
779806
const localScheme = normalizeMetaScheme(meta.scheme, current)
780807
setLocalSelectedScheme(localScheme.selected)
781808

782-
setLocalSchemeVersion(meta.scheme?.remoteTagOrName ?? "暂无法获取")
809+
setLocalSchemeVersion(schemeStoredDisplayMark(meta.scheme) || "暂无法获取")
783810
setLocalDictMark(meta.dict?.remoteIdOrSha ?? "暂无法获取")
784811
setLocalModelMark(meta.model?.remoteIdOrSha ?? "暂无法获取")
785812
return true
@@ -789,7 +816,7 @@ export function HomeView() {
789816
const remote = remoteOverride ?? ((lastCheckKey === checkKey(current)) ? lastCheck : null)
790817
if (!remote) return
791818
const { meta } = await findLocalMeta(current)
792-
const nextDecision = buildUpdateDecision(meta, remote)
819+
const nextDecision = buildUpdateDecision(meta, remote, current)
793820
setLastCheck(remote)
794821
setLastCheckDecision(nextDecision)
795822
setLastCheckKey(checkKey(current))
@@ -799,7 +826,7 @@ export function HomeView() {
799826
function applySharedCheckCache(current: AppConfig) {
800827
const cache = loadSharedCheckCache()
801828
if (!cache || cache.key !== checkKey(current)) return false
802-
setRemoteSchemeVer(cache.remote.scheme?.tag ?? cache.remote.scheme?.name ?? "暂无法获取")
829+
setRemoteSchemeVer(schemeRemoteDisplayMark(current, cache.remote.scheme) || "暂无法获取")
803830
setRemoteDictMark(cache.remote.dict?.remoteIdOrSha ?? "暂无法获取")
804831
setRemoteModelMark(cache.remote.model?.remoteIdOrSha ?? "暂无法获取")
805832
setNotes(cache.remote.scheme?.body ?? "")
@@ -1019,8 +1046,8 @@ export function HomeView() {
10191046
const effective = loadConfig()
10201047

10211048
const r = await checkAllUpdates(effective)
1022-
const decision = buildUpdateDecision(localMeta, r)
1023-
setRemoteSchemeVer(r.scheme?.tag ?? r.scheme?.name ?? "暂无法获取")
1049+
const decision = buildUpdateDecision(localMeta, r, effective)
1050+
setRemoteSchemeVer(schemeRemoteDisplayMark(effective, r.scheme) || "暂无法获取")
10241051
setRemoteDictMark(r.dict?.remoteIdOrSha ?? "暂无法获取")
10251052
setRemoteModelMark(r.model?.remoteIdOrSha ?? "暂无法获取")
10261053
setNotes(r.scheme?.body ?? "")
@@ -1029,7 +1056,7 @@ export function HomeView() {
10291056
setLastCheckKey(checkKey(effective))
10301057
saveSharedCheckCache(effective, r, decision)
10311058

1032-
pushCheckResultLog("方案", r.scheme?.tag ?? r.scheme?.name ?? "暂无法获取", decision.scheme)
1059+
pushCheckResultLog("方案", schemeRemoteDisplayMark(effective, r.scheme) || "暂无法获取", decision.scheme)
10331060
pushCheckResultLog("词库", r.dict?.remoteIdOrSha ?? "暂无法获取", decision.dict)
10341061
pushCheckResultLog("模型", r.model?.remoteIdOrSha ?? "暂无法获取", decision.model)
10351062
setStageAndMaybeLog("检查完成", "CHECK", "SUCCESS", true)
@@ -1062,7 +1089,7 @@ export function HomeView() {
10621089
pre = shared.remote
10631090
decision = shared.decision
10641091
resolvedKey = key
1065-
setRemoteSchemeVer(shared.remote.scheme?.tag ?? shared.remote.scheme?.name ?? "暂无法获取")
1092+
setRemoteSchemeVer(schemeRemoteDisplayMark(effective, shared.remote.scheme) || "暂无法获取")
10661093
setRemoteDictMark(shared.remote.dict?.remoteIdOrSha ?? "暂无法获取")
10671094
setRemoteModelMark(shared.remote.model?.remoteIdOrSha ?? "暂无法获取")
10681095
setNotes(shared.remote.scheme?.body ?? "")
@@ -1079,17 +1106,17 @@ export function HomeView() {
10791106
setRemoteModelMark("检查更新中...")
10801107
setNotes("检查更新中...")
10811108
pre = await checkAllUpdates(effective)
1082-
setRemoteSchemeVer(pre.scheme?.tag ?? pre.scheme?.name ?? "暂无法获取")
1109+
setRemoteSchemeVer(schemeRemoteDisplayMark(effective, pre.scheme) || "暂无法获取")
10831110
setRemoteDictMark(pre.dict?.remoteIdOrSha ?? "暂无法获取")
10841111
setRemoteModelMark(pre.model?.remoteIdOrSha ?? "暂无法获取")
10851112
setNotes(pre.scheme?.body ?? "")
10861113
setLastCheck(pre)
1087-
decision = buildUpdateDecision(localMeta, pre)
1114+
decision = buildUpdateDecision(localMeta, pre, effective)
10881115
setLastCheckDecision(decision)
10891116
setLastCheckKey(key)
10901117
}
10911118
if (pre && !decision) {
1092-
decision = buildUpdateDecision(localMeta, pre)
1119+
decision = buildUpdateDecision(localMeta, pre, effective)
10931120
setLastCheckDecision(decision)
10941121
}
10951122

@@ -1237,7 +1264,7 @@ export function HomeView() {
12371264
return (
12381265
<Section key={key} header={<Text>本地信息</Text>}>
12391266
<RowKV k="当前选择的方案" v={localSelectedScheme} />
1240-
<RowKV k="本地方案版本" v={localSchemeVersion} />
1267+
<RowKV k="本地方案" v={localSchemeVersion} />
12411268
<RowKV k="本地词库" v={localDictMark} />
12421269
<RowKV k="本地模型" v={localModelMark} />
12431270
</Section>
@@ -1246,7 +1273,7 @@ export function HomeView() {
12461273
if (key === "remote") {
12471274
return (
12481275
<Section key={key} header={<Text>远程信息</Text>}>
1249-
<RowKV k="远程方案版本" v={remoteSchemeVer} />
1276+
<RowKV k="远程方案" v={remoteSchemeVer} />
12501277
<RowKV k="远程词库" v={remoteDictMark} />
12511278
<RowKV k="远程模型" v={remoteModelMark} />
12521279
</Section>

Rime-Wanxiang-Updater/components/KeyboardView.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,30 @@ function normalizeMark(value?: string) {
3333
return String(value ?? "").trim().toLowerCase()
3434
}
3535

36-
function buildUpdateDecision(localMeta: MetaBundle | undefined, remote: AllUpdateResult): UpdateDecision {
37-
const schemeRemoteMark = normalizeMark(remote.scheme?.tag ?? remote.scheme?.name)
36+
function schemeRemoteDisplayMark(cfg: AppConfig, remote: AllUpdateResult["scheme"] | null | undefined) {
37+
return String(
38+
(cfg.usePrereleaseScheme
39+
? (remote?.remoteIdOrSha ?? remote?.tag ?? remote?.name)
40+
: (remote?.tag ?? remote?.name))
41+
?? ""
42+
).trim()
43+
}
44+
45+
function schemeLocalDisplayMark(cfg: AppConfig, metaScheme: MetaBundle["scheme"] | undefined) {
46+
return String(
47+
(cfg.usePrereleaseScheme
48+
? metaScheme?.remoteIdOrSha
49+
: metaScheme?.remoteTagOrName)
50+
?? ""
51+
).trim()
52+
}
53+
54+
function buildUpdateDecision(localMeta: MetaBundle | undefined, remote: AllUpdateResult, cfg: AppConfig): UpdateDecision {
55+
const schemeRemoteMark = normalizeMark(schemeRemoteDisplayMark(cfg, remote.scheme))
3856
const dictRemoteMark = normalizeMark(remote.dict?.remoteIdOrSha)
3957
const modelRemoteMark = normalizeMark(remote.model?.remoteIdOrSha)
4058
return {
41-
scheme: !!(schemeRemoteMark && normalizeMark(localMeta?.scheme?.remoteTagOrName) !== schemeRemoteMark),
59+
scheme: !!(schemeRemoteMark && normalizeMark(schemeLocalDisplayMark(cfg, localMeta?.scheme)) !== schemeRemoteMark),
4260
dict: !!(dictRemoteMark && normalizeMark(localMeta?.dict?.remoteIdOrSha) !== dictRemoteMark),
4361
model: !!(modelRemoteMark && normalizeMark(localMeta?.model?.remoteIdOrSha) !== modelRemoteMark),
4462
}
@@ -219,7 +237,7 @@ export function KeyboardView() {
219237
if (!checked) return "unchecked"
220238
if (lastDecision?.[kind]) return "update"
221239
const remote = kind === "scheme"
222-
? lastCheck?.scheme?.tag ?? lastCheck?.scheme?.name
240+
? schemeRemoteDisplayMark(cfg, lastCheck?.scheme)
223241
: kind === "dict"
224242
? lastCheck?.dict?.remoteIdOrSha
225243
: lastCheck?.model?.remoteIdOrSha
@@ -244,7 +262,7 @@ export function KeyboardView() {
244262

245263
const localMeta = await findLocalMeta(current)
246264
const remote = await checkAllUpdates(current)
247-
const decision = buildUpdateDecision(localMeta, remote)
265+
const decision = buildUpdateDecision(localMeta, remote, current)
248266
setLastCheck(remote)
249267
setLastDecision(decision)
250268
setLastCheckKey(getCheckCacheKey(current))

Rime-Wanxiang-Updater/components/SettingsView.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ function normalizeInputMethodFromMeta(meta: any, detectedEngine: string): InputM
9292
return undefined
9393
}
9494

95+
function normalizePrereleaseSchemeFromMeta(meta: any): boolean | undefined {
96+
const value = meta?.scheme?.usePrereleaseScheme
97+
if (typeof value === "boolean") return value
98+
const raw = String(value ?? "").trim().toLowerCase()
99+
if (raw === "1" || raw === "true" || raw === "yes") return true
100+
if (raw === "0" || raw === "false" || raw === "no") return false
101+
if (String(meta?.scheme?.remoteTagOrName ?? "").trim().toLowerCase() === "dict-nightly") return true
102+
return undefined
103+
}
104+
95105
async function collectMetaCandidatesAsync(base: AppConfig, detected?: string): Promise<string[]> {
96106
const out: string[] = []
97107
const push = (p?: string) => {
@@ -241,10 +251,12 @@ export function SettingsView(props: {
241251
const normalized = normalizeSchemeFromMeta(meta, base)
242252
const releaseSource = normalizeReleaseSourceFromMeta(meta)
243253
const inputMethod = normalizeInputMethodFromMeta(meta, detectedEngine)
254+
const usePrereleaseScheme = normalizePrereleaseSchemeFromMeta(meta)
244255

245256
const next: AppConfig = {
246257
...base,
247258
releaseSource: releaseSource ?? base.releaseSource,
259+
usePrereleaseScheme: usePrereleaseScheme ?? base.usePrereleaseScheme,
248260
inputMethod: inputMethod ?? base.inputMethod,
249261
schemeEdition: normalized?.schemeEdition ?? base.schemeEdition,
250262
proSchemeKey:
@@ -257,6 +269,7 @@ export function SettingsView(props: {
257269
base.schemeEdition !== next.schemeEdition ||
258270
base.proSchemeKey !== next.proSchemeKey ||
259271
base.releaseSource !== next.releaseSource ||
272+
base.usePrereleaseScheme !== next.usePrereleaseScheme ||
260273
base.inputMethod !== next.inputMethod
261274
if (!changed) return base
262275

@@ -491,6 +504,16 @@ export function SettingsView(props: {
491504
))}
492505
</Picker>
493506

507+
<Toggle
508+
title={"预发布版本"}
509+
value={cfg.usePrereleaseScheme}
510+
onChanged={(v: boolean) => {
511+
try { (globalThis as any).HapticFeedback?.heavyImpact?.() } catch { }
512+
setCfg((c) => ({ ...c, usePrereleaseScheme: v }))
513+
}}
514+
toggleStyle="switch"
515+
/>
516+
494517
{releaseIdx === 1 ? (
495518
<TextField
496519
label={<Text>GitHub Token</Text>}

Rime-Wanxiang-Updater/script.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"email": null,
2020
"homepage": "https:\/\/github.com\/BlackCCCat"
2121
},
22-
"name": "万象下载更新",
22+
"name": "万象拼音助手",
2323
"icon": "keyboard.fill",
2424
"contributors": [],
2525
"description": "万象方案下载更新",

Rime-Wanxiang-Updater/utils/check_cache.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,14 @@ function writeValue(st: any, key: string, value: string) {
3131
}
3232

3333
export function getCheckCacheKey(cfg: AppConfig) {
34-
return [cfg.releaseSource, cfg.schemeEdition, cfg.proSchemeKey, cfg.hamsterRootPath, cfg.hamsterBookmarkName].join("|")
34+
return [
35+
cfg.releaseSource,
36+
cfg.usePrereleaseScheme ? "prerelease" : "stable",
37+
cfg.schemeEdition,
38+
cfg.proSchemeKey,
39+
cfg.hamsterRootPath,
40+
cfg.hamsterBookmarkName,
41+
].join("|")
3542
}
3643

3744
export function loadSharedCheckCache(): SharedCheckCache | null {

Rime-Wanxiang-Updater/utils/config.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export type AppConfig = {
2121
hamsterRootPath: string
2222
hamsterBookmarkName: string
2323
releaseSource: ReleaseSource
24+
usePrereleaseScheme: boolean
2425
githubToken: string
2526

2627
schemeEdition: SchemeEdition
@@ -46,6 +47,7 @@ export const DEFAULT_CONFIG: AppConfig = {
4647
hamsterRootPath: "",
4748
hamsterBookmarkName: "",
4849
releaseSource: "cnb",
50+
usePrereleaseScheme: false,
4951
githubToken: "",
5052
schemeEdition: "base",
5153
proSchemeKey: "moqi",

Rime-Wanxiang-Updater/utils/meta.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { storage } from "./common"
66
export type SchemeMeta = {
77
remoteIdOrSha: string
88
remoteTagOrName: string
9+
usePrereleaseScheme?: boolean
910
schemeEdition?: SchemeEdition
1011
proSchemeKey?: ProSchemeKey
1112
selectedScheme?: string
@@ -50,6 +51,7 @@ type RecordData = {
5051
cnb_id?: string
5152
release_source?: string
5253
input_method?: string
54+
prerelease_scheme?: string
5355
}
5456

5557
type RecordKind = "scheme" | "dict" | "model" | "predict"
@@ -310,6 +312,7 @@ function toSchemeMeta(rec?: RecordData): SchemeMeta | undefined {
310312
return {
311313
remoteIdOrSha,
312314
remoteTagOrName,
315+
usePrereleaseScheme: String(rec.prerelease_scheme ?? "").trim() === "1",
313316
schemeEdition,
314317
proSchemeKey,
315318
selectedScheme,
@@ -373,6 +376,7 @@ export async function setSchemeMeta(rec: {
373376
installRoot: string
374377
bookmarkName?: string
375378
fileName: string
379+
usePrereleaseScheme?: boolean
376380
schemeEdition: SchemeEdition
377381
proSchemeKey?: ProSchemeKey
378382
inputMethod?: InputMethod
@@ -396,6 +400,7 @@ export async function setSchemeMeta(rec: {
396400
cnb_id: ids.cnb_id,
397401
release_source: rec.source ?? "",
398402
input_method: rec.inputMethod ?? "",
403+
prerelease_scheme: rec.usePrereleaseScheme ? "1" : "0",
399404
}
400405
writeRecord(rec.installRoot, "scheme", data, rec.bookmarkName)
401406
await loadMetaAsync(rec.installRoot, rec.bookmarkName)

Rime-Wanxiang-Updater/utils/update_tasks.tsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ function normalizeMark(v?: string): string {
6161
return String(v ?? "").trim().toLowerCase()
6262
}
6363

64+
function schemeRemoteMarkForConfig(cfg: AppConfig, asset?: RemoteAsset): string {
65+
return normalizeMark(
66+
cfg.usePrereleaseScheme
67+
? (asset?.remoteIdOrSha ?? asset?.tag ?? asset?.name)
68+
: (asset?.tag ?? asset?.name)
69+
)
70+
}
71+
6472
function ensureRemoteMark(asset?: RemoteAsset, kind?: "dict" | "model"): string | undefined {
6573
if (!asset) return undefined
6674
const direct = String(asset.remoteIdOrSha ?? "").trim()
@@ -282,6 +290,23 @@ async function fetchModelReleaseAsset(cfg: AppConfig, fileName: string): Promise
282290

283291
async function fetchLatestSchemeAsset(cfg: AppConfig): Promise<RemoteAsset | undefined> {
284292
const glob = schemePattern(cfg)
293+
if (cfg.usePrereleaseScheme) {
294+
if (cfg.releaseSource === "github") {
295+
return fetchLatestAssetFromGithub({
296+
owner: OWNER,
297+
repo: GH_REPO,
298+
tag: DICT_TAG,
299+
assetNameGlob: glob,
300+
token: cfg.githubToken,
301+
})
302+
}
303+
return fetchLatestAssetFromCnb({
304+
owner: OWNER,
305+
repo: CNB_REPO,
306+
assetNameGlob: glob,
307+
releaseTitleIncludes: [CNB_DICT_TITLE],
308+
})
309+
}
285310
if (cfg.releaseSource === "github") {
286311
return fetchLatestAssetFromGithub({
287312
owner: OWNER,
@@ -465,6 +490,7 @@ export async function updateScheme(
465490
installRoot: installDir,
466491
bookmarkName: cfg.hamsterBookmarkName,
467492
fileName: latest.name,
493+
usePrereleaseScheme: cfg.usePrereleaseScheme,
468494
schemeEdition: cfg.schemeEdition,
469495
proSchemeKey: cfg.schemeEdition === "pro" ? cfg.proSchemeKey : undefined,
470496
inputMethod: cfg.inputMethod,
@@ -773,10 +799,17 @@ export async function autoUpdateAll(
773799
const installRoot = await resolveRimeDir(cfg)
774800
const meta = await loadMetaAsync(installRoot, cfg.hamsterBookmarkName)
775801

776-
const schemeRemoteMark = r.scheme?.tag ?? r.scheme?.name
802+
const schemeRemoteMark = schemeRemoteMarkForConfig(cfg, r.scheme)
777803
const needScheme = typeof preDecision?.scheme === "boolean"
778804
? preDecision.scheme
779-
: !!(schemeRemoteMark && normalizeMark(meta.scheme?.remoteTagOrName) !== normalizeMark(schemeRemoteMark))
805+
: !!(
806+
schemeRemoteMark &&
807+
normalizeMark(
808+
cfg.usePrereleaseScheme
809+
? meta.scheme?.remoteIdOrSha
810+
: meta.scheme?.remoteTagOrName
811+
) !== schemeRemoteMark
812+
)
780813

781814
const remoteDictMark = normalizeMark(ensureRemoteMark(r.dict, "dict"))
782815
const localDictMark = normalizeMark(meta.dict?.remoteIdOrSha)

0 commit comments

Comments
 (0)