Compare commits
3 Commits
335ea03b05
...
97e8c3d965
| Author | SHA1 | Date | |
|---|---|---|---|
| 97e8c3d965 | |||
| 586afc2f56 | |||
| f943887b39 |
@@ -122,8 +122,9 @@ static const char* config_dirs_to_delete[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Switch directories to delete
|
// Switch directories to delete
|
||||||
// NOTE: .overlays and .packages excluded - preserve UltraHand .offload hide state during updates
|
|
||||||
static const char* switch_dirs_to_delete[] = {
|
static const char* switch_dirs_to_delete[] = {
|
||||||
|
"sd:/switch/.packages",
|
||||||
|
"sd:/switch/.overlays",
|
||||||
"sd:/switch/90DNS_tester",
|
"sd:/switch/90DNS_tester",
|
||||||
"sd:/switch/aio-switch-updater",
|
"sd:/switch/aio-switch-updater",
|
||||||
"sd:/switch/amsPLUS-downloader",
|
"sd:/switch/amsPLUS-downloader",
|
||||||
|
|||||||
163
source/install.c
163
source/install.c
@@ -275,167 +275,6 @@ int folder_copy_with_progress_v2(const char *src, const char *dst, const char *d
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy one directory (e.g. .overlays or .packages) with .offload awareness: if the same
|
|
||||||
// name exists in dst_offload, copy pack's version into dst_offload (update in place);
|
|
||||||
// otherwise copy to dst_parent. Used only for update mode to preserve UltraHand hide state.
|
|
||||||
static int copy_dir_offload_aware(const char *src_parent, const char *dst_parent, const char *dst_offload,
|
|
||||||
const char *display_name, int *copied, int total, u32 start_x, u32 start_y, int *last_percent)
|
|
||||||
{
|
|
||||||
DIR dir;
|
|
||||||
FILINFO fno;
|
|
||||||
int res;
|
|
||||||
char src_full[256];
|
|
||||||
char dst_main[256];
|
|
||||||
char dst_off[256];
|
|
||||||
|
|
||||||
res = f_opendir(&dir, src_parent);
|
|
||||||
if (res != FR_OK)
|
|
||||||
return res;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
res = f_readdir(&dir, &fno);
|
|
||||||
if (res != FR_OK || fno.fname[0] == 0) break;
|
|
||||||
if (fno.fname[0] == '.' && (fno.fname[1] == '\0' || (fno.fname[1] == '.' && fno.fname[2] == '\0')))
|
|
||||||
continue;
|
|
||||||
if (strcmp(fno.fname, ".offload") == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
install_combine_path(src_full, sizeof(src_full), src_parent, fno.fname);
|
|
||||||
install_combine_path(dst_off, sizeof(dst_off), dst_offload, fno.fname);
|
|
||||||
|
|
||||||
if (install_path_exists(dst_off)) {
|
|
||||||
res = (fno.fattrib & AM_DIR) ? folder_copy(src_full, dst_offload) : file_copy(src_full, dst_off);
|
|
||||||
} else {
|
|
||||||
install_combine_path(dst_main, sizeof(dst_main), dst_parent, fno.fname);
|
|
||||||
res = (fno.fattrib & AM_DIR) ? folder_copy(src_full, dst_parent) : file_copy(src_full, dst_main);
|
|
||||||
}
|
|
||||||
(*copied)++;
|
|
||||||
if (total > 0) {
|
|
||||||
int percent = (*copied * 100) / total;
|
|
||||||
if (percent != *last_percent || *copied % 20 == 0) {
|
|
||||||
gfx_con_setpos(start_x, start_y);
|
|
||||||
install_set_color(COLOR_CYAN);
|
|
||||||
gfx_printf(" Kopiere: %s [%3d%%] (%d/%d)", display_name, percent, *copied, total);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
*last_percent = percent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (res != FR_OK) {
|
|
||||||
f_closedir(&dir);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f_closedir(&dir);
|
|
||||||
return FR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy switch/ folder for update mode only: preserve SD's .overlays/.offload and
|
|
||||||
// .packages/.offload; for items that exist there, update in place instead of main area.
|
|
||||||
int folder_copy_switch_update_offload_aware(const char *src_switch, const char *dst_base, const char *display_name) {
|
|
||||||
char dst_switch[256];
|
|
||||||
char src_overlays[256], src_packages[256];
|
|
||||||
char dst_overlays[256], dst_offload_ovl[256], dst_packages[256], dst_offload_pkg[256];
|
|
||||||
DIR dir;
|
|
||||||
FILINFO fno;
|
|
||||||
int res;
|
|
||||||
int copied = 0;
|
|
||||||
int total;
|
|
||||||
int last_percent = -1;
|
|
||||||
u32 start_x, start_y;
|
|
||||||
|
|
||||||
install_combine_path(dst_switch, sizeof(dst_switch), dst_base, "switch");
|
|
||||||
|
|
||||||
if (!install_path_exists(src_switch)) {
|
|
||||||
install_set_color(COLOR_ORANGE);
|
|
||||||
gfx_printf(" Ueberspringe: %s (nicht gefunden)\n", display_name);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
return FR_NO_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
total = install_count_directory_items(src_switch);
|
|
||||||
if (total == 0) {
|
|
||||||
f_mkdir(dst_switch);
|
|
||||||
return FR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx_con_getpos(&start_x, &start_y);
|
|
||||||
install_set_color(COLOR_CYAN);
|
|
||||||
gfx_printf(" Kopiere: %s [ 0%%] (0/%d)", display_name, total);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
|
|
||||||
res = f_mkdir(dst_switch);
|
|
||||||
if (res != FR_OK && res != FR_EXIST) return res;
|
|
||||||
|
|
||||||
res = f_opendir(&dir, src_switch);
|
|
||||||
if (res != FR_OK) return res;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
res = f_readdir(&dir, &fno);
|
|
||||||
if (res != FR_OK || fno.fname[0] == 0) break;
|
|
||||||
if (fno.fname[0] == '.' && (fno.fname[1] == '\0' || (fno.fname[1] == '.' && fno.fname[2] == '\0')))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (strcmp(fno.fname, ".overlays") == 0) {
|
|
||||||
install_combine_path(src_overlays, sizeof(src_overlays), src_switch, ".overlays");
|
|
||||||
install_combine_path(dst_overlays, sizeof(dst_overlays), dst_switch, ".overlays");
|
|
||||||
install_combine_path(dst_offload_ovl, sizeof(dst_offload_ovl), dst_overlays, ".offload");
|
|
||||||
if (!install_path_exists(src_overlays)) { f_closedir(&dir); continue; }
|
|
||||||
f_mkdir(dst_overlays);
|
|
||||||
f_mkdir(dst_offload_ovl);
|
|
||||||
res = copy_dir_offload_aware(src_overlays, dst_overlays, dst_offload_ovl, display_name,
|
|
||||||
&copied, total, start_x, start_y, &last_percent);
|
|
||||||
} else if (strcmp(fno.fname, ".packages") == 0) {
|
|
||||||
install_combine_path(src_packages, sizeof(src_packages), src_switch, ".packages");
|
|
||||||
install_combine_path(dst_packages, sizeof(dst_packages), dst_switch, ".packages");
|
|
||||||
install_combine_path(dst_offload_pkg, sizeof(dst_offload_pkg), dst_packages, ".offload");
|
|
||||||
if (!install_path_exists(src_packages)) { f_closedir(&dir); continue; }
|
|
||||||
f_mkdir(dst_packages);
|
|
||||||
f_mkdir(dst_offload_pkg);
|
|
||||||
{ /* package.ini into main area */
|
|
||||||
char src_ini[256], dst_ini[256];
|
|
||||||
s_printf(src_ini, "%s/package.ini", src_packages);
|
|
||||||
s_printf(dst_ini, "%s/package.ini", dst_packages);
|
|
||||||
if (install_path_exists(src_ini)) {
|
|
||||||
res = file_copy(src_ini, dst_ini);
|
|
||||||
if (res == FR_OK) copied++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
res = copy_dir_offload_aware(src_packages, dst_packages, dst_offload_pkg, display_name,
|
|
||||||
&copied, total, start_x, start_y, &last_percent);
|
|
||||||
} else {
|
|
||||||
char src_full[256], dst_full[256];
|
|
||||||
install_combine_path(src_full, sizeof(src_full), src_switch, fno.fname);
|
|
||||||
install_combine_path(dst_full, sizeof(dst_full), dst_switch, fno.fname);
|
|
||||||
if (fno.fattrib & AM_DIR)
|
|
||||||
res = folder_copy(src_full, dst_switch);
|
|
||||||
else
|
|
||||||
res = file_copy(src_full, dst_full);
|
|
||||||
copied++;
|
|
||||||
}
|
|
||||||
if (res != FR_OK) break;
|
|
||||||
if (total > 0 && (copied % 20 == 0 || copied == total)) {
|
|
||||||
int percent = (copied * 100) / total;
|
|
||||||
gfx_con_setpos(start_x, start_y);
|
|
||||||
install_set_color(COLOR_CYAN);
|
|
||||||
gfx_printf(" Kopiere: %s [%3d%%] (%d/%d)", display_name, percent, copied, total);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f_closedir(&dir);
|
|
||||||
|
|
||||||
gfx_con_setpos(start_x, start_y);
|
|
||||||
if (res == FR_OK) {
|
|
||||||
install_set_color(COLOR_GREEN);
|
|
||||||
gfx_printf(" Kopiere: %s [100%%] (%d/%d) - Fertig!\n", display_name, copied, total);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
} else {
|
|
||||||
install_set_color(COLOR_RED);
|
|
||||||
gfx_printf(" Kopiere: %s - Fehlgeschlagen!\n", display_name);
|
|
||||||
install_set_color(COLOR_WHITE);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recursive folder delete with progress tracking (shared implementation)
|
// Recursive folder delete with progress tracking (shared implementation)
|
||||||
int folder_delete_progress_recursive(const char *path, int *deleted, int total, u32 start_x, u32 start_y, const char *display_name, int *last_percent) {
|
int folder_delete_progress_recursive(const char *path, int *deleted, int total, u32 start_x, u32 start_y, const char *display_name, int *last_percent) {
|
||||||
DIR dir;
|
DIR dir;
|
||||||
@@ -764,7 +603,7 @@ int perform_installation(omninx_variant_t pack_variant, install_mode_t mode) {
|
|||||||
install_set_color(COLOR_YELLOW);
|
install_set_color(COLOR_YELLOW);
|
||||||
gfx_printf("Schritt 2: Dateien kopieren...\n");
|
gfx_printf("Schritt 2: Dateien kopieren...\n");
|
||||||
install_set_color(COLOR_WHITE);
|
install_set_color(COLOR_WHITE);
|
||||||
res = update_mode_install(pack_variant, true);
|
res = update_mode_install(pack_variant);
|
||||||
if (res != FR_OK) return res;
|
if (res != FR_OK) return res;
|
||||||
|
|
||||||
install_check_and_clear_screen_if_needed();
|
install_check_and_clear_screen_if_needed();
|
||||||
|
|||||||
@@ -18,8 +18,7 @@ int perform_installation(omninx_variant_t pack_variant, install_mode_t mode);
|
|||||||
|
|
||||||
// Update mode operations (install_update.c)
|
// Update mode operations (install_update.c)
|
||||||
int update_mode_cleanup(omninx_variant_t variant);
|
int update_mode_cleanup(omninx_variant_t variant);
|
||||||
/* offload_aware_switch: true = update (preserve .offload), false = clean (normal copy) */
|
int update_mode_install(omninx_variant_t variant);
|
||||||
int update_mode_install(omninx_variant_t variant, bool offload_aware_switch);
|
|
||||||
int cleanup_staging_directory(omninx_variant_t pack_variant);
|
int cleanup_staging_directory(omninx_variant_t pack_variant);
|
||||||
// Remove other OmniNX staging directories (Standard/Light/OC) that exist, except the one just installed
|
// Remove other OmniNX staging directories (Standard/Light/OC) that exist, except the one just installed
|
||||||
int cleanup_other_staging_directories(omninx_variant_t installed_variant);
|
int cleanup_other_staging_directories(omninx_variant_t installed_variant);
|
||||||
@@ -41,5 +40,3 @@ int delete_path_lists_grouped(const char *folder_display_name, ...);
|
|||||||
int folder_delete_single_with_progress(const char *path, const char *display_name);
|
int folder_delete_single_with_progress(const char *path, const char *display_name);
|
||||||
int folder_delete_progress_recursive(const char *path, int *deleted, int total, u32 start_x, u32 start_y, const char *display_name, int *last_percent);
|
int folder_delete_progress_recursive(const char *path, int *deleted, int total, u32 start_x, u32 start_y, const char *display_name, int *last_percent);
|
||||||
int folder_copy_with_progress_v2(const char *src, const char *dst, const char *display_name);
|
int folder_copy_with_progress_v2(const char *src, const char *dst, const char *display_name);
|
||||||
// Update-only: copy switch/ preserving .overlays/.offload and .packages/.offload (UltraHand hide state)
|
|
||||||
int folder_copy_switch_update_offload_aware(const char *src_switch, const char *dst_base, const char *display_name);
|
|
||||||
|
|||||||
@@ -107,9 +107,9 @@ int clean_mode_restore(void) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean mode: Install files (reuse update copy logic, but normal switch copy – no .offload preservation)
|
// Clean mode: Install files (reuse update mode install)
|
||||||
int clean_mode_install(omninx_variant_t variant) {
|
int clean_mode_install(omninx_variant_t variant) {
|
||||||
return update_mode_install(variant, false);
|
return update_mode_install(variant);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove other staging directories (OmniNX Standard/Light/OC) that exist on SD
|
// Remove other staging directories (OmniNX Standard/Light/OC) that exist on SD
|
||||||
|
|||||||
@@ -73,9 +73,8 @@ int update_mode_cleanup(omninx_variant_t variant) {
|
|||||||
return FR_OK;
|
return FR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update/Clean mode: Copy files from staging.
|
// Update mode: Copy files from staging
|
||||||
// offload_aware_switch: true = update (preserve .overlays/.offload, .packages/.offload); false = clean (normal copy).
|
int update_mode_install(omninx_variant_t variant) {
|
||||||
int update_mode_install(omninx_variant_t variant, bool offload_aware_switch) {
|
|
||||||
int res;
|
int res;
|
||||||
const char* staging = get_staging_path(variant);
|
const char* staging = get_staging_path(variant);
|
||||||
char src_path[256];
|
char src_path[256];
|
||||||
@@ -104,10 +103,7 @@ int update_mode_install(omninx_variant_t variant, bool offload_aware_switch) {
|
|||||||
if (res != FR_OK && res != FR_NO_FILE) return res;
|
if (res != FR_OK && res != FR_NO_FILE) return res;
|
||||||
|
|
||||||
s_printf(src_path, "%s/switch", staging);
|
s_printf(src_path, "%s/switch", staging);
|
||||||
if (offload_aware_switch)
|
res = folder_copy_with_progress_v2(src_path, "sd:/", "switch/");
|
||||||
res = folder_copy_switch_update_offload_aware(src_path, "sd:/", "switch/");
|
|
||||||
else
|
|
||||||
res = folder_copy_with_progress_v2(src_path, "sd:/", "switch/");
|
|
||||||
if (res != FR_OK && res != FR_NO_FILE) return res;
|
if (res != FR_OK && res != FR_NO_FILE) return res;
|
||||||
|
|
||||||
s_printf(src_path, "%s/warmboot_mariko", staging);
|
s_printf(src_path, "%s/warmboot_mariko", staging);
|
||||||
|
|||||||
Reference in New Issue
Block a user