diff --git a/winehelper b/winehelper index a24c1ff..152add5 100755 --- a/winehelper +++ b/winehelper @@ -1568,12 +1568,13 @@ backup_prefix() { export WINEPREFIX="$1" check_prefix_var - local backup_base_dir="$(xdg-user-dir DESKTOP)" - local backup_archive_name="backup_${PREFIX_NAME}_$(date +%Y.%m.%d).whpack" - local backup_dest_path="$backup_base_dir/$backup_archive_name" - local temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%Y.%m.%d)" - local temp_prefix_dir="$temp_backup_dir/prefixes/$PREFIX_NAME" - local temp_users_dir="$temp_prefix_dir/drive_c/users" + local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir + backup_base_dir="$(xdg-user-dir DESKTOP)" + backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack" + backup_dest_path="$backup_base_dir/$backup_archive_name" + temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)" + temp_prefix_dir="$temp_backup_dir/prefixes/$PREFIX_NAME" + temp_users_dir="$temp_prefix_dir/drive_c/users" print_info "Начало резервного копирования префикса: $PREFIX_NAME" create_new_dir "$temp_backup_dir" @@ -1617,9 +1618,11 @@ backup_prefix() { fi fi + # Сохраняем метаданные внутри временной директории + echo "$PREFIX_NAME" > "$temp_backup_dir/prefix_name.whmeta" + print_info "Создание squashfs архива..." if mksquashfs "$temp_backup_dir" "$backup_dest_path" -comp zstd ; then - echo -e "\n# PREFIX_NAME=$PREFIX_NAME" >> "$backup_dest_path" print_ok "Архив префикса $PREFIX_NAME успешно создан по пути:\n$backup_dest_path" else print_error "Не удалось создать архив префикса $PREFIX_NAME." @@ -1651,15 +1654,7 @@ restore_prefix() { print_info "Восстановление из резервной копии: $backup_archive_path" - prefix_name="$(tail -n1 "$backup_archive_path" | sed -e 's/.*PREFIX_NAME=//')" - - if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then - fatal "Префикс $prefix_name уже существует! - Удалите его, если действительно желаете восстановить префикс заново. - Команда для удаления: $SCRIPT_NAME remove-prefix $prefix_name" - fi - - temp_extract_dir="$WH_TMP_DIR/restore_$(basename "$backup_archive_path" .whpack)" + temp_extract_dir="$WH_TMP_DIR/restore_$(basename "$backup_archive_path" .whpack)_$$" create_new_dir "$temp_extract_dir" print_info "Распаковка архива..." @@ -1670,9 +1665,32 @@ restore_prefix() { fatal "Не удалось распаковать архив." fi - if [[ -d "$temp_extract_dir/prefixes" ]] ; then - local prefix_name - prefix_name="$(ls -1 "$temp_extract_dir/prefixes")" + # Определяем имя префикса + if [[ -f "$temp_extract_dir/prefix_name.whmeta" ]]; then + prefix_name="$(cat "$temp_extract_dir/prefix_name.whmeta")" + try_remove_file "$temp_extract_dir/prefix_name.whmeta" + elif grep -q "PREFIX_NAME=" "$backup_archive_path" ; then + # Обратная совместимость со старыми бэкапами (с приписанной строкой) + prefix_name="$(tail -n1 "$backup_archive_path" | sed -e 's/.*PREFIX_NAME=//')" + elif [[ -d "$temp_extract_dir/prefixes" ]] && [[ $(find "$temp_extract_dir/prefixes" -mindepth 1 -maxdepth 1 -type d | wc -l) -eq 1 ]]; then + # Обратная совместимость со старыми бэкапами (по имени каталога) + prefix_name="$(basename "$(find "$temp_extract_dir/prefixes" -mindepth 1 -maxdepth 1 -type d)")" + else + try_remove_dir "$temp_extract_dir" + fatal "Не удалось определить имя префикса в архиве (метаданные не найдены)." + fi + + if [[ -z "$prefix_name" ]]; then + try_remove_dir "$temp_extract_dir" + fatal "Не удалось определить имя префикса в архиве." + fi + + if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then + try_remove_dir "$temp_extract_dir" + fatal "Префикс $prefix_name уже существует!\n Удалите его, если действительно желаете восстановить префикс заново.\n Команда для удаления: $SCRIPT_NAME remove-prefix $prefix_name" + fi + + if [[ -d "$temp_extract_dir/prefixes/$prefix_name" ]] ; then local prefix_dir="$temp_extract_dir/prefixes/$prefix_name" print_info "Восстановление префикса: $prefix_name" @@ -1711,7 +1729,7 @@ restore_prefix() { fi else try_remove_dir "$temp_extract_dir" - fatal "Директория prefixes не найдена в архиве." + fatal "Директория префикса '$prefix_name' не найдена в архиве." fi try_remove_dir "$temp_extract_dir"