Fix WIM info selection
This commit is contained in:
parent
9919a993a0
commit
6e3a0a582f
3 changed files with 86 additions and 46 deletions
|
|
@ -166,11 +166,12 @@ impl App {
|
||||||
));
|
));
|
||||||
|
|
||||||
// Build Diskpart script to format destination disk
|
// Build Diskpart script to format destination disk
|
||||||
let disk_list = self.state.disk_list.lock().unwrap();
|
if let Some(disk) = self.state.get_dest_disk() {
|
||||||
if let Some(disk_index) = self.state.disk_index_dest
|
let table_type = self
|
||||||
&& let Some(disk) = disk_list.get(disk_index)
|
.state
|
||||||
{
|
.table_type
|
||||||
let table_type = self.state.table_type.clone().unwrap();
|
.clone()
|
||||||
|
.expect("Failed to get table type.");
|
||||||
let diskpart_script = build_dest_format_script(
|
let diskpart_script = build_dest_format_script(
|
||||||
disk.id,
|
disk.id,
|
||||||
&table_type,
|
&table_type,
|
||||||
|
|
@ -196,15 +197,24 @@ impl App {
|
||||||
let wimlib_imagex = program_files.join("wimlib\\wimlib-imagex.exe");
|
let wimlib_imagex = program_files.join("wimlib\\wimlib-imagex.exe");
|
||||||
|
|
||||||
// Get image info
|
// Get image info
|
||||||
let wim_sources = self.state.wim_sources.lock().unwrap();
|
let wim_file_index = self
|
||||||
let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap());
|
.state
|
||||||
let wim_index = self.state.wim_image_index.unwrap() + 1; // wimapply uses 1-based index
|
.wim_file_index
|
||||||
|
.expect("Failed to get source WIM file index");
|
||||||
|
let mut wim_image_index = self
|
||||||
|
.state
|
||||||
|
.wim_image_index
|
||||||
|
.expect("Failed to get source WIM image index");
|
||||||
|
let wim_sources = self
|
||||||
|
.state
|
||||||
|
.wim_sources
|
||||||
|
.lock()
|
||||||
|
.expect("Failed to get WIM Sources");
|
||||||
|
let wim_file = wim_sources.get_file(wim_file_index);
|
||||||
|
wim_image_index += 1; // wimapply uses 1-based index
|
||||||
|
|
||||||
// Add actions
|
// Add actions
|
||||||
let disk_list = self.state.disk_list.lock().unwrap();
|
if let Some(disk) = self.state.get_dest_disk() {
|
||||||
if let Some(disk_index) = self.state.disk_index_dest
|
|
||||||
&& let Some(disk) = disk_list.get(disk_index)
|
|
||||||
{
|
|
||||||
let num_parts = disk.parts.len();
|
let num_parts = disk.parts.len();
|
||||||
let dest_path = format!("{}:\\", disk.get_part_letter(num_parts - 1));
|
let dest_path = format!("{}:\\", disk.get_part_letter(num_parts - 1));
|
||||||
self.tasks.add(TaskType::CommandWait(
|
self.tasks.add(TaskType::CommandWait(
|
||||||
|
|
@ -212,7 +222,7 @@ impl App {
|
||||||
vec![
|
vec![
|
||||||
String::from("apply"),
|
String::from("apply"),
|
||||||
wim_file.path,
|
wim_file.path,
|
||||||
format!("{wim_index}"),
|
format!("{wim_image_index}"),
|
||||||
dest_path,
|
dest_path,
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
|
|
@ -223,24 +233,32 @@ impl App {
|
||||||
popup::Type::Info,
|
popup::Type::Info,
|
||||||
String::from("Updating boot configuration"),
|
String::from("Updating boot configuration"),
|
||||||
))?;
|
))?;
|
||||||
let wim_sources = self.state.wim_sources.lock().unwrap();
|
let wim_index = self
|
||||||
let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap());
|
.state
|
||||||
|
.wim_image_index
|
||||||
|
.expect("Failed to get source WIM index");
|
||||||
|
let wim_sources = self
|
||||||
|
.state
|
||||||
|
.wim_sources
|
||||||
|
.lock()
|
||||||
|
.expect("Failed to get WIM Sources");
|
||||||
|
let wim_file = wim_sources.get_file(wim_index);
|
||||||
|
|
||||||
// Get System32 path
|
// Get System32 path
|
||||||
let system32 = get_system32_path(&self.action_tx);
|
let system32 = get_system32_path(&self.action_tx);
|
||||||
|
|
||||||
// Add actions
|
// Add actions
|
||||||
let disk_list = self.state.disk_list.lock().unwrap();
|
if let Some(disk) = self.state.get_dest_disk() {
|
||||||
if let Some(disk_index) = self.state.disk_index_dest
|
let table_type = self
|
||||||
&& let Some(disk) = disk_list.get(disk_index)
|
.state
|
||||||
{
|
.table_type
|
||||||
let table_type = self.state.table_type.clone().unwrap();
|
.clone()
|
||||||
|
.expect("Failed to get table type.");
|
||||||
let letter_boot = disk.get_part_letter(0);
|
let letter_boot = disk.get_part_letter(0);
|
||||||
let letter_os =
|
let letter_os = disk.get_part_letter(match table_type {
|
||||||
disk.get_part_letter(match self.state.table_type.clone().unwrap() {
|
PartitionTableType::Guid => 2,
|
||||||
PartitionTableType::Guid => 2,
|
PartitionTableType::Legacy => 1,
|
||||||
PartitionTableType::Legacy => 1,
|
});
|
||||||
});
|
|
||||||
info!("PostClone // Disk: {disk:?}");
|
info!("PostClone // Disk: {disk:?}");
|
||||||
info!("\t\tBoot letter: {letter_boot}");
|
info!("\t\tBoot letter: {letter_boot}");
|
||||||
info!("\t\tOS letter: {letter_os}");
|
info!("\t\tOS letter: {letter_os}");
|
||||||
|
|
@ -541,9 +559,11 @@ impl App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mode::SelectWinSource => {
|
Mode::SelectWinSource => {
|
||||||
|
info!("Set WIM file to: {one:?}");
|
||||||
self.state.wim_file_index = one;
|
self.state.wim_file_index = one;
|
||||||
}
|
}
|
||||||
Mode::SelectWinImage => {
|
Mode::SelectWinImage => {
|
||||||
|
info!("Set WIM index to: {one:?}");
|
||||||
self.state.wim_image_index = one;
|
self.state.wim_image_index = one;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
@ -711,7 +731,7 @@ fn build_left_items(app: &App) -> Action {
|
||||||
Mode::SelectDisks => {
|
Mode::SelectDisks => {
|
||||||
select_type = SelectionType::One;
|
select_type = SelectionType::One;
|
||||||
title = String::from("Select Destination Disk");
|
title = String::from("Select Destination Disk");
|
||||||
let disk_list = app.state.disk_list.lock().unwrap();
|
let disk_list = app.state.disk_list.lock().expect("Failed to get disk list");
|
||||||
disk_list
|
disk_list
|
||||||
.iter()
|
.iter()
|
||||||
.for_each(|disk| items.push(disk.description.to_string()));
|
.for_each(|disk| items.push(disk.description.to_string()));
|
||||||
|
|
@ -790,14 +810,19 @@ fn build_right_items(app: &App) -> Action {
|
||||||
} else {
|
} else {
|
||||||
labels.push(vec![dest_dv_line]);
|
labels.push(vec![dest_dv_line]);
|
||||||
}
|
}
|
||||||
let disk_list = app.state.disk_list.lock().unwrap();
|
let disk_list = app.state.disk_list.lock().expect("Failed to get disk list");
|
||||||
disk_list
|
disk_list
|
||||||
.iter()
|
.iter()
|
||||||
.for_each(|disk| items.push(get_disk_description_right(disk, &None)));
|
.for_each(|disk| items.push(get_disk_description_right(disk, &None)));
|
||||||
}
|
}
|
||||||
Mode::SelectWinSource => {
|
Mode::SelectWinSource => {
|
||||||
// Disk Info
|
// Disk Info
|
||||||
let type_str = match app.state.table_type.clone().unwrap() {
|
let type_str = match app
|
||||||
|
.state
|
||||||
|
.table_type
|
||||||
|
.clone()
|
||||||
|
.expect("Failed to get table type")
|
||||||
|
{
|
||||||
PartitionTableType::Guid => "GPT",
|
PartitionTableType::Guid => "GPT",
|
||||||
PartitionTableType::Legacy => "MBR",
|
PartitionTableType::Legacy => "MBR",
|
||||||
};
|
};
|
||||||
|
|
@ -815,11 +840,8 @@ fn build_right_items(app: &App) -> Action {
|
||||||
},
|
},
|
||||||
DVLine::blank(),
|
DVLine::blank(),
|
||||||
];
|
];
|
||||||
let disk_list = app.state.disk_list.lock().unwrap();
|
if let Some(disk) = app.state.get_dest_disk() {
|
||||||
if let Some(index) = app.state.disk_index_dest
|
get_disk_description_right(&disk, &None)
|
||||||
&& let Some(disk) = disk_list.get(index)
|
|
||||||
{
|
|
||||||
get_disk_description_right(disk, &None)
|
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.for_each(|dv_line| label_dv_lines.push(dv_line));
|
.for_each(|dv_line| label_dv_lines.push(dv_line));
|
||||||
}
|
}
|
||||||
|
|
@ -870,7 +892,12 @@ fn build_right_items(app: &App) -> Action {
|
||||||
panic!("Failed to get source WIM file");
|
panic!("Failed to get source WIM file");
|
||||||
}
|
}
|
||||||
// Disk Info
|
// Disk Info
|
||||||
let type_str = match app.state.table_type.clone().unwrap() {
|
let type_str = match app
|
||||||
|
.state
|
||||||
|
.table_type
|
||||||
|
.clone()
|
||||||
|
.expect("Failed to get table type")
|
||||||
|
{
|
||||||
PartitionTableType::Guid => "GPT",
|
PartitionTableType::Guid => "GPT",
|
||||||
PartitionTableType::Legacy => "MBR",
|
PartitionTableType::Legacy => "MBR",
|
||||||
};
|
};
|
||||||
|
|
@ -888,11 +915,8 @@ fn build_right_items(app: &App) -> Action {
|
||||||
},
|
},
|
||||||
DVLine::blank(),
|
DVLine::blank(),
|
||||||
];
|
];
|
||||||
let disk_list = app.state.disk_list.lock().unwrap();
|
if let Some(disk) = app.state.get_dest_disk() {
|
||||||
if let Some(index) = app.state.disk_index_dest
|
get_disk_description_right(&disk, &None)
|
||||||
&& let Some(disk) = disk_list.get(index)
|
|
||||||
{
|
|
||||||
get_disk_description_right(disk, &None)
|
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.for_each(|dv_line| label_dv_lines.push(dv_line));
|
.for_each(|dv_line| label_dv_lines.push(dv_line));
|
||||||
}
|
}
|
||||||
|
|
@ -976,11 +1000,8 @@ fn build_right_items(app: &App) -> Action {
|
||||||
} else {
|
} else {
|
||||||
labels.push(vec![dest_dv_line]);
|
labels.push(vec![dest_dv_line]);
|
||||||
}
|
}
|
||||||
let disk_list = app.state.disk_list.lock().unwrap();
|
if let Some(disk) = app.state.get_dest_disk() {
|
||||||
if let Some(index) = app.state.disk_index_dest
|
items.push(get_disk_description_right(&disk, &None));
|
||||||
&& let Some(disk) = disk_list.get(index)
|
|
||||||
{
|
|
||||||
items.push(get_disk_description_right(disk, &None));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,17 @@ impl State {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_dest_disk(&self) -> Option<Disk> {
|
||||||
|
let mut dest_disk: Option<Disk> = None;
|
||||||
|
if let Ok(disk_list) = self.disk_list.lock()
|
||||||
|
&& let Some(disk_index) = self.disk_index_dest
|
||||||
|
&& let Some(disk) = disk_list.get(disk_index)
|
||||||
|
{
|
||||||
|
dest_disk = Some(disk.clone());
|
||||||
|
}
|
||||||
|
dest_disk
|
||||||
|
}
|
||||||
|
|
||||||
pub fn reset_all(&mut self) {
|
pub fn reset_all(&mut self) {
|
||||||
self.wim_file_index = None;
|
self.wim_file_index = None;
|
||||||
self.wim_image_index = None;
|
self.wim_image_index = None;
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ use std::{
|
||||||
|
|
||||||
use tempfile::NamedTempFile;
|
use tempfile::NamedTempFile;
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
|
use tracing::info;
|
||||||
use xml::reader::{EventReader, XmlEvent};
|
use xml::reader::{EventReader, XmlEvent};
|
||||||
|
|
||||||
use core::system::disk::bytes_to_string;
|
use core::system::disk::bytes_to_string;
|
||||||
|
|
@ -187,10 +188,17 @@ impl WimSources {
|
||||||
rel_index = index - num_local;
|
rel_index = index - num_local;
|
||||||
use_local = false;
|
use_local = false;
|
||||||
};
|
};
|
||||||
|
info!("Converted Index: {index} -> {rel_index}");
|
||||||
if use_local {
|
if use_local {
|
||||||
self.local.get(rel_index).unwrap().clone()
|
self.local
|
||||||
|
.get(rel_index)
|
||||||
|
.expect("Failed to get local file by rel_index")
|
||||||
|
.to_owned()
|
||||||
} else {
|
} else {
|
||||||
self.network.get(rel_index).unwrap().clone()
|
self.network
|
||||||
|
.get(rel_index)
|
||||||
|
.expect("Failed to get network file by rel_index")
|
||||||
|
.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue