Implement encoding and decoding for Windows-invalid characters in file names

- Added `encode_path_name` and `decode_path_name` functions to handle encoding and decoding of invalid characters.
- Updated `SyncbackRules` to include an option for encoding Windows-invalid characters during syncback.
- Modified `name_for_inst` to conditionally encode invalid characters based on the new option.
- Adjusted `ServeSession` and `InstanceContext` to support the new encoding feature.
- Updated tests and snapshots to reflect changes in encoding behavior.
This commit is contained in:
Joe 2025-12-19 22:50:53 -06:00
parent db87fa010f
commit 6d8c85682d
59 changed files with 350 additions and 53 deletions

View file

@ -172,6 +172,11 @@ pub fn syncback_dir_no_meta<'sync>(
);
continue;
}
// Skip instances matching ignoreTrees
if snapshot.should_ignore_tree(*new_child_ref) {
old_child_map.remove(new_child.name.as_str());
continue;
}
if let Some(old_child) = old_child_map.remove(new_child.name.as_str()) {
if old_child.metadata().relevant_paths.is_empty() {
log::debug!(
@ -223,6 +228,10 @@ pub fn syncback_dir_no_meta<'sync>(
);
continue;
}
// Skip instances matching ignoreTrees
if snapshot.should_ignore_tree(*new_child_ref) {
continue;
}
children.push(snapshot.with_joined_path(*new_child_ref, None)?);
}
}

View file

@ -30,6 +30,7 @@ use serde::{Deserialize, Serialize};
use crate::{
glob::Glob,
path_encoding::decode_path_name,
project::DEFAULT_PROJECT_NAMES,
syncback::{SyncbackReturn, SyncbackSnapshot},
};
@ -74,13 +75,19 @@ pub fn snapshot_from_vfs(
if meta.is_dir() {
let (middleware, dir_name, init_path) = get_dir_middleware(vfs, path)?;
// Decode directory name if the flag is set
let decoded_name = if context.decode_windows_invalid_chars {
decode_path_name(dir_name)
} else {
dir_name.to_string()
};
// TODO: Support user defined init paths
// If and when we do, make sure to go support it in
// `Project::set_file_name`, as right now it special-cases
// `default.project.json` as an `init` path.
match middleware {
Middleware::Dir => middleware.snapshot(context, vfs, path, dir_name),
_ => middleware.snapshot(context, vfs, &init_path, dir_name),
Middleware::Dir => middleware.snapshot(context, vfs, path, &decoded_name),
_ => middleware.snapshot(context, vfs, &init_path, &decoded_name),
}
} else {
let file_name = path
@ -152,19 +159,23 @@ fn snapshot_from_path(
vfs: &Vfs,
path: &Path,
) -> anyhow::Result<Option<InstanceSnapshot>> {
// Helper to decode name if the flag is set
let decode_name = |name: &str| -> String {
if context.decode_windows_invalid_chars {
decode_path_name(name)
} else {
name.to_string()
}
};
if let Some(rule) = context.get_user_sync_rule(path) {
return rule
.middleware
.snapshot(context, vfs, path, rule.file_name_for_path(path)?);
let name = decode_name(rule.file_name_for_path(path)?);
return rule.middleware.snapshot(context, vfs, path, &name);
} else {
for rule in default_sync_rules() {
if rule.matches(path) {
return rule.middleware.snapshot(
context,
vfs,
path,
rule.file_name_for_path(path)?,
);
let name = decode_name(rule.file_name_for_path(path)?);
return rule.middleware.snapshot(context, vfs, path, &name);
}
}
}

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /root/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /root/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /foo/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /foo/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~
@ -45,6 +46,7 @@ children:
- /foo/Child/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: dir
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo.model.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~
@ -26,6 +27,7 @@ children:
relevant_paths: []
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo.model.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~
@ -26,6 +27,7 @@ children:
relevant_paths: []
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /bar.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /root/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -20,6 +20,7 @@ metadata:
- /root/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /bar.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: false
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -10,6 +10,7 @@ metadata:
- /foo/bar.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -10,6 +10,7 @@ metadata:
- /foo/bar.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -10,6 +10,7 @@ metadata:
- /foo/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -10,6 +10,7 @@ metadata:
- /foo/init.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo/default.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo/hello.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -12,6 +12,7 @@ metadata:
- /foo/default.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: project
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~
@ -31,6 +32,7 @@ children:
relevant_paths: []
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -12,6 +12,7 @@ metadata:
- /foo/default.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: project
schema: ~

View file

@ -12,6 +12,7 @@ metadata:
- /foo/default.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: project
schema: ~
@ -32,6 +33,7 @@ children:
relevant_paths: []
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -14,6 +14,7 @@ metadata:
- /foo/default.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: text
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -11,6 +11,7 @@ metadata:
- /foo.project.json
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- /foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: ~
middleware: ~
schema: ~

View file

@ -13,6 +13,7 @@ metadata:
- foo.meta.jsonc
context:
emit_legacy_scripts: true
decode_windows_invalid_chars: false
specified_id: manually specified
middleware: ~
schema: ~