参考所有分组:锁定loadusr资产清单校验,测试通过

This commit is contained in:
cnc
2026-06-03 17:00:15 +08:00
parent 180c0f6dbe
commit 3cc7590121
2 changed files with 161 additions and 16 deletions

View File

@@ -363,6 +363,9 @@ validate_generator_cli_contract() {
local cli_manifest_with_unused_postgui local cli_manifest_with_unused_postgui
local cli_manifest_with_unused_remap local cli_manifest_with_unused_remap
local cli_manifest_with_unused_tooldata local cli_manifest_with_unused_tooldata
local cli_manifest_without_halfile_loadusr_asset
local cli_melfa_manifest
local cli_melfa_without_halcmd_loadusr_asset
local cli_trsrn_manifest local cli_trsrn_manifest
local cli_trsrn_without_g531_asset local cli_trsrn_without_g531_asset
local cli_trsrn_without_g69_asset local cli_trsrn_without_g69_asset
@@ -388,6 +391,9 @@ validate_generator_cli_contract() {
cli_manifest_with_unused_postgui="$cli_dir/bridgemill-manifest-with-unused-postgui.txt" cli_manifest_with_unused_postgui="$cli_dir/bridgemill-manifest-with-unused-postgui.txt"
cli_manifest_with_unused_remap="$cli_dir/bridgemill-manifest-with-unused-remap.txt" cli_manifest_with_unused_remap="$cli_dir/bridgemill-manifest-with-unused-remap.txt"
cli_manifest_with_unused_tooldata="$cli_dir/bridgemill-manifest-with-unused-tooldata.txt" cli_manifest_with_unused_tooldata="$cli_dir/bridgemill-manifest-with-unused-tooldata.txt"
cli_manifest_without_halfile_loadusr_asset="$cli_dir/bridgemill-manifest-without-halfile-loadusr-asset.txt"
cli_melfa_manifest="$cli_dir/melfa-manifest.txt"
cli_melfa_without_halcmd_loadusr_asset="$cli_dir/melfa-manifest-without-halcmd-loadusr-asset.txt"
cli_trsrn_manifest="$cli_dir/trsrn-manifest.txt" cli_trsrn_manifest="$cli_dir/trsrn-manifest.txt"
cli_trsrn_without_g531_asset="$cli_dir/trsrn-manifest-without-g531-asset.txt" cli_trsrn_without_g531_asset="$cli_dir/trsrn-manifest-without-g531-asset.txt"
cli_trsrn_without_g69_asset="$cli_dir/trsrn-manifest-without-g69-asset.txt" cli_trsrn_without_g69_asset="$cli_dir/trsrn-manifest-without-g69-asset.txt"
@@ -415,6 +421,7 @@ validate_generator_cli_contract() {
require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc") require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc")
require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc") require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc")
require("tooldata:configs/sim/axis/vismach/5axis/bridgemill/5axis.tbl") require("tooldata:configs/sim/axis/vismach/5axis/bridgemill/5axis.tbl")
require("asset:src/hal/user_comps/vismach/5axisgui.py")
} }
{ {
key = $1 ":" $2 key = $1 ":" $2
@@ -528,6 +535,64 @@ validate_generator_cli_contract() {
echo "switchkins remap generator accepted manifest missing LinuxCNC TOOL_TABLE source" >&2 echo "switchkins remap generator accepted manifest missing LinuxCNC TOOL_TABLE source" >&2
exit 1 exit 1
fi fi
grep -Fv \
'asset:src/hal/user_comps/vismach/5axisgui.py:' \
"$cli_manifest" >"$cli_manifest_without_halfile_loadusr_asset"
if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \
"$cli_manifest_without_halfile_loadusr_asset" >/dev/null 2>&1; then
echo "switchkins remap generator accepted manifest missing LinuxCNC HALFILE loadusr asset source" >&2
exit 1
fi
if ! awk -F: -v manifest="$manifest_file" '
function require(key) {
expected[++expected_count] = key
expected_keys[key] = 1
}
BEGIN {
require("config:configs/sim/axis/vismach/melfa-sim/melfa.ini")
require("config:configs/sim/axis/vismach/melfa-sim/melfa_dh.hal")
require("config:configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal")
require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc")
require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/429remap.ngc")
require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/430remap.ngc")
require("tooldata:configs/sim/axis/vismach/melfa-sim/melfa.tbl")
require("asset:src/hal/user_comps/vismach/melfagui.py")
}
{
key = $1 ":" $2
if (key in expected_keys) {
if (key in manifest_line) {
print "duplicate melfa switchkins source in " manifest ": " key > "/dev/stderr"
duplicate = 1
}
manifest_line[key] = $0
}
}
END {
missing = 0
for (expected_index = 1; expected_index <= expected_count; expected_index++) {
key = expected[expected_index]
if (!(key in manifest_line)) {
print "melfa switchkins source is not listed in " manifest ": " key > "/dev/stderr"
missing = 1
continue
}
print manifest_line[key]
}
exit missing || duplicate
}
' "$manifest_file" >"$cli_melfa_manifest"; then
exit 1
fi
grep -Fv \
'asset:src/hal/user_comps/vismach/melfagui.py:' \
"$cli_melfa_manifest" >"$cli_melfa_without_halcmd_loadusr_asset"
if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \
"$cli_melfa_without_halcmd_loadusr_asset" >/dev/null 2>&1; then
echo "switchkins remap generator accepted manifest missing LinuxCNC HALCMD loadusr command asset source" >&2
exit 1
fi
cp "$cli_manifest" "$cli_manifest_with_unused_hal" cp "$cli_manifest" "$cli_manifest_with_unused_hal"
grep -F \ grep -F \
'config:configs/sim/axis/vismach/melfa-sim/melfa_dh.hal:' \ 'config:configs/sim/axis/vismach/melfa-sim/melfa_dh.hal:' \

View File

@@ -102,11 +102,16 @@ read_ini_switchkins_config() {
print "postgui_halfile\t" value print "postgui_halfile\t" value
} else if (section == "hal" && key == "halcmd") { } else if (section == "hal" && key == "halcmd") {
lower = tolower(value) lower = tolower(value)
if (lower ~ /(^|[[:space:]])loadusr([[:space:]]|$)/ && if (lower ~ /(^|[[:space:]])loadusr([[:space:]]|$)/) {
match(lower, /[^[:space:]]+\.py([[:space:]]|$)/)) { command = value
py = substr(value, RSTART, RLENGTH) sub(/^.*(^|[[:space:]])loadusr[[:space:]]+/, "", command)
sub(/[[:space:]]*$/, "", py) while (command ~ /^-[^[:space:]]+[[:space:]]+/) {
print "halcmd_loadusr_py\t" py sub(/^-[^[:space:]]+[[:space:]]+/, "", command)
}
sub(/[[:space:]].*$/, "", command)
if (command != "") {
print "halcmd_loadusr\t" command
}
} }
} else if (section == "emcio" && key == "tool_table") { } else if (section == "emcio" && key == "tool_table") {
print "tool_table\t" value print "tool_table\t" value
@@ -149,6 +154,34 @@ read_ini_switchkins_config() {
' "$file" ' "$file"
} }
read_loadusr_commands() {
local file=$1
awk '
function trim(value) {
sub(/^[[:space:]]*/, "", value)
sub(/[[:space:]]*$/, "", value)
return value
}
{
line = $0
sub(/[[:space:]]*#.*/, "", line)
line = trim(line)
lower = tolower(line)
if (lower !~ /(^|[[:space:]])loadusr([[:space:]]|$)/) {
next
}
sub(/^.*(^|[[:space:]])loadusr[[:space:]]+/, "", line)
while (line ~ /^-[^[:space:]]+[[:space:]]+/) {
sub(/^-[^[:space:]]+[[:space:]]+/, "", line)
}
sub(/[[:space:]].*$/, "", line)
if (line != "") {
print line
}
}
' "$file"
}
resolved_config_path= resolved_config_path=
resolve_config_path() { resolve_config_path() {
local config_dir=$1 local config_dir=$1
@@ -382,6 +415,49 @@ asset_source_for_path() {
resolved_asset_source=$resolved_linuxcnc_path resolved_asset_source=$resolved_linuxcnc_path
} }
resolved_loadusr_asset_source=
loadusr_asset_source_for_command() {
local config=$1
local command=$2
resolved_loadusr_asset_source=
[[ -n "$command" ]] || return 1
if [[ "$command" == */* || "$command" == *.py ]]; then
if asset_source_for_path "$config" "$command"; then
resolved_loadusr_asset_source=$resolved_asset_source
return 0
fi
if [[ "$command" != *.py ]] && asset_source_for_path "$config" "$command.py"; then
resolved_loadusr_asset_source=$resolved_asset_source
return 0
fi
return 1
fi
local source="src/hal/user_comps/vismach/$command.py"
if [[ -f "$linuxcnc_root/$source" ]]; then
resolved_loadusr_asset_source=$source
return 0
fi
if asset_source_for_path "$config" "$command.py"; then
resolved_loadusr_asset_source=$resolved_asset_source
return 0
fi
return 1
}
record_loadusr_asset() {
local config_path=$1
local config=$2
local command=$3
local label=$4
if loadusr_asset_source_for_command "$config" "$command"; then
loadusr_asset_source=$resolved_loadusr_asset_source
record_asset_source "$config_path" "$loadusr_asset_source" "$label"
record_python_import_assets "$config_path" "$loadusr_asset_source"
fi
}
resolved_python_module_source= resolved_python_module_source=
python_module_source_for_name() { python_module_source_for_name() {
local config=$1 local config=$1
@@ -813,7 +889,7 @@ while IFS=: read -r group path _note; do
python_paths= python_paths=
python_toplevels= python_toplevels=
python_remaps= python_remaps=
halcmd_loadusr_pys= halcmd_loadusrs=
remap_ngc_428= remap_ngc_428=
remap_ngc_429= remap_ngc_429=
remap_ngc_430= remap_ngc_430=
@@ -852,8 +928,8 @@ while IFS=: read -r group path _note; do
python_remap) python_remap)
python_remaps+="${python_remaps:+$'\n'}$ini_value" python_remaps+="${python_remaps:+$'\n'}$ini_value"
;; ;;
halcmd_loadusr_py) halcmd_loadusr)
halcmd_loadusr_pys+="${halcmd_loadusr_pys:+$'\n'}$ini_value" halcmd_loadusrs+="${halcmd_loadusrs:+$'\n'}$ini_value"
;; ;;
remap_428) remap_428)
[[ -n "$remap_ngc_428" ]] || remap_ngc_428=$ini_value [[ -n "$remap_ngc_428" ]] || remap_ngc_428=$ini_value
@@ -948,6 +1024,10 @@ while IFS=: read -r group path _note; do
record_config_source "$path" "$hal_source" "HALFILE" record_config_source "$path" "$hal_source" "HALFILE"
add_alias "$hal_source" "$m428" "$m429" "$m430" add_alias "$hal_source" "$m428" "$m429" "$m430"
add_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430" add_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430"
while IFS= read -r loadusr_command; do
[[ -n "$loadusr_command" ]] || continue
record_loadusr_asset "$path" "$linuxcnc_root/$hal_source" "$loadusr_command" "HALFILE loadusr"
done < <(read_loadusr_commands "$linuxcnc_root/$hal_source")
fi fi
add_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_halfile_cases "$halfile" "$m428" "$m429" "$m430"
add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430"
@@ -958,6 +1038,10 @@ while IFS=: read -r group path _note; do
record_config_source "$path" "$hal_source" "POSTGUI_HALFILE" record_config_source "$path" "$hal_source" "POSTGUI_HALFILE"
add_alias "$hal_source" "$m428" "$m429" "$m430" add_alias "$hal_source" "$m428" "$m429" "$m430"
add_postgui_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430" add_postgui_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430"
while IFS= read -r loadusr_command; do
[[ -n "$loadusr_command" ]] || continue
record_loadusr_asset "$path" "$linuxcnc_root/$hal_source" "$loadusr_command" "POSTGUI_HALFILE loadusr"
done < <(read_loadusr_commands "$linuxcnc_root/$hal_source")
fi fi
add_postgui_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_postgui_halfile_cases "$halfile" "$m428" "$m429" "$m430"
add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430"
@@ -997,14 +1081,10 @@ while IFS=: read -r group path _note; do
record_python_import_assets "$path" "$python_remap_source" record_python_import_assets "$path" "$python_remap_source"
fi fi
done <<<"$python_remaps" done <<<"$python_remaps"
while IFS= read -r loadusr_py; do while IFS= read -r loadusr_command; do
[[ -n "$loadusr_py" ]] || continue [[ -n "$loadusr_command" ]] || continue
if asset_source_for_path "$config" "$loadusr_py"; then record_loadusr_asset "$path" "$config" "$loadusr_command" "HALCMD loadusr"
halcmd_loadusr_source=$resolved_asset_source done <<<"$halcmd_loadusrs"
record_asset_source "$path" "$halcmd_loadusr_source" "HALCMD loadusr"
record_python_import_assets "$path" "$halcmd_loadusr_source"
fi
done <<<"$halcmd_loadusr_pys"
for remap_source in "$remap_source_428" "$remap_source_429" "$remap_source_430"; do for remap_source in "$remap_source_428" "$remap_source_429" "$remap_source_430"; do
if [[ -n "$remap_source" ]]; then if [[ -n "$remap_source" ]]; then