Skip to content

Commit e37309d

Browse files
committed
feat(fnos-mount-manager): 添加受管区块差异输出功能
当检查发现受管区块与本地预览不匹配时,现在会统一输出差异对比, 方便用户直接查看本地预览和目标受管区块之间的具体差别。 新增了 fm_report_managed_block_diff 函数来处理差异显示逻辑, 该函数会创建临时文件并使用 diff 命令比较预期区块和实际区块, 然后将差异内容以标准化格式输出到错误流中。 同时为 check 命令添加了相应的测试用例,验证差异输出功能的正确性。
1 parent f56ec6d commit e37309d

3 files changed

Lines changed: 112 additions & 0 deletions

File tree

linux/fnos/fnos-mount-manager/commands/check.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,44 @@ if [[ -n "${FNOS_MOUNT_MANAGER_CHECK_LOADED:-}" ]]; then
55
fi
66
FNOS_MOUNT_MANAGER_CHECK_LOADED=1
77

8+
# 在受管区块不一致时输出统一 diff,方便直接看 preview 和目标文件的差异。
9+
fm_report_managed_block_diff() {
10+
local expected_block="$1"
11+
local actual_block="$2"
12+
local expected_file
13+
local actual_file
14+
expected_file="$(mktemp)"
15+
actual_file="$(mktemp)"
16+
17+
printf '%s\n' "${expected_block}" > "${expected_file}"
18+
printf '%s\n' "${actual_block}" > "${actual_file}"
19+
20+
if command -v diff >/dev/null 2>&1; then
21+
local diff_output
22+
diff_output="$(
23+
diff -u \
24+
--label "local-preview" \
25+
--label "target-managed-block" \
26+
"${expected_file}" \
27+
"${actual_file}" || true
28+
)"
29+
if [[ -n "${diff_output}" ]]; then
30+
fm_log "error" "Managed block diff:"
31+
while IFS= read -r line; do
32+
printf '[fnos-mount-manager][error] %s\n' "${line}" >&2
33+
done <<< "${diff_output}"
34+
fi
35+
else
36+
fm_log "error" "Managed block diff: diff command not available"
37+
fm_log "error" "Expected block:"
38+
printf '%s\n' "${expected_block}" >&2
39+
fm_log "error" "Actual block:"
40+
printf '%s\n' "${actual_block}" >&2
41+
fi
42+
43+
rm -f "${expected_file}" "${actual_file}"
44+
}
45+
846
# 检查单个渲染产物是否与当前配置匹配,并把异常累加到错误计数里。
947
fm_check_rendered_file() {
1048
local config_path="$1"
@@ -119,6 +157,7 @@ EOF
119157

120158
if [[ "${expected_block}" != "${actual_block}" ]]; then
121159
fm_log "error" "Managed block in ${target} does not match the local preview"
160+
fm_report_managed_block_diff "${expected_block}" "${actual_block}"
122161
error_count=$(( error_count + 1 ))
123162
fi
124163
else

linux/fnos/fnos-mount-manager/fnos-mount-manager.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,44 @@ if [[ -n "${FNOS_MOUNT_MANAGER_CHECK_LOADED:-}" ]]; then
627627
fi
628628
FNOS_MOUNT_MANAGER_CHECK_LOADED=1
629629

630+
# 在受管区块不一致时输出统一 diff,方便直接看 preview 和目标文件的差异。
631+
fm_report_managed_block_diff() {
632+
local expected_block="$1"
633+
local actual_block="$2"
634+
local expected_file
635+
local actual_file
636+
expected_file="$(mktemp)"
637+
actual_file="$(mktemp)"
638+
639+
printf '%s\n' "${expected_block}" > "${expected_file}"
640+
printf '%s\n' "${actual_block}" > "${actual_file}"
641+
642+
if command -v diff >/dev/null 2>&1; then
643+
local diff_output
644+
diff_output="$(
645+
diff -u \
646+
--label "local-preview" \
647+
--label "target-managed-block" \
648+
"${expected_file}" \
649+
"${actual_file}" || true
650+
)"
651+
if [[ -n "${diff_output}" ]]; then
652+
fm_log "error" "Managed block diff:"
653+
while IFS= read -r line; do
654+
printf '[fnos-mount-manager][error] %s\n' "${line}" >&2
655+
done <<< "${diff_output}"
656+
fi
657+
else
658+
fm_log "error" "Managed block diff: diff command not available"
659+
fm_log "error" "Expected block:"
660+
printf '%s\n' "${expected_block}" >&2
661+
fm_log "error" "Actual block:"
662+
printf '%s\n' "${actual_block}" >&2
663+
fi
664+
665+
rm -f "${expected_file}" "${actual_file}"
666+
}
667+
630668
# 检查单个渲染产物是否与当前配置匹配,并把异常累加到错误计数里。
631669
fm_check_rendered_file() {
632670
local config_path="$1"
@@ -741,6 +779,7 @@ EOF
741779

742780
if [[ "${expected_block}" != "${actual_block}" ]]; then
743781
fm_log "error" "Managed block in ${target} does not match the local preview"
782+
fm_report_managed_block_diff "${expected_block}" "${actual_block}"
744783
error_count=$(( error_count + 1 ))
745784
fi
746785
else

linux/fnos/fnos-mount-manager/tests/check.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import fs from 'node:fs'
12
import { afterEach, describe, expect, it } from 'vitest'
23
import {
34
cleanupWorkspace,
@@ -111,4 +112,37 @@ describe('fnos mount manager check', () => {
111112
'# BEGIN FNOS MOUNT MANAGER',
112113
)
113114
})
115+
116+
it('prints a managed block diff when the target block drifts from the local preview', () => {
117+
const workspace = createWorkspace()
118+
workspaces.push(workspace)
119+
120+
installCheckSystemctl(workspace)
121+
ensureFakeDevice(workspace, 'LABEL:local-book')
122+
ensureFakeDevice(workspace, 'UUID:local-debut')
123+
expect(runSource(workspace, ['generate']).exitCode).toBe(0)
124+
expect(
125+
runSource(workspace, ['apply', '--target', workspace.targetFstab])
126+
.exitCode,
127+
).toBe(0)
128+
129+
const drifted = readText(workspace.targetFstab).replace(
130+
'UUID=local-debut /mnt/local/debutDisk ntfs nofail,uid=1000,gid=1000,umask=022,big_writes,x-systemd.device-timeout=45 0 0',
131+
'UUID=local-debut /mnt/local/debutDisk ntfs nofail,uid=1000,gid=1000,umask=022 0 0',
132+
)
133+
fs.writeFileSync(workspace.targetFstab, drifted, 'utf8')
134+
135+
const result = runSource(workspace, [
136+
'check',
137+
'--target',
138+
workspace.targetFstab,
139+
])
140+
141+
expect(result.exitCode).not.toBe(0)
142+
expect(result.stderr + result.stdout).toContain('Managed block diff:')
143+
expect(result.stderr + result.stdout).toContain('--- local-preview')
144+
expect(result.stderr + result.stdout).toContain('+++ target-managed-block')
145+
expect(result.stderr + result.stdout).toContain('-UUID=local-debut /mnt/local/debutDisk ntfs nofail,uid=1000,gid=1000,umask=022,big_writes,x-systemd.device-timeout=45 0 0')
146+
expect(result.stderr + result.stdout).toContain('+UUID=local-debut /mnt/local/debutDisk ntfs nofail,uid=1000,gid=1000,umask=022 0 0')
147+
})
114148
})

0 commit comments

Comments
 (0)