Установка мессенджера MAX в Calculate Linux из локального репозитория

Установка мессенджера MAX в Calculate Linux:

Создание ebuild MAX с актуальной версией:

Добавление нестабильных версий пакета:

#

echo "net-im/max ~amd64" >> /etc/portage/package.accept_keywords/custom

Создание директории ebuild MAX:

#

mkdir -p /var/calculate/repos/custom/net-im/max

Скрипт создает ebuild MAX с сохранением старых версий на 30 дней:

#

tee /usr/local/bin/generate-max-ebuild.sh <<'EOF'
#!/bin/bash
set -e

REPO="/var/calculate/repos/custom/net-im/max"
mkdir -p "$REPO"

# Получаем версию и URL
PKG_INFO=$(curl -sL "https://download.max.ru/linux/deb/dists/stable/main/binary-amd64/Packages" | awk '
    /^Package: max$/ { in_max=1 }
    in_max && /^Version: / { ver=$2 }
    in_max && /^Filename: / { fn=$2; exit }
    END { if(ver && fn) print ver "|" fn }
')

if [[ -z "$PKG_INFO" ]]; then
    echo "ERROR: Failed to fetch package info"
    exit 1
fi

VERSION="${PKG_INFO%|*}"
FILENAME="${PKG_INFO#*|}"
DEB_URL="https://download.max.ru/linux/deb/${FILENAME}"

echo "Latest version: ${VERSION}"
echo "DEB URL: ${DEB_URL}"

# Удаляем только ebuild'ы старше 30 дней (сохраняем последние версии для отката)
echo "Cleaning old ebuilds (older than 30 days)..."
cd "$REPO"
find . -name "max-*.ebuild" -mtime +30 -delete 2>/dev/null || true

# Проверяем, не существует ли уже ebuild с этой версией
if [[ -f "max-${VERSION}.ebuild" ]]; then
    echo "Ebuild max-${VERSION} already exists. No update needed."
    exit 0
fi

# Создаём новый ebuild
cat > "max-${VERSION}.ebuild" <<EOEBUILD
# Copyright 2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit unpacker xdg desktop

DESCRIPTION="Russian messenger and digital platform"
HOMEPAGE="https://max.ru"
SRC_URI="${DEB_URL} -> max-\${PV}.deb"

LICENSE="MAX-EULA"
SLOT="0"
KEYWORDS="~amd64"

RESTRICT="strip mirror"

DEPEND="
	x11-libs/gtk+:3
	x11-libs/libnotify
	dev-libs/nss
	x11-libs/libXtst
	app-accessibility/at-spi2-core
	app-crypt/libsecret
	x11-libs/libXScrnSaver
	x11-misc/xdg-utils
	sys-apps/util-linux
"
RDEPEND="\${DEPEND}"
BDEPEND=""

QA_PRESTRIPPED="
	/opt/max/bin/max
	/opt/max/bin/crashpad_handler
	/opt/max/lib64/*
	/opt/max/lib/*
"

S="\${WORKDIR}"

src_unpack() {
	unpack_deb max-\${PV}.deb
}

src_install() {
	mkdir -p "\${D}"/opt/max || die "mkdir /opt/max failed"
	
	if [[ -d usr/share/max ]]; then
		pushd usr/share/max >/dev/null || die
		tar cf - . | (cd "\${D}"/opt/max && tar xf -) || die "tar copy failed"
		popd >/dev/null || die
	else
		die "usr/share/max not found in deb"
	fi
	
	fperms +x /opt/max/bin/max
	fperms +x /opt/max/bin/crashpad_handler
	
	dosym ../../opt/max/bin/max /usr/bin/max
	
	if [[ -f usr/share/applications/max.desktop ]]; then
		sed -e 's|Exec=.*|Exec=/opt/max/bin/max|' \\
		    -e 's|Icon=.*|Icon=max|' \\
		    usr/share/applications/max.desktop > "\${T}"/max.desktop || die "sed failed"
		domenu "\${T}"/max.desktop
	fi
	
	if [[ -d usr/share/icons ]]; then
		insinto /usr/share
		doins -r usr/share/icons
	fi
	
	if [[ -d usr/share/pixmaps ]]; then
		insinto /usr/share
		doins -r usr/share/pixmaps
	fi
}

pkg_postinst() {
	xdg_desktop_database_update
	xdg_icon_cache_update
}

pkg_postrm() {
	xdg_desktop_database_update
	xdg_icon_cache_update
}
EOEBUILD

# Пересоздаём Manifest
rm -f Manifest
ebuild "max-${VERSION}.ebuild" manifest

echo ""
echo "=== Done ==="
echo "Created: max-${VERSION}.ebuild"
echo ""
echo "Available versions:"
ls -1 max-*.ebuild 2>/dev/null | sed 's/max-//;s/.ebuild//' | while read v; do
    echo "  =net-im/max-${v}"
done
echo ""
echo "Install latest: emerge -av =net-im/max-${VERSION}"
echo "Or update:      emerge -u net-im/max"
EOF

chmod +x /usr/local/bin/generate-max-ebuild.sh

Создать/обновить ebuild:

#

generate-max-ebuild.sh

Установить последнюю версию:

#

emerge -av net-im/max