Rename backup archive root so extraction dir mode isn't clobbered
Build App / compute-version (pull_request) Successful in 4s
Build App / build-macos (pull_request) Successful in 2m14s
Build App / build-windows (pull_request) Successful in 4m26s
Build App / build-linux (pull_request) Successful in 5m0s
Build App / create-tag (pull_request) Has been skipped
Build App / sync-to-github (pull_request) Has been skipped
Build App / compute-version (pull_request) Successful in 4s
Build App / build-macos (pull_request) Successful in 2m14s
Build App / build-windows (pull_request) Successful in 4m26s
Build App / build-linux (pull_request) Successful in 5m0s
Build App / create-tag (pull_request) Has been skipped
Build App / sync-to-github (pull_request) Has been skipped
The transform used `s,^\./,workspace/,`, which rewrites the workspace *contents* (`./foo` -> `workspace/foo`) but leaves tar's root member as a bare `./`. That `./` entry carries the source root's mode/mtime, and on extraction tar stamps them onto the extraction directory itself. Match the leading `.` instead (`s,^\.,workspace,`) so the root member is renamed `./` -> `workspace`, giving the archive a proper `workspace/` directory entry and no bare `./`. The extraction directory is left untouched. Contents, hidden files, excludes, symlink targets and the `flags=rh` hardlink handling are unchanged. Verified in-container: archive top level is exactly `workspace/` + `home-claude/`, no `./` member, node_modules excluded, extraction into a 0755 dir leaves it 0755, workspace/.git preserved. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -206,10 +206,14 @@ pub async fn download_container_backup(
|
||||
// so secrets can't leak through the sanitization fallback.
|
||||
// The `--transform` nests the workspace under `workspace/` (parallel to
|
||||
// `home-claude/`) so an extracted archive has both clearly labeled instead
|
||||
// of scattering the workspace files into the extraction dir. `flags=rh`
|
||||
// rewrites regular member names AND hardlink target names (so an intra-
|
||||
// workspace hardlink pair still resolves on extract) while leaving symlink
|
||||
// targets untouched (rewriting those would corrupt relative/absolute links).
|
||||
// of scattering the workspace files into the extraction dir. Rewriting the
|
||||
// leading `.` (rather than `./`) also renames tar's root member from `./` to
|
||||
// `workspace`, so the archive carries a proper `workspace/` dir entry rather
|
||||
// than a bare `./` that would stamp the source root's mode/mtime onto the
|
||||
// extraction directory. `flags=rh` rewrites regular member names AND
|
||||
// hardlink target names (so an intra-workspace hardlink pair still resolves
|
||||
// on extract) while leaving symlink targets untouched (rewriting those would
|
||||
// corrupt relative/absolute links).
|
||||
let script = r#"set -e
|
||||
STAGE=$(mktemp -d)
|
||||
trap 'rm -rf "$STAGE"' EXIT
|
||||
@@ -227,7 +231,7 @@ if [ -d "$HOME/.claude" ]; then
|
||||
fi
|
||||
tar czf - --ignore-failed-read \
|
||||
--exclude='*/node_modules' --exclude='*/target' \
|
||||
--transform='flags=rh;s,^\./,workspace/,' \
|
||||
--transform='flags=rh;s,^\.,workspace,' \
|
||||
-C "$TC_BACKUP_SRC" . \
|
||||
-C "$STAGE" home-claude"#;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user