chore: purge garbled Windows-path filenames; guard sync.sh against recurrence

Removed 5 tracked files whose names were mangled Windows paths (C:\ProgramData\...,
D:\claudetools\.claude\current-mode, and version-bump script fragments) — the
illegal :/\ chars were stored as Unicode Private-Use-Area substitutes (U+F03A, U+F00A).

Added purge_garbled_paths() to sync.sh: before each 'git add -A', any UNTRACKED path
containing control chars, ':', '\', or PUA U+E000-U+F8FF bytes is removed and not
staged, so this cruft never reaches Gitea again. Tracked content is never auto-deleted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 10:24:05 -07:00
parent ac4ab9b89b
commit a3c7064606
6 changed files with 26 additions and 1 deletions

View File

@@ -12,6 +12,30 @@ YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
# --- Guard: strip Windows path-as-filename cruft before staging -------------
# Windows machines occasionally drop files literally named like "C:\path" or
# ".claude\current-mode" into the repo. The illegal ':' / '\' chars get stored
# as Unicode Private-Use-Area substitutes (U+F03A, U+F00A, ...). A blind
# `git add -A` would stage and propagate them to Gitea. This removes any such
# UNTRACKED path before staging. Only untracked files are touched — tracked
# content is never auto-deleted (use `git rm` for that, deliberately).
purge_garbled_paths() {
local rec st p removed=0
while IFS= read -r -d '' rec; do
st="${rec:0:2}"
p="${rec:3}"
[ -z "$p" ] && continue
[ "$st" = "??" ] || continue # untracked only
if printf '%s' "$p" | LC_ALL=C grep -qaP '[\x00-\x1f\\:]|\xee[\x80-\xbf]|\xef[\x80-\xa3]'; then
echo -e "${YELLOW}[WARNING]${NC} Removing garbled untracked path before staging: $(printf '%s' "$p" | cat -v)"
rm -f -- "$p" 2>/dev/null || true
removed=1
fi
done < <(git status --porcelain -z)
[ "$removed" = 1 ] && echo -e "${YELLOW}[WARNING]${NC} Garbled Windows path-as-filename cruft removed (not synced)."
return 0
}
# Machine + timestamp
if [ -n "$COMPUTERNAME" ]; then
MACHINE="$COMPUTERNAME"
@@ -100,6 +124,7 @@ if [ -n "$(git status --porcelain)" ]; then
echo ""
echo -e "${GREEN}[OK]${NC} Staging all changes..."
purge_garbled_paths
git add -A
# Commit message (Co-Authored-By uses local git user if configured)
@@ -275,6 +300,7 @@ else
# Commit any local vault changes (porcelain catches untracked-only too)
if [ -n "$(git status --porcelain)" ]; then
echo -e "${YELLOW}[INFO]${NC} Local vault changes detected — committing..."
purge_garbled_paths
git add -A
git commit -m "sync: auto-sync vault from $MACHINE at $TIMESTAMP"
echo -e "${GREEN}[OK]${NC} Vault committed."