Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b6241e2
epm play: add claude.ai
vitlav Dec 16, 2025
5e263bb
add test_list_app.sh
vitlav Dec 16, 2025
3afd021
add tests ALTLinuxc9f2/etc/os-release
vitlav Dec 16, 2025
9d18fd7
tests: add test_startwith.sh test_status.sh
vitlav Dec 16, 2025
8d7bb85
epm play: add ocenaudio (eterbug #18748)
VanoMajukin Dec 16, 2025
5e61306
epm play: rename claude.ai -> claude
vitlav Dec 16, 2025
c4e4a50
epm play: add claude-desktop
vitlav Dec 17, 2025
be60dd0
epm packages: improve help
vitlav Dec 17, 2025
79be8bc
epm play wps-office: improve conflicts
vitlav Dec 17, 2025
ee8dcfa
add CLAUDE.md documentation for Claude Code
vitlav Dec 17, 2025
671bc31
get_json_value: fix error code propagation on download failure
vitlav Dec 17, 2025
80708a7
eget: fix double downloading on error
vitlav Dec 17, 2025
5ed61f1
epm play.d/common.sh: make info() print to stderr
vitlav Dec 17, 2025
a726e5e
epm play.d/common.sh: add fetch_url() helper
vitlav Dec 17, 2025
5db5aa0
epm play claude: get GCS_BUCKET dynamically, fix typos
vitlav Dec 17, 2025
7107a30
epm play.d/common.sh: add --quiet support to epm() wrapper
vitlav Dec 17, 2025
53e416e
epm play: fetch_url() always outputs to stdout
vitlav Dec 17, 2025
881ad0f
epm tool json --get-json-value: add helper to fetch JSON value from URL
vitlav Dec 18, 2025
4a8d652
epm play sunshine: use API instead of HTML page (fix Anubis block)
vitlav Dec 18, 2025
02644e3
tests: add fetch_url error handling test
vitlav Dec 18, 2025
2a97dca
epm-sh-functions: implement fetch_url() and use it
vitlav Dec 18, 2025
634385b
implement parse_json_value/values and change get_json_value/values() …
vitlav Dec 18, 2025
ba955be
get_json_value: use epm tool json --get-json-value
vitlav Dec 18, 2025
b7f022e
epm tool json: add --help
vitlav Dec 18, 2025
b8f9a6a
epm play: fix viber
vitlav Dec 18, 2025
cdd387e
epm play: add virtualbox-bin (install VirtualBox from official .run)
vitlav Dec 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

EEPM (Etersoft EPM) is a universal package manager wrapper that provides a unified interface across all Linux distributions. It wraps native package managers (apt, yum, dnf, zypper, pacman, etc.) with consistent commands.

Main commands:
- `epm` - package management (install, remove, search, etc.)
- `serv` - service management wrapper (systemd, sysvinit)
- `distr_info` - distribution detection utility

## Development Setup

No build step required - this is a shell script project. Run directly from checkout:
```bash
./bin/epm --help
./bin/epm play --list
```

## Testing

Run individual test scripts from the `tests/` directory:
```bash
./tests/test_distr_info.sh
./tests/test_versions.sh
./tests/test_json.sh
```

Code quality checks:
```bash
./check_code.sh # Run shellcheck and checkbashisms on all scripts
./check_code.sh bin/epm-install # Check specific file
```

## Architecture

### Core Scripts (`bin/`)

- `epm` - main entry point, loads helpers via `load_helper` function
- `epm-sh-functions` - shared shell functions (output, colors, tty detection)
- `epm-*` - command implementations (epm-install, epm-remove, epm-search, etc.)
- `serv` - service management entry point
- `serv-*` - service command implementations
- `distr_info` - standalone distribution detection script
- `tools_*` - internal utility scripts

The `epm` script uses dynamic helper loading:
```bash
load_helper epm-sh-functions # Load shared functions
load_helper epm-install # Load specific command
```

### Play Scripts (`play.d/`)

Scripts for installing applications from official sources (not repositories). Each script:
- Sources `common.sh` for shared functionality
- Defines: `PKGNAME`, `DESCRIPTION`, `VERSION`, `URL`, `SUPPORTEDARCHES`
- Handles `--description`, `--package-name`, `--installed`, `--remove`, `--info`, `--update`, `--run`
- Downloads and installs packages using `epm` commands

Example structure:
```bash
BASEPKGNAME=AppName
SUPPORTEDARCHES="x86_64"
DESCRIPTION="App description"
. $(dirname $0)/common.sh
# Download and install logic
```

### Repack Scripts (`repack.d/`)

Scripts for converting packages between formats (rpm↔deb) with distro-specific fixes.

### Pack Scripts (`pack.d/`)

Scripts for creating packages from tarballs/binaries. Work in temp directory, return tarball via `return_tar`.

### Prescription Scripts (`prescription.d/`)

Meta-package recipes that install groups of related packages.

## Key Functions in common.sh

- `epm` - wrapper that shows commands being run
- `eget` - wget-like download utility (`epm tool eget`)
- `get_github_url` / `get_github_tag` - GitHub release helpers
- `install_pkgurl` / `install_pack_pkgurl` - package installation
- `is_glibc_enough` / `is_stdcpp_enough` - version requirement checks
- `fatal` / `info` - output helpers

## Adding New Play Scripts

1. Create `play.d/appname.sh`
2. Define required variables (PKGNAME, DESCRIPTION, SUPPORTEDARCHES)
3. Source `common.sh`
4. Implement download/version detection logic
5. Call `install_pkgurl` or `install_pack_pkgurl`

## Shell Compatibility

All scripts must be POSIX-compatible (avoid bashisms). Use `#!/bin/sh` for most scripts. The `check_code.sh` script verifies this with `checkbashisms`.
103 changes: 103 additions & 0 deletions CLAUDE.ru.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# CLAUDE.ru.md

Этот файл содержит руководство для Claude Code (claude.ai/code) при работе с кодом в этом репозитории.

## Обзор проекта

EEPM (Etersoft EPM) — универсальная обёртка над пакетными менеджерами, предоставляющая единый интерфейс для всех дистрибутивов Linux. Оборачивает нативные пакетные менеджеры (apt, yum, dnf, zypper, pacman и др.) едиными командами.

Основные команды:
- `epm` — управление пакетами (установка, удаление, поиск и т.д.)
- `serv` — обёртка для управления сервисами (systemd, sysvinit)
- `distr_info` — утилита определения дистрибутива

## Настройка для разработки

Сборка не требуется — это проект на shell-скриптах. Запуск прямо из checkout:
```bash
./bin/epm --help
./bin/epm play --list
```

## Тестирование

Запуск отдельных тестов из каталога `tests/`:
```bash
./tests/test_distr_info.sh
./tests/test_versions.sh
./tests/test_json.sh
```

Проверка качества кода:
```bash
./check_code.sh # Запуск shellcheck и checkbashisms для всех скриптов
./check_code.sh bin/epm-install # Проверка конкретного файла
```

## Архитектура

### Основные скрипты (`bin/`)

- `epm` — главная точка входа, загружает хелперы через функцию `load_helper`
- `epm-sh-functions` — общие shell-функции (вывод, цвета, определение tty)
- `epm-*` — реализации команд (epm-install, epm-remove, epm-search и др.)
- `serv` — точка входа для управления сервисами
- `serv-*` — реализации команд сервисов
- `distr_info` — автономный скрипт определения дистрибутива
- `tools_*` — внутренние утилиты

Скрипт `epm` использует динамическую загрузку хелперов:
```bash
load_helper epm-sh-functions # Загрузка общих функций
load_helper epm-install # Загрузка конкретной команды
```

### Play-скрипты (`play.d/`)

Скрипты для установки приложений с официальных сайтов (не из репозиториев). Каждый скрипт:
- Подключает `common.sh` для общей функциональности
- Определяет: `PKGNAME`, `DESCRIPTION`, `VERSION`, `URL`, `SUPPORTEDARCHES`
- Обрабатывает: `--description`, `--package-name`, `--installed`, `--remove`, `--info`, `--update`, `--run`
- Скачивает и устанавливает пакеты через команды `epm`

Типичная структура:
```bash
BASEPKGNAME=AppName
SUPPORTEDARCHES="x86_64"
DESCRIPTION="Описание приложения"
. $(dirname $0)/common.sh
# Логика скачивания и установки
```

### Repack-скрипты (`repack.d/`)

Скрипты для конвертации пакетов между форматами (rpm↔deb) с дистрибутив-специфичными исправлениями.

### Pack-скрипты (`pack.d/`)

Скрипты для создания пакетов из архивов/бинарников. Работают во временном каталоге, возвращают архив через `return_tar`.

### Prescription-скрипты (`prescription.d/`)

Рецепты мета-пакетов для установки групп связанных пакетов.

## Ключевые функции в common.sh

- `epm` — обёртка, показывающая выполняемые команды
- `eget` — wget-подобная утилита загрузки (`epm tool eget`)
- `get_github_url` / `get_github_tag` — хелперы для релизов GitHub
- `install_pkgurl` / `install_pack_pkgurl` — установка пакетов
- `is_glibc_enough` / `is_stdcpp_enough` — проверка требований к версиям
- `fatal` / `info` — хелперы вывода

## Добавление новых play-скриптов

1. Создать `play.d/appname.sh`
2. Определить обязательные переменные (PKGNAME, DESCRIPTION, SUPPORTEDARCHES)
3. Подключить `common.sh`
4. Реализовать логику скачивания/определения версии
5. Вызвать `install_pkgurl` или `install_pack_pkgurl`

## Совместимость с shell

Все скрипты должны быть POSIX-совместимыми (избегать башизмов). Использовать `#!/bin/sh` для большинства скриптов. Скрипт `check_code.sh` проверяет это через `checkbashisms`.
11 changes: 3 additions & 8 deletions bin/epm-desktop
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,7 @@ get_value()
local de_name="$1"
local key="$2"

local json="$(get_json $de_name)"

get_json_value "$key" < "$json"
get_json $de_name | parse_json_value "$key"
}


Expand All @@ -73,9 +71,7 @@ get_values()
local de_name="$1"
local key="$2"

local json="$(get_json $de_name)"

get_json_values "$key" < "$json" | xargs
get_json $de_name | parse_json_values "$key" | xargs
}


Expand All @@ -102,8 +98,7 @@ get_repo_version()

local package=$(get_main_package "$de_name")

info "Trying get info of package $package from remote ALT DB ..."
local latest_version="$(eget --quiet --timeout 10 -O- $(__get_api_url $package) | get_json_value '["packages",0,"version"]')"
local latest_version="$(get_json_value "$(__get_api_url $package)" '["packages",0,"version"]')"

if [ -n "$latest_version" ] ; then
echo "$latest_version"
Expand Down
2 changes: 1 addition & 1 deletion bin/epm-epm_install
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ __epm_korinf_install_eepm()
# TODO: installing via task
# as now, can't install one package from task
if false && [ "$BASEDISTRNAME" = "alt" ] && [ -z "$direct" ] ; then
local task="$(docmd eget -O- https://eepm.ru/vendor/alt/task)"
local task="$(fetch_url https://eepm.ru/vendor/alt/task)"
if [ -n "$task" ] ; then
docmd epm install $task:eepm
return
Expand Down
15 changes: 10 additions & 5 deletions bin/epm-packages
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ load_helper epm-sh-warmup

__epm_packages_help()
{
message "package management list"
get_help HELPCMD $SHAREDIR/epm-packages
message "Print installed packages"
message "Options:"
get_help HELPOPTIONS $SHAREDIR/epm-packages
message '
Examples:
epm qa --short
epm packages --sort
epm packages --sort=size
epm packages --last
Expand Down Expand Up @@ -94,18 +96,21 @@ epm_packages()
local CMD

case "$1" in
-h|--help|help) # HELPCMD: help
-h|--help|help) # HELPOPTIONS: help
__epm_packages_help
return
;;
--sort=size|--sort) # HELPCMD: list package(s) by size, most
--sort=size|--sort) # HELPOPTIONS: list package(s) by size, most
__epm_packages_sort
return
;;
--last|--sort=time) # HELPCMD: list package(s) by install time, most
--last|--sort=time) # HELPOPTIONS: list package(s) by install time, most
__epm_packages_last
return
;;
--short) # HELPOPTIONS: print out short package names
# for help entry only
;;
"")
;;
*)
Expand Down
2 changes: 1 addition & 1 deletion bin/epm-play
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ __get_latest_package_version()

[ -n "$pkg" ] || return 1

ver="$(epm tool eget -q -O- "https://eepm.ru/app-versions/$pkg" 2>/dev/null)"
ver="$(fetch_url "https://eepm.ru/app-versions/$pkg")"

if [ -n "$ver" ] ; then
echo "$ver"
Expand Down
2 changes: 1 addition & 1 deletion bin/epm-provides
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ case $PMTYPE in
if is_installed $pkg_names ; then
CMD="rpm -q --provides"
else
docmd apm system info --full --format=json $pkg_names | get_json_values "data packageInfo provides"
docmd apm system info --full --format=json $pkg_names | parse_json_values "data packageInfo provides"
return
fi
;;
Expand Down
4 changes: 2 additions & 2 deletions bin/epm-requires
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,9 @@ case $PMTYPE in
return
else
if [ -n "$short" ] ; then
docmd apm system info --full --format=json $pkg_names | get_json_values "data packageInfo depends" | __epm_filter_out_base_alt_reqs | sed -e "s| .*||"
docmd apm system info --full --format=json $pkg_names | parse_json_values "data packageInfo depends" | __epm_filter_out_base_alt_reqs | sed -e "s| .*||"
else
docmd apm system info --full --format=json $pkg_names | get_json_values "data packageInfo depends" | __epm_filter_out_base_alt_reqs
docmd apm system info --full --format=json $pkg_names | parse_json_values "data packageInfo depends" | __epm_filter_out_base_alt_reqs
fi
return
fi
Expand Down
6 changes: 2 additions & 4 deletions bin/epm-sh-altlinux
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ get_task_packages_list()
local tn="$1"
local res

showcmd "eget -q -O- $ALTTASKURL/$tn/plan/add-bin"
res="$(eget -q -O- $ALTTASKURL/$tn/plan/add-bin)" || return
res="$(fetch_url $ALTTASKURL/$tn/plan/add-bin)" || return
echo "$res" | cut -f1-3 | grep -E "(noarch|$DISTRARCH)$" | cut -f1
}

Expand All @@ -60,8 +59,7 @@ get_task_arepo_packages_list()
local tn="$1"
local res

showcmd "eget -q -O- $ALTTASKURL/$tn/plan/arepo-add-x86_64-i586"
res="$(eget -q -O- $ALTTASKURL/$tn/plan/arepo-add-x86_64-i586)" || return
res="$(fetch_url $ALTTASKURL/$tn/plan/arepo-add-x86_64-i586)" || return
echo "$res" | cut -f1
}

Expand Down
Loading
Loading