Skip to content

Commit a615721

Browse files
authored
fix(bundler): resources bundling on Windows with nested folder structure (#2081)
1 parent ed5c1cd commit a615721

2 files changed

Lines changed: 41 additions & 46 deletions

File tree

.changes/fix-wix-resources.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri-bundler": patch
3+
---
4+
5+
Properly bundle resources with nested folder structure.

tooling/bundler/src/bundle/windows/msi/wix.rs

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ pub fn build_wix_app_installer(
486486
data.insert("binaries", binaries_json);
487487

488488
let resources = generate_resource_data(settings)?;
489+
println!("{:?}", serde_json::to_string(&resources).unwrap());
489490
let mut resources_wix_string = String::from("");
490491
let mut files_ids = Vec::new();
491492
for (_, dir) in resources {
@@ -703,19 +704,35 @@ fn generate_resource_data(settings: &Settings) -> crate::Result<ResourceMap> {
703704
};
704705

705706
// split the resource path directories
706-
let mut directories = src
707+
let directories = src
707708
.components()
708709
.filter(|component| {
709710
let comp = component.as_os_str();
710711
comp != "." && comp != ".."
711712
})
712713
.collect::<Vec<_>>();
713-
directories.truncate(directories.len() - 1);
714714
// transform the directory structure to a chained vec structure
715715
let first_directory = directories
716716
.first()
717717
.map(|d| d.as_os_str().to_string_lossy().into_owned())
718718
.unwrap_or_else(String::new);
719+
720+
if !resources.contains_key(&first_directory) {
721+
resources.insert(
722+
first_directory.clone(),
723+
ResourceDirectory {
724+
path: first_directory.clone(),
725+
name: first_directory.clone(),
726+
directories: vec![],
727+
files: vec![],
728+
},
729+
);
730+
}
731+
732+
let mut directory_entry = resources
733+
.get_mut(&first_directory)
734+
.expect("Unable to handle resources");
735+
719736
let last_index = directories.len() - 1;
720737
let mut path = String::new();
721738
for (i, directory) in directories.into_iter().enumerate() {
@@ -725,57 +742,30 @@ fn generate_resource_data(settings: &Settings) -> crate::Result<ResourceMap> {
725742
.into_string()
726743
.expect("failed to read resource folder name");
727744
path.push_str(directory_name.as_str());
745+
path.push(std::path::MAIN_SEPARATOR);
728746

729-
// if the directory is already on the map
730-
if resources.contains_key(&first_directory) {
731-
let directory_entry = &mut resources
732-
.get_mut(&first_directory)
733-
.expect("Unable to handle resources");
734-
if last_index == 0 {
735-
// the directory entry is the root of the chain
736-
directory_entry.add_file(resource_entry.clone());
737-
} else {
738-
let index = directory_entry
739-
.directories
740-
.iter()
741-
.position(|f| f.path == path);
742-
if let Some(index) = index {
743-
// the directory entry is already a part of the chain
744-
if i == last_index {
745-
let dir = directory_entry
746-
.directories
747-
.get_mut(index)
748-
.expect("Unable to get directory");
749-
dir.add_file(resource_entry.clone());
750-
}
751-
} else {
752-
// push it to the chain
747+
if i == last_index {
748+
directory_entry.add_file(resource_entry);
749+
break;
750+
} else if i == 0 {
751+
continue;
752+
} else {
753+
let index = directory_entry
754+
.directories
755+
.iter()
756+
.position(|f| f.path == path);
757+
match index {
758+
Some(i) => directory_entry = directory_entry.directories.iter_mut().nth(i).unwrap(),
759+
None => {
753760
directory_entry.directories.push(ResourceDirectory {
754761
path: path.clone(),
755-
name: directory_name.clone(),
762+
name: directory_name,
756763
directories: vec![],
757-
files: if i == last_index {
758-
vec![resource_entry.clone()]
759-
} else {
760-
vec![]
761-
},
764+
files: vec![],
762765
});
766+
directory_entry = directory_entry.directories.iter_mut().last().unwrap();
763767
}
764768
}
765-
} else {
766-
resources.insert(
767-
directory_name.clone(),
768-
ResourceDirectory {
769-
path: path.clone(),
770-
name: directory_name.clone(),
771-
directories: vec![],
772-
files: if i == last_index {
773-
vec![resource_entry.clone()]
774-
} else {
775-
vec![]
776-
},
777-
},
778-
);
779769
}
780770
}
781771
}

0 commit comments

Comments
 (0)