From 72cdfcaa4b833d0f4b7d579fdc4998845ce1ca86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=A5=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Sat, 29 Nov 2025 19:32:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20vercmp?= =?UTF-8?q?=20=D0=B8=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=20=D1=81=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=80=D1=83=D1=81=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Заменен vercmp с go.elara.ws/vercmp на gitea.plemya-x.ru/xpamych/vercmp v0.0.1 - Добавлена функция FilterPackagesByVersion для проверки версий установленных пакетов перед пересборкой зависимостей (учитывает version-release и epoch) - Исправлена инициализация переводов в плагинах: добавлены вызовы translations.Setup() во всех plugin subcommands (_internal-safe-script-executor, _internal-installer, _internal-repos) - Добавлен GetSubcommandHelpTemplate для корректного отображения справки команд с подкомандами на русском языке - Добавлены кастомные help команды для config, repo, helper и mirror - Добавлены русские переводы для всех пользовательских сообщений: * Сообщения о создании пакетов (Creating package file, Packaging with nfpm и др.) * Сообщения команды fix (Clearing cache, Fixing permissions и др.) * Сообщения обновления (Updating system packages, System packages updated) * Сообщения о версиях пакетов (Package is installed with older/newer version) * Заголовки справки (NAME, USAGE, COMMANDS, OPTIONS) * Справочные сообщения (Shows a list of commands or help for one command) - Оптимизирован assets/logo.png (уменьшен с 37KB до 17KB) --- assets/logo.png | Bin 37473 -> 17828 bytes build.go | 2 +- config.go | 18 ++++ go.mod | 2 +- go.sum | 6 +- helper.go | 18 +++- internal.go | 5 +- internal/build/build.go | 6 ++ internal/build/installer.go | 49 ++++++++++ internal/build/plugins_executors.go | 2 + internal/build/plugins_executors_gen.go | 33 +++++++ internal/build/script_executor.go | 14 +-- internal/cliutils/app_builder/builder.go | 2 +- internal/cliutils/template.go | 25 +++++ internal/repos/pull.go | 12 +-- internal/translations/po/ru/default.po | 118 +++++++++++++++++++++-- main.go | 18 ++++ repo.go | 36 +++++++ upgrade.go | 2 +- 19 files changed, 337 insertions(+), 31 deletions(-) diff --git a/assets/logo.png b/assets/logo.png index 55c34ae10830b11d59468f6b1d5e2c502f2b8012..7176b54080e261275104eddc88698984cb8d3375 100644 GIT binary patch literal 17828 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 z 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 literal 37473 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, - Subcommands: []*cli.Command{helperListCmd}, + Subcommands: []*cli.Command{helperListCmd, helperHelpCmd}, Flags: []cli.Flag{ &cli.StringFlag{ Name: "dest-dir", @@ -100,7 +115,6 @@ func HelperCmd() *cli.Command { return helper(hc, c.Args().First(), c.Args().Slice()[1:]) }, - CustomHelpTemplate: cli.CommandHelpTemplate, BashComplete: func(ctx *cli.Context) { for name := range helpers.Helpers { fmt.Println(name) diff --git a/internal.go b/internal.go index eeec206..0a91fc6 100644 --- a/internal.go +++ b/internal.go @@ -32,6 +32,7 @@ import ( "gitea.plemya-x.ru/Plemya-x/ALR/internal/config" "gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" "gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" + "gitea.plemya-x.ru/Plemya-x/ALR/internal/translations" "gitea.plemya-x.ru/Plemya-x/ALR/internal/utils" ) @@ -42,6 +43,7 @@ func InternalBuildCmd() *cli.Command { Hidden: true, Action: func(c *cli.Context) error { logger.SetupForGoPlugin() + translations.Setup() slog.Debug("start _internal-safe-script-executor", "uid", syscall.Getuid(), "gid", syscall.Getgid()) @@ -81,7 +83,7 @@ func InternalReposCmd() *cli.Command { Hidden: true, Action: utils.RootNeededAction(func(ctx *cli.Context) error { logger.SetupForGoPlugin() - + translations.Setup() deps, err := appbuilder. New(ctx.Context). @@ -115,6 +117,7 @@ func InternalInstallCmd() *cli.Command { Hidden: true, Action: func(c *cli.Context) error { logger.SetupForGoPlugin() + translations.Setup() // Запуск от текущего пользователя, повышение прав будет через sudo при необходимости diff --git a/internal/build/build.go b/internal/build/build.go index 46747de..e8037f7 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -583,6 +583,12 @@ func (b *Builder) BuildALRDeps( input.BuildOpts().Interactive, true, ) + + pkgs, err = b.installerExecutor.FilterPackagesByVersion(ctx, pkgs, input.OSRelease()) + if err != nil { + return nil, nil, fmt.Errorf("failed to filter packages by version: %w", err) + } + type item struct { pkg *alrsh.Package packages []string diff --git a/internal/build/installer.go b/internal/build/installer.go index 80973d5..571e586 100644 --- a/internal/build/installer.go +++ b/internal/build/installer.go @@ -18,8 +18,16 @@ package build import ( "context" + "fmt" + "log/slog" + + "github.com/leonelquinteros/gotext" + "gitea.plemya-x.ru/xpamych/vercmp" "gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" + "gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" ) func NewInstaller(mgr manager.Manager) *Installer { @@ -58,3 +66,44 @@ func (i *Installer) RemoveAlreadyInstalled(ctx context.Context, pkgs []string) ( return filteredPackages, nil } + +func (i *Installer) FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error) { + installedPkgs, err := i.mgr.ListInstalled(nil) + if err != nil { + return nil, fmt.Errorf("failed to list installed packages: %w", err) + } + + var filteredPackages []alrsh.Package + + for _, pkg := range packages { + alrPkgName := fmt.Sprintf("%s+%s", pkg.Name, pkg.Repository) + installedVer, isInstalled := installedPkgs[alrPkgName] + + if !isInstalled { + filteredPackages = append(filteredPackages, pkg) + continue + } + + repoVer := pkg.Version + releaseStr := overrides.ReleasePlatformSpecific(pkg.Release, osRelease) + + if pkg.Release != 0 && pkg.Epoch == 0 { + repoVer = fmt.Sprintf("%s-%s", pkg.Version, releaseStr) + } else if pkg.Release != 0 && pkg.Epoch != 0 { + repoVer = fmt.Sprintf("%d:%s-%s", pkg.Epoch, pkg.Version, releaseStr) + } + + cmp := vercmp.Compare(repoVer, installedVer) + + if cmp > 0 { + slog.Info(gotext.Get("Package %s is installed with older version %s, will rebuild with version %s", alrPkgName, installedVer, repoVer)) + filteredPackages = append(filteredPackages, pkg) + } else if cmp == 0 { + slog.Info(gotext.Get("Package %s is already installed with version %s, skipping build", alrPkgName, installedVer)) + } else { + slog.Info(gotext.Get("Package %s is installed with newer version %s (repo has %s), skipping build", alrPkgName, installedVer, repoVer)) + } + } + + return filteredPackages, nil +} diff --git a/internal/build/plugins_executors.go b/internal/build/plugins_executors.go index 98d388e..0ddad49 100644 --- a/internal/build/plugins_executors.go +++ b/internal/build/plugins_executors.go @@ -21,6 +21,7 @@ import ( "gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/types" ) @@ -34,6 +35,7 @@ type InstallerExecutor interface { Install(ctx context.Context, pkgs []string, opts *manager.Opts) error Remove(ctx context.Context, pkgs []string, opts *manager.Opts) error RemoveAlreadyInstalled(ctx context.Context, pkgs []string) ([]string, error) + FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error) } type ScriptExecutor interface { diff --git a/internal/build/plugins_executors_gen.go b/internal/build/plugins_executors_gen.go index b7e3417..49bf3f4 100644 --- a/internal/build/plugins_executors_gen.go +++ b/internal/build/plugins_executors_gen.go @@ -24,6 +24,7 @@ import ( "context" "gitea.plemya-x.ru/Plemya-x/ALR/internal/manager" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh" + "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/types" "github.com/hashicorp/go-plugin" ) @@ -205,6 +206,38 @@ func (s *InstallerExecutorRPCServer) RemoveAlreadyInstalled(args *InstallerExecu return nil } +type InstallerExecutorFilterPackagesByVersionArgs struct { + Packages []alrsh.Package + OsRelease *distro.OSRelease +} + +type InstallerExecutorFilterPackagesByVersionResp struct { + Result0 []alrsh.Package +} + +func (s *InstallerExecutorRPC) FilterPackagesByVersion(ctx context.Context, packages []alrsh.Package, osRelease *distro.OSRelease) ([]alrsh.Package, error) { + var resp *InstallerExecutorFilterPackagesByVersionResp + err := s.client.Call("Plugin.FilterPackagesByVersion", &InstallerExecutorFilterPackagesByVersionArgs{ + Packages: packages, + OsRelease: osRelease, + }, &resp) + if err != nil { + return nil, err + } + return resp.Result0, nil +} + +func (s *InstallerExecutorRPCServer) FilterPackagesByVersion(args *InstallerExecutorFilterPackagesByVersionArgs, resp *InstallerExecutorFilterPackagesByVersionResp) error { + result0, err := s.Impl.FilterPackagesByVersion(context.Background(), args.Packages, args.OsRelease) + if err != nil { + return err + } + *resp = InstallerExecutorFilterPackagesByVersionResp{ + Result0: result0, + } + return nil +} + type ScriptExecutorReadScriptArgs struct { ScriptPath string } diff --git a/internal/build/script_executor.go b/internal/build/script_executor.go index 1bd1b11..77573c1 100644 --- a/internal/build/script_executor.go +++ b/internal/build/script_executor.go @@ -167,30 +167,30 @@ func (e *LocalScriptExecutor) ExecuteSecondPass( pkgName := packager.ConventionalFileName(pkgInfo) // Получаем имя файла пакета pkgPath := filepath.Join(dirs.BaseDir, pkgName) // Определяем путь к пакету - slog.Info("Creating package file", "path", pkgPath, "name", pkgName) + slog.Info(gotext.Get("Creating package file"), "path", pkgPath, "name", pkgName) pkgFile, err := os.Create(pkgPath) if err != nil { - slog.Error("Failed to create package file", "path", pkgPath, "error", err) + slog.Error(gotext.Get("Failed to create package file"), "path", pkgPath, "error", err) return nil, err } defer pkgFile.Close() - slog.Info("Packaging with nfpm", "format", pkgFormat) + slog.Info(gotext.Get("Packaging with nfpm"), "format", pkgFormat) err = packager.Package(pkgInfo, pkgFile) if err != nil { - slog.Error("Failed to create package", "path", pkgPath, "error", err) + slog.Error(gotext.Get("Failed to create package"), "path", pkgPath, "error", err) return nil, err } - slog.Info("Package created successfully", "path", pkgPath) + slog.Info(gotext.Get("Package created successfully"), "path", pkgPath) // Проверяем, что файл действительно существует if _, err := os.Stat(pkgPath); err != nil { - slog.Error("Package file not found after creation", "path", pkgPath, "error", err) + slog.Error(gotext.Get("Package file not found after creation"), "path", pkgPath, "error", err) return nil, err } - slog.Info("Package file verified to exist", "path", pkgPath) + slog.Info(gotext.Get("Package file verified to exist"), "path", pkgPath) builtDeps = append(builtDeps, &BuiltDep{ Name: vars.Name, diff --git a/internal/cliutils/app_builder/builder.go b/internal/cliutils/app_builder/builder.go index a946a12..116f8ad 100644 --- a/internal/cliutils/app_builder/builder.go +++ b/internal/cliutils/app_builder/builder.go @@ -42,7 +42,7 @@ type AppDeps struct { func (d *AppDeps) Defer() { if d.DB != nil { if err := d.DB.Close(); err != nil { - slog.Warn("failed to close db", "err", err) + slog.Warn(gotext.Get("failed to close db"), "err", err) } } } diff --git a/internal/cliutils/template.go b/internal/cliutils/template.go index 131fb29..c53812d 100644 --- a/internal/cliutils/template.go +++ b/internal/cliutils/template.go @@ -100,3 +100,28 @@ func GetCommandHelpTemplate() string { gotext.Get("OPTIONS"), ) } + +func GetSubcommandHelpTemplate() string { + return fmt.Sprintf(`%s: + {{template "helpNameTemplate" .}} + +%s: + {{.HelpName}} %s [%s] {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[%s...]{{end}} +{{if .Description}} + +%s: + {{template "descriptionTemplate" .}}{{end}} +{{- if len .Authors}} + +%s{{template "authorsTemplate" .}}{{end}}{{if .VisibleCommands}} + +%s:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +%s:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} + +%s:{{template "visibleFlagTemplate" .}}{{end}}{{if .Copyright}} + +%s: + {{template "copyrightTemplate" .}}{{end}} +`, gotext.Get("NAME"), gotext.Get("USAGE"), gotext.Get("command"), gotext.Get("command options"), gotext.Get("arguments"), gotext.Get("DESCRIPTION"), gotext.Get("AUTHOR"), gotext.Get("COMMANDS"), gotext.Get("OPTIONS"), gotext.Get("OPTIONS"), gotext.Get("COPYRIGHT")) +} diff --git a/internal/repos/pull.go b/internal/repos/pull.go index f0da904..c39ad51 100644 --- a/internal/repos/pull.go +++ b/internal/repos/pull.go @@ -36,7 +36,7 @@ import ( "github.com/go-git/go-git/v5/plumbing" "github.com/leonelquinteros/gotext" "github.com/pelletier/go-toml/v2" - "go.elara.ws/vercmp" + "gitea.plemya-x.ru/xpamych/vercmp" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/syntax" @@ -420,13 +420,13 @@ func (rs *Repos) processRepoChanges(ctx context.Context, repo types.Repo, r *git case actionDelete: scriptFl, err := oldCommit.File(action.File) if err != nil { - slog.Warn("Failed to get deleted file from old commit", "file", action.File, "error", err) + slog.Warn(gotext.Get("Failed to get deleted file from old commit"), "file", action.File, "error", err) continue } r, err := scriptFl.Reader() if err != nil { - slog.Warn("Failed to read deleted file", "file", action.File, "error", err) + slog.Warn(gotext.Get("Failed to read deleted file"), "file", action.File, "error", err) continue } @@ -445,13 +445,13 @@ func (rs *Repos) processRepoChanges(ctx context.Context, repo types.Repo, r *git case actionUpdate: scriptFl, err := newCommit.File(action.File) if err != nil { - slog.Warn("Failed to get updated file from new commit", "file", action.File, "error", err) + slog.Warn(gotext.Get("Failed to get updated file from new commit"), "file", action.File, "error", err) continue } r, err := scriptFl.Reader() if err != nil { - slog.Warn("Failed to read updated file", "file", action.File, "error", err) + slog.Warn(gotext.Get("Failed to read updated file"), "file", action.File, "error", err) continue } @@ -505,7 +505,7 @@ func (rs *Repos) processRepoFull(ctx context.Context, repo types.Repo, repoDir s } if len(matches) == 0 { - slog.Warn("No alr.sh files found in repository", "repo", repo.Name) + slog.Warn(gotext.Get("No alr.sh files found in repository"), "repo", repo.Name) return nil } diff --git a/internal/translations/po/ru/default.po b/internal/translations/po/ru/default.po index 8935dbf..9372669 100644 --- a/internal/translations/po/ru/default.po +++ b/internal/translations/po/ru/default.po @@ -341,7 +341,7 @@ msgstr "Выберите, какой пакет использовать для #: internal/cliutils/prompt.go:156 msgid "Choose which optional package(s) to install" -msgstr "Выберите, какой дополнительный пакет(ы) следует установить" +msgstr "Выберите дополнительные пакеты для установки" #: internal/cliutils/template.go:74 internal/cliutils/template.go:93 msgid "NAME" @@ -501,10 +501,14 @@ msgstr "Аргументы, которые будут переданы мене msgid "Enable interactive questions and prompts" msgstr "Включение интерактивных вопросов и запросов" -#: main.go:148 +#: main.go:147 msgid "Show help" msgstr "Показать справку" +#: main.go:148 +msgid "Shows a list of commands or help for one command" +msgstr "Показывает список команд или справку по одной команде" + #: main.go:152 msgid "Error while running app" msgstr "Ошибка при запуске приложения" @@ -551,7 +555,7 @@ msgstr "<имя>" #: repo.go:103 repo.go:465 repo.go:568 msgid "Repo \"%s\" does not exist" -msgstr "Репозитория \"%s\" не существует" +msgstr "Репозиторий \"%s\" не существует" #: repo.go:110 msgid "Error removing repo directory" @@ -620,7 +624,7 @@ msgstr "URL \"%s\" не существует в репозитории \"%s\"" #: repo.go:508 repo.go:580 msgid "Removed %d mirrors from repo \"%s\"\n" -msgstr "Удалены зеркала %d из репозитория \"%s\"\n" +msgstr "Удалено %d зеркал из репозитория \"%s\"\n" #: repo.go:520 msgid "Remove all mirrors from the repository" @@ -636,7 +640,7 @@ msgstr "URL-адрес нового репозитория" #: repo.go:632 msgid "Name of the repo to be deleted" -msgstr "Название репозитория удалён" +msgstr "Название репозитория для удаления" #: search.go:40 msgid "Search packages" @@ -656,7 +660,7 @@ msgstr "Искать по репозиторию" #: search.go:66 msgid "Search by provides" -msgstr "Иcкать по provides" +msgstr "Искать по provides" #: search.go:130 msgid "Error while executing search" @@ -672,7 +676,107 @@ msgstr "Ошибка при проверке обновлений" #: upgrade.go:126 msgid "There is nothing to do." -msgstr "Здесь нечего делать." +msgstr "Действия не требуются." + +#: internal/build/installer.go:88 +msgid "Package %s is installed with older version %s, will rebuild with version %s" +msgstr "Пакет %s установлен с устаревшей версией %s, будет пересобран с версией %s" + +#: internal/build/installer.go:96 +msgid "Package %s is already installed with version %s, skipping build" +msgstr "Пакет %s уже установлен с версией %s, пропуск сборки" + +#: internal/build/installer.go:102 +msgid "Package %s is installed with newer version %s (repo has %s), skipping build" +msgstr "Пакет %s установлен с более новой версией %s (в репозитории %s), пропуск сборки" + +#: internal/build/script_executor.go:170 +msgid "Creating package file" +msgstr "Создание файла пакета" + +#: internal/build/script_executor.go:174 +msgid "Failed to create package file" +msgstr "Не удалось создать файл пакета" + +#: internal/build/script_executor.go:179 +msgid "Packaging with nfpm" +msgstr "Упаковка с помощью nfpm" + +#: internal/build/script_executor.go:182 +msgid "Failed to create package" +msgstr "Не удалось создать пакет" + +#: internal/build/script_executor.go:186 +msgid "Package created successfully" +msgstr "Пакет успешно создан" + +#: internal/build/script_executor.go:190 +msgid "Package file not found after creation" +msgstr "Файл пакета не найден после создания" + +#: internal/build/script_executor.go:193 +msgid "Package file verified to exist" +msgstr "Наличие файла пакета подтверждено" + +#: internal/repos/pull.go:423 +msgid "Failed to get deleted file from old commit" +msgstr "Не удалось получить удалённый файл из старого коммита" + +#: internal/repos/pull.go:429 +msgid "Failed to read deleted file" +msgstr "Не удалось прочитать удалённый файл" + +#: internal/repos/pull.go:448 +msgid "Failed to get updated file from new commit" +msgstr "Не удалось получить обновлённый файл из нового коммита" + +#: internal/repos/pull.go:454 +msgid "Failed to read updated file" +msgstr "Не удалось прочитать обновлённый файл" + +#: internal/repos/pull.go:508 +msgid "No alr.sh files found in repository" +msgstr "Файлы alr.sh не найдены в репозитории" + +#: internal/cliutils/app_builder/builder.go:45 +msgid "failed to close db" +msgstr "не удалось закрыть БД" + +#: internal/build/build.go:342 +msgid "Using cached package" +msgstr "Используется кешированный пакет" + +#: upgrade.go:89 +msgid "Updating system packages..." +msgstr "Обновление системных пакетов..." + +#: upgrade.go:97 +msgid "System packages updated successfully" +msgstr "Системные пакеты успешно обновлены" + +#: build.go:203 +msgid "Package file already moved or removed, skipping" +msgstr "Файл пакета уже перемещён или удалён, пропускаем" + +#: fix.go:75 +msgid "Clearing cache and temporary directories" +msgstr "Очистка кэша и временных директорий" + +#: fix.go:119 +msgid "Clearing temporary directory" +msgstr "Очистка временной директории" + +#: fix.go:126 +msgid "Unable to remove temporary directory as current user, trying with sudo" +msgstr "Невозможно удалить временную директорию от текущего пользователя, попытка через sudo" + +#: fix.go:156 +msgid "Fixing permissions on temporary files" +msgstr "Исправление прав доступа к временным файлам" + +#: fix.go:177 +msgid "Creating cache directory" +msgstr "Создание директории кэша" #, fuzzy #~ msgid "Failed to clear contents of cache directory" diff --git a/main.go b/main.go index c7d5763..ad3ca66 100644 --- a/main.go +++ b/main.go @@ -50,6 +50,22 @@ func VersionCmd() *cli.Command { } } +func HelpCmd() *cli.Command { + return &cli.Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: gotext.Get("Shows a list of commands or help for one command"), + ArgsUsage: "[command]", + Action: func(cCtx *cli.Context) error { + args := cCtx.Args() + if args.Present() { + return cli.ShowCommandHelp(cCtx, args.First()) + } + return cli.ShowAppHelp(cCtx) + }, + } +} + func GetApp() *cli.App { return &cli.App{ Name: "alr", @@ -88,6 +104,7 @@ func GetApp() *cli.App { InternalBuildCmd(), InternalInstallCmd(), InternalReposCmd(), + HelpCmd(), }, Before: func(c *cli.Context) error { if trimmed := strings.TrimSpace(c.String("pm-args")); trimmed != "" { @@ -144,6 +161,7 @@ func main() { // Make the application more internationalized cli.AppHelpTemplate = cliutils.GetAppCliTemplate() cli.CommandHelpTemplate = cliutils.GetCommandHelpTemplate() + cli.SubcommandHelpTemplate = cliutils.GetSubcommandHelpTemplate() cli.HelpFlag.(*cli.BoolFlag).Usage = gotext.Get("Show help") err = app.RunContext(ctx, os.Args) diff --git a/repo.go b/repo.go index 5e6a178..11ae393 100644 --- a/repo.go +++ b/repo.go @@ -46,6 +46,24 @@ func RepoCmd() *cli.Command { SetRepoRefCmd(), RepoMirrorCmd(), SetUrlCmd(), + RepoHelpCmd(), + }, + } +} + +func RepoHelpCmd() *cli.Command { + return &cli.Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: gotext.Get("Shows a list of commands or help for one command"), + ArgsUsage: "[command]", + Action: func(cCtx *cli.Context) error { + args := cCtx.Args() + if args.Present() { + return cli.ShowCommandHelp(cCtx, args.First()) + } + cli.ShowSubcommandHelp(cCtx) + return nil }, } } @@ -331,6 +349,24 @@ func RepoMirrorCmd() *cli.Command { AddMirror(), RemoveMirror(), ClearMirrors(), + MirrorHelpCmd(), + }, + } +} + +func MirrorHelpCmd() *cli.Command { + return &cli.Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: gotext.Get("Shows a list of commands or help for one command"), + ArgsUsage: "[command]", + Action: func(cCtx *cli.Context) error { + args := cCtx.Args() + if args.Present() { + return cli.ShowCommandHelp(cCtx, args.First()) + } + cli.ShowSubcommandHelp(cCtx) + return nil }, } } diff --git a/upgrade.go b/upgrade.go index ec84a5b..c242479 100644 --- a/upgrade.go +++ b/upgrade.go @@ -26,7 +26,7 @@ import ( "github.com/leonelquinteros/gotext" "github.com/urfave/cli/v2" - "go.elara.ws/vercmp" + "gitea.plemya-x.ru/xpamych/vercmp" "golang.org/x/exp/maps" "gitea.plemya-x.ru/Plemya-x/ALR/internal/build"