Перейти к содержанию
zoryn/ maintainer-assistant

zoryn gitery

zoryn gitery — обёртка над gitery, git-хостингом ALT Linux: просмотр репозиториев, истории коммитов, дерева и содержимого файлов, а также административные операции, для которых раньше приходилось вручную вызывать ssh gitery <verb>.

Два бэкенда

Команды чтения (ls, find-package, log, commit, diff, refs, branches, tags, tree, cat) обращаются к HTTP API gitoskop (по умолчанию https://git.altlinux.org/gitoskop/api) — он быстрее, чем SSH. ls и find-package при неудачном запросе к API откатываются на ssh gitery ls / ssh gitery find-package, предварительно выводя предупреждение. Для ls откат срабатывает только для корней, доступных ssh ls (people, gears, srpms); для gitoskop-only корней вроде tasks (и виртуального packages) выводится сама ошибка gitoskop, а не сбивающее с толку сообщение ssh «not in allowed tree».

Все остальные команды (quota, clone, charset, default-branch, init-db, repack, mv-db, rm-db) работают через ssh gitery <verb> — либо потому что им нужен доступ на запись, либо потому что у gitoskop нет соответствующего эндпоинта.

Адресация репозиториев

Каждая подкоманда с аргументом REPO (или DIR/SRC/DST) резолвит его одинаково:

  • Короткое имя (без /, например dune) разворачивается в people/<login>/packages/<name>, где <login> берётся из [gitery] login в ~/.zoryn. Для коротких имён без заданного login команда завершается ошибкой.
  • Без -n аргумент с / внутри воспринимается как полный путь от корня сервера (например, people/iv/packages/dune.git или packages/gears/d/dune).
  • Ведущий / всегда означает абсолютный путь от корня: он отбрасывается, а любой -n игнорируется (запасной вариант для полностью заданного пути, например -n packages /people/x/y даёт people/x/y).
  • -n/--namespace NS делает NS родителем для любого относительного аргумента (без ведущего /) — как короткого имени, так и многосегментного подпути: -n gears/d с dunegears/d/dune.git, а -n packages с gears/kpackages/gears/k. Он заменяет родителя по умолчанию people/<login>/packages и login не требует.

Для команд, работающих с репозиторием, — все подкоманды выше, кроме ls, init-db и mv-db, — резолвер добавляет суффикс .git, если его ещё нет, независимо от того, было ли имя коротким, задано через -n, или указано полным путём с /: dune превращается в people/<login>/packages/dune.git, а /people/x/packages/bar — в people/x/packages/bar.git. Единственное исключение — gear-репозиторий задания tasks/<id>/gears/<n>/git, каталог которого называется просто git: он остаётся как есть, чтобы не превратиться в нерабочий git.git. Команды ls, init-db и mv-db работают с обычными каталогами на сервере и .git никогда не добавляют.

Пейджинг

Когда stdout — терминал, форматированный (человекочитаемый) вывод команд чтения (ls, log, commit, diff, refs, branches, tags, tree, find-package) показывается через пейджер ($PAGER, по умолчанию less), как в git. Вывод, помещающийся на экран, печатается сразу и управление возвращается без ожидания; при пайпе или перенаправлении (| cat, > file) вывод идёт напрямую, без пейджера. Тело --json не пейджится и остаётся машиночитаемым. (cat печатает сырое содержимое файла напрямую и не пейджится.)

Вывод в JSON

Каждая команда чтения принимает --json — печатает необработанное тело ответа gitoskop API вместо стандартного форматированного вывода. У cat флага --json нет — она всегда печатает сырое содержимое файла.

Отладочный вывод

Каждая подкоманда принимает -d/--debug — печатает в stderr каждый отправляемый запрос: URL HTTP-запросов GET для чтения через API и SSH-команды для серверных операций. Помогает увидеть, в какой именно путь разворачивается короткое имя:

$ zoryn gitery log xfsprogs --limit 1 -d
gitery: GET https://git.altlinux.org/gitoskop/api/people/<login>/packages/xfsprogs.git
gitery: GET https://git.altlinux.org/gitoskop/api/people/<login>/packages/xfsprogs.git/log/sisyphus?limit=1

Подтверждение для изменяющих команд

init-db, repack, mv-db, rm-db, а также charset/default-branch при задании значения для установки запрашивают подтверждение перед выполнением, если не передан -y/--yes. charset/default-branch без значения (режим чтения) подтверждения не требуют. В неинтерактивной сессии (нет TTY) без --yes команда не выполняется молча со значением по умолчанию "нет", а завершается с предупреждением.

Автодополнение

При установленном автодополнении оболочки gitery дополняет данные прямо с сервера:

  • аргумент REPO/PATH дополняет короткое имя через поисковый API gitoskop (zoryn gitery log xfspr<TAB>people/<login>/packages/xfsprogs.git), а как только введён / или задан namespace через -n — навигирует по дереву сервера посегментно (zoryn gitery ls -n tasks 426<TAB>426179/, 426180/, … затем 426180/ge<TAB>426180/gears/ и так далее до репозитория). Подкаталоги дополняются с завершающим /, чтобы следующий сегмент дополнялся без пробела;
  • аргумент REF (log, tree, cat, default-branch) дополняется ветками и тегами репозитория, уже указанного в строке;
  • -n/--namespace дополняется корневыми метками верхнего уровня, запрашиваемыми у API gitoskop на лету (сейчас packages, people, tasks).

Дополнение работает по возможности и с коротким таймаутом, поэтому не подвешивает оболочку, если API отвечает медленно или недоступен.

Конфигурация

[gitery]
login = "rider"

[gitoskop]
url = "https://git.altlinux.org/gitoskop/api"

Подробности и значения по умолчанию — в конфигурации.

Просмотр репозиториев (API gitoskop)

zoryn gitery ls

Список каталога (по умолчанию: people/<login>/packages) либо содержимого репозитория, если путь заканчивается на .git.

Для каталога у каждого репозитория выводится размер на диске и дата последнего коммита; подкаталоги показываются с завершающим / без размера и даты:

750 MB  2019-07-03  389-ds-base.git
  2 MB  2018-11-01  389-dsgw.git
     -           -  public/

Для пути на .git показывается дерево файлов репозитория на ветке по умолчанию (тот же вывод, что и zoryn gitery tree <repo> <ветка-по-умолчанию>); чтобы зайти в подкаталог, допишите путь после .git:

$ zoryn gitery ls people/iv/packages/dune.git
drwxr-xr-x          -  .gear
-rw-r--r--  258 bytes  meson.build
drwxr-xr-x          -  src

$ zoryn gitery ls people/iv/packages/dune.git/.gear
-rw-r--r--    9 KB  dune.spec
-rw-r--r--  118 bytes  rules

Путь, который оказывается репозиторием даже без суффикса .git (например, gear-репозиторий задания tasks/<id>/gears/<n>/git), тоже распознаётся и показывается деревом, а не ошибкой.

По умолчанию листинг каталога сохраняет порядок сервера. -S/--sort пересортирует его по одному ключу — name, size или date (последний коммит), а -r/--reverse меняет порядок на убывающий:

zoryn gitery ls --sort=size                 # сначала самые маленькие репозитории
zoryn gitery ls --sort=size --reverse       # сначала самые большие
zoryn gitery ls -S date people/iv/packages  # сначала самый старый последний коммит

Сортировка действует только на человекочитаемый вывод; --json всегда возвращает порядок API как есть.

zoryn gitery ls
zoryn gitery ls people/iv/packages
zoryn gitery ls people/iv/packages/dune.git
zoryn gitery ls people/iv/packages/dune.git/.gear
zoryn gitery ls --json people/iv/packages
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -S, --sort=KEY — упорядочить листинг каталога по name, size или date.
  • -r, --reverse — сортировать по убыванию (сначала самые большие, новые или последние).
  • --json — вывести сырой JSON API.

zoryn gitery find-package

Поиск путей репозиториев gitery по шаблону.

zoryn gitery find-package dune
zoryn gitery find-package -n packages dune
zoryn gitery find-package --json dune
  • -n, --namespace NS — ограничить результаты путями репозиториев под NS/… (например, packages, people, tasks) — те же корни, что и у gitery ls -n.
  • --json — вывести сырой JSON API.

API gitoskop возвращает не более 200 совпадений за один запрос. Для широких шаблонов, под которые подходит больше, zoryn подгружает следующую страницу по мере прокрутки в пейджере — так доступен весь список, без обрезки до 50 на стороне сервера, вплоть до клиентского предела в 10 000 совпадений. Если под шаблон подходит больше, после закрытия пейджера выводится строка showing N of TOTAL matches (capped at 10000). С --json собранные из всех страниц результаты выдаются одним объектом { "results": [...], "total": N }.

-n/--namespace фильтрует на стороне клиента (у API поиска нет параметра пространства имён): zoryn просматривает совпадения и оставляет те, что лежат под выбранным корнем. Если пространство имён задано и просмотр упёрся в клиентский предел, строка примет вид scanned N of TOTAL matches (capped at 10000); M under NS.

zoryn gitery log

История коммитов репозитория, достижимых из REF. Если REF не указан, используется ветка по умолчанию (символическую ссылку HEAD API не разрешает). Каждый коммит выводится в стиле git log — полный oid, автор, дата и тема. Ссылки, указывающие на коммит, показываются в скобках после oid, как git log --decorate (HEAD -> master, tag: …):

zoryn gitery log dune
zoryn gitery log dune sisyphus --limit 20
zoryn gitery log dune --oneline
commit 55fd7f35ca4fbd8d4493dacc90f6d3a716c16ab0 (HEAD -> master, tag: 1.5.2-alt1)
Author: Dmitrii Fomchenkov <sirius@altlinux.org>
Date:   2026-07-21

    - new version

С --oneline каждый коммит — одна строка <короткий-oid> <тема>, вместе с декорациями (как git log --oneline --decorate):

55fd7f35ca (HEAD -> master, tag: 1.5.2-alt1) - new version
9e5f096ae5 Merge tag 'v1.5.2' into sisyphus

В терминале история подсвечивается, как git log --decorate: oid — жёлтым, HEAD — голубым, ветки — зелёным, теги — жёлтым, — и показывается через пейджер (см. раздел «Пейджинг» выше). При выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается.

  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --oneline — одна строка <короткий-oid> <тема> на коммит.
  • --limit=N — максимальное число коммитов.
  • --offset=N — сколько коммитов пропустить.
  • --json — вывести сырой JSON API.

zoryn gitery commit

Показать один коммит: заголовок, родителей и diff-stat по файлам.

zoryn gitery commit dune a486430311f40440ee89ed43c0a60a3379dbe3ad
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery show

Показать один коммит в стиле git show: заголовок и полное сообщение коммита, затем unified diff относительно первого родителя. REV — это oid коммита, тег или ветка; если не указан, берётся ветка репозитория по умолчанию (символическую ссылку HEAD API не разрешает).

zoryn gitery show dune
zoryn gitery show dune a486430
zoryn gitery show dune 3.24.0-alt1
commit a6b64c15dede3e7573443442a2a1687b4ff5c915
Author: Anton Farygin <rider@altlinux.org>
Date:   2026-06-27

    3.24.0-alt1

    - 3.23.1 -> 3.24.0

diff --git a/.gear/dune.spec b/.gear/dune.spec
--- a/.gear/dune.spec
+++ b/.gear/dune.spec
@@ -31,7 +31,7 @@
-Version: 3.23.1
+Version: 3.24.0

В терминале заголовок подсвечивается как git log --decorate, а патч — как git diff, и всё показывается через пейджер (см. раздел «Пейджинг» выше); при выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается.

  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery diff

Показать сводку diff-stat по файлам либо сырой патч для диапазона коммитов.

zoryn gitery diff dune abc60b5..a486430
zoryn gitery diff dune abc60b5..a486430 --patch

--patch печатает unified diff вместо сводки diff-stat. В терминале он подсвечивается точно как git diff — meta-строки файла и индекса полужирным, заголовки ханков голубым, добавления зелёным, удаления красным, — и показывается через пейджер (см. раздел «Пейджинг» выше); при выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается. Если заданы оба флага, --patch имеет приоритет: печатается патч, а --json игнорируется.

  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --patch — показать сырой unified diff вместо сводки по файлам.
  • --json — вывести сырой JSON API.

zoryn gitery refs

Список всех ссылок (веток и тэгов) репозитория.

zoryn gitery refs dune
zoryn gitery refs people/iv/packages/dune.git --json
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery branches

Список веток репозитория.

zoryn gitery branches dune
zoryn gitery branches people/iv/packages/dune.git --json
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery tags

Список тэгов репозитория.

zoryn gitery tags dune
zoryn gitery tags people/iv/packages/dune.git --json
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery tree

Элементы дерева по пути внутри ref (путь по умолчанию — корень репозитория). Для каждого элемента показывается режим в стиле ls -l и имя; размеры файлов выводятся как -, поскольку API не сообщает размеры по элементам.

zoryn gitery tree dune sisyphus
zoryn gitery tree dune sisyphus src
drwxr-xr-x  -  .gear
-rw-r--r--  -  meson.build
drwxr-xr-x  -  src
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • --json — вывести сырой JSON API.

zoryn gitery cat

Печать сырого содержимого файла. REF необязателен — без него читается ветка репозитория по умолчанию:

zoryn gitery cat dune Makefile           # ветка по умолчанию
zoryn gitery cat dune sisyphus Makefile  # явный ref

Два позиционных аргумента трактуются как REPO PATH, три — как REPO REF PATH.

  • -n, --namespace=NS — родительское пространство имён для коротких имён.

Администрирование сервера (SSH)

zoryn gitery quota

Показать дисковую квоту вызывающего пользователя на gitery.

zoryn gitery quota

zoryn gitery clone

Клонировать репозиторий на сервере gitery (клонирование на стороне сервера, не локальный git clone).

zoryn gitery clone dune
zoryn gitery clone dune mydir
  • -n, --namespace=NS — родительское пространство имён для коротких имён.

zoryn gitery charset

Без CHARSET — вывести текущую кодировку репозитория. С CHARSET — установить её (запрашивает подтверждение, если не задан --yes).

zoryn gitery charset dune
zoryn gitery charset dune UTF-8 --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение (актуально только при установке).

zoryn gitery default-branch

Без BRANCH — вывести текущую ветку по умолчанию репозитория. С BRANCH — установить её (запрашивает подтверждение, если не задан --yes).

zoryn gitery default-branch dune
zoryn gitery default-branch dune master --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение (актуально только при установке).

zoryn gitery init-db

Создать новый bare-репозиторий на сервере gitery (запрашивает подтверждение, если не задан --yes).

zoryn gitery init-db newpkg --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение.

zoryn gitery repack

Репак репозитория на сервере gitery, опционально с дополнительным параметром (запрашивает подтверждение, если не задан --yes).

zoryn gitery repack dune
zoryn gitery repack dune aggressive --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение.

zoryn gitery mv-db

Переместить/переименовать каталог репозитория на сервере gitery (запрашивает подтверждение, если не задан --yes).

zoryn gitery mv-db old new --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение.

zoryn gitery rm-db

Безвозвратно удалить репозиторий с сервера gitery (запрашивает подтверждение, если не задан --yes). Отменить это действие невозможно.

zoryn gitery rm-db people/x/packages/gone.git --yes
  • -n, --namespace=NS — родительское пространство имён для коротких имён.
  • -y, --yes — пропустить подтверждение.