updated sha256sum.list

This commit is contained in:
Mikhail Tergoev
2025-09-01 12:06:10 +03:00
5 changed files with 1232 additions and 143 deletions

View File

@@ -811,10 +811,20 @@ init_wine_ver () {
export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE"
if [[ ! -d "$WINEDIR" ]] ; then
local wine_package="$WH_TMP_DIR/$WH_WINE_USE.tar.xz"
try_download "$CLOUD_URL/$WH_WINE_USE.tar.xz" "$wine_package" check256sum
local download_url wine_package
download_url="$CLOUD_URL/$WH_WINE_USE.tar.xz"
wine_package="$WH_TMP_DIR/$WH_WINE_USE.tar.xz"
try_download "$download_url" "$wine_package" "check256sum"
unpack "$wine_package" "$WH_DIST_DIR/"
try_remove_file "$wine_package"
# Управление структурой подкаталога Proton "files", перемещая содержимое вверх
if [[ -d "$WINEDIR/files" ]]; then
print_info "Обнаружена структура каталогов Proton, исправляем пути..."
mv "$WINEDIR"/files/* "$WINEDIR/"
rmdir "$WINEDIR/files"
fi
fi
[[ ! -f "$WINEDIR/version" ]] && echo "$WH_WINE_USE" > "$WINEDIR/version"
@@ -1465,6 +1475,238 @@ remove_prefix() {
fi
}
select_wine_version() {
local sha256_file="$DATA_PATH/sha256sum.list"
[[ ! -f "$sha256_file" ]] && fatal "Файл с версиями WINE/Proton не найден: $sha256_file"
if [[ "$WINEARCH" == "win64" ]]; then
print_info "Фильтруем версии для 64-битного префикса..."
else # win32
print_info "Фильтруем версии для 32-битного префикса..."
fi
local options=()
local total_versions_found=0
# --- System ---
local system_wine_display_name="system"
if command -v wine &>/dev/null; then
local system_wine_version
system_wine_version=$(wine --version 2>/dev/null)
[[ -n "$system_wine_version" ]] && system_wine_display_name="$system_wine_version"
fi
options+=("--- System ---")
options+=("$system_wine_display_name")
# --- Other versions from sha256sum.list ---
local current_group=""
local group_versions=()
flush_group() {
if [[ ${#group_versions[@]} -gt 0 ]]; then
IFS=$'\n' sorted_versions=($(sort -Vr <<<"${group_versions[*]}"))
unset IFS
options+=("${sorted_versions[@]}")
((total_versions_found+=${#group_versions[@]}))
group_versions=()
fi
}
while IFS= read -r line; do
if [[ "$line" =~ ^#+[[:space:]]([^#[:space:]]+)[[:space:]]#* ]]; then
flush_group
current_group="${BASH_REMATCH[1]}"
# Отображаем только группы, которые являются сборками WINE или PROTON
case "$current_group" in
WINE|WINE_LG|PROTON_LG|PROTON_STEAM)
local pretty_key=$(echo "$current_group" | tr '_' ' ' | sed -e "s/\b\(.\)/\u\1/g")
options+=("--- $pretty_key ---")
;;
*)
current_group=""
;;
esac
elif [[ -n "$current_group" ]] && [[ "$line" =~ [a-f0-9]{64} ]]; then
local filename=$(echo "$line" | awk '{print $2}')
local version_name=${filename%.tar.xz}
if [[ "$WINEARCH" == "win64" ]]; then
if [[ "$version_name" =~ (amd64|x86_64|wow64) ]] || ! [[ "$version_name" =~ i[3-6]86 ]]; then
group_versions+=("$version_name")
fi
else # win32
if [[ "$version_name" =~ i[3-6]86 ]]; then
group_versions+=("$version_name")
fi
fi
fi
done < "$sha256_file"
flush_group
if [[ $total_versions_found -eq 0 ]]; then
print_warning "Не найдено подходящих версий WINE/Proton для архитектуры $WINEARCH."
print_warning "Будет использована версия по умолчанию: $WH_WINE_USE"
return
fi
local selectable_options=("Отмена")
local display_groups=()
local current_group_items=()
local choice_idx=0
flush_current_group() {
if ((${#current_group_items[@]} > 0)); then
# Объединяйте элементы с помощью уникального разделителя для последующего разделения
display_groups+=("$(IFS='@@@'; echo "${current_group_items[*]}")")
current_group_items=()
fi
}
current_group_items+=(" 0) Отмена создания префикса")
for opt in "${options[@]}"; do
if [[ "$opt" == "---"* ]]; then
flush_current_group
display_groups+=("$opt")
else
((choice_idx++))
current_group_items+=(" ${choice_idx}) $opt")
selectable_options+=("$opt")
fi
done
flush_current_group # Очистка последней группы
print_info "Выберите версию WINE/Proton для $WINEARCH префикса:"
local first_block=true
for group_data in "${display_groups[@]}"; do
if [[ "$group_data" == "---"* ]]; then
if [[ "$first_block" = false ]]; then
echo
fi
echo "$group_data"
else
local items_to_print=()
IFS='@@@' read -r -a items_to_print <<< "$group_data"
local num_items=${#items_to_print[@]}
local term_width=${COLUMNS:-80}
local max_len=0
for item in "${items_to_print[@]}"; do
(( ${#item} > max_len )) && max_len=${#item}
done
((max_len+=2))
local num_cols=$(( term_width / max_len ))
(( num_cols = num_cols > 0 ? num_cols : 1 ))
local num_rows=$(( (num_items + num_cols - 1) / num_cols ))
for ((i=0; i<num_rows; i++)); do
for ((j=0; j<num_cols; j++)); do
local index=$(( i + j * num_rows ))
(( index < num_items )) && printf "%-*s" "$max_len" "${items_to_print[index]}"
done
echo
done
fi
first_block=false
done
while true; do
echo
local max_choice=$(( ${#selectable_options[@]} - 1 ))
read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice
if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then
if [[ "$user_choice" == "0" ]]; then
print_info "Создание префикса отменено."
exit 0
fi
local selected_opt
selected_opt="${selectable_options[$user_choice]}"
if [[ "$selected_opt" == "$system_wine_display_name" ]]; then
export WH_WINE_USE="system"
else
export WH_WINE_USE="$selected_opt"
fi
break
else
print_error "Неверный выбор. Введите число от 0 до $max_choice."
fi
done
}
create_prefix() {
print_info "Существующие префиксы:"
local prefixes=()
for prefix in "$WH_PREFIXES_DIR"/*; do
if [[ -d "$prefix" ]] ; then
prefixes+=("$(basename "$prefix")")
echo " - $(basename "$prefix")"
fi
done
if [[ ${#prefixes[@]} -eq 0 ]]; then
print_info "Нет существующих префиксов."
fi
echo
read -p "Введите имя для нового префикса или 0 для отмены (по умолчанию: default): " prefix_name
if [[ "$prefix_name" == "0" ]] ; then
print_info "Создание префикса отменено."
exit 0
fi
prefix_name=${prefix_name:-default}
if [[ ! "$prefix_name" =~ ^[a-zA-Z0-9_.-]+$ ]] ; then
fatal "Имя префикса может содержать только латинские буквы, цифры, точки, дефисы и подчеркивания"
fi
if [[ -d "$WH_PREFIXES_DIR/$prefix_name" ]] ; then
fatal "Префикс с именем '$prefix_name' уже существует. Создание отменено."
fi
print_info "Создается префикс с именем: \"$prefix_name\""
print_info "Выберите разрядность префикса:"
echo " 0) Отмена создания префикса"
echo " 1) 32-bit"
echo " 2) 64-bit"
echo
local arch_choice
read -p "Ваш выбор [0-2] (по умолчанию 1): " arch_choice
case "${arch_choice:-1}" in
0) print_info "Создание префикса отменено." ; exit 0 ;;
1) export WINEARCH="win32" ;;
2) export WINEARCH="win64" ;;
*) fatal "Неверный выбор. Операция отменена." ;;
esac
select_wine_version
print_info "Выберите тип создаваемого префикса:"
echo " 0) Отмена создания префикса"
echo " 1) Чистый префикс (без библиотек)"
echo " 2) С рекомендуемыми библиотеками"
echo
local pfx_type_choice
read -p "Ваш выбор [0-2] (по умолчанию 1): " pfx_type_choice
case "${pfx_type_choice:-1}" in
0) print_info "Создание префикса отменено." ; exit 0 ;;
1) export BASE_PFX="none" ;;
2) ;; # Оставляем BASE_PFX пустым, чтобы init_wineprefix использовал значение по умолчанию
*) fatal "Неверный выбор. Операция отменена." ;;
esac
export WINEPREFIX="$WH_PREFIXES_DIR/$prefix_name"
if ! init_wine_ver || ! init_wineprefix; then
fatal "Ошибка инициализации префикса."
fi
print_ok "Префикс '$prefix_name' (${WINEARCH}) успешно создан."
}
remove_winehelper () {
local answer
if [[ $1 =~ --force|-y ]] ; then
@@ -1748,6 +1990,7 @@ wh_info () {
installed список установленных программ
run [программа] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
create-prefix создать префикс
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резервную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
@@ -1796,8 +2039,10 @@ case "$arg1" in
backup-prefix) backup_prefix "$@" ;;
restore-prefix) restore_prefix "$@" ;;
remove-all) remove_winehelper "$@" ;;
create-prefix) create_prefix "$@" ;;
remove-prefix) remove_prefix "$@" ;;
create-base-pfx) create_base_pfx "$@" ;;
init-prefix) prepair_wine ; wait_wineserver ;;
*)
if [[ -f "$arg1" ]] ; then
WIN_FILE_EXEC="$(readlink -f "$arg1")"