feat: add support for multiple packages in one alr.sh

This commit is contained in:
2025-02-12 18:34:35 +03:00
parent 606cd5473a
commit e05bb07f23
23 changed files with 1744 additions and 1058 deletions

View File

@ -170,3 +170,10 @@ func (c *ALRConfig) AutoPull(ctx context.Context) bool {
})
return c.cfg.AutoPull
}
func (c *ALRConfig) PagerStyle(ctx context.Context) string {
c.cfgOnce.Do(func() {
c.Load(ctx)
})
return c.cfg.PagerStyle
}

View File

@ -31,10 +31,11 @@ import (
// CurrentVersion is the current version of the database.
// The database is reset if its version doesn't match this.
const CurrentVersion = 2
const CurrentVersion = 3
// Package is a ALR package's database representation
type Package struct {
BasePkgName string `sh:"base" db:"basepkg_name"`
Name string `sh:"name,required" db:"name"`
Version string `sh:"version,required" db:"version"`
Release int `sh:"release,required" db:"release"`
@ -99,6 +100,7 @@ func (d *Database) initDB(ctx context.Context) error {
conn := d.conn
_, err := conn.ExecContext(ctx, `
CREATE TABLE IF NOT EXISTS pkgs (
basepkg_name TEXT NOT NULL,
name TEXT NOT NULL,
repository TEXT NOT NULL,
version TEXT NOT NULL,
@ -196,6 +198,7 @@ func (d *Database) IsEmpty(ctx context.Context) bool {
func (d *Database) InsertPackage(ctx context.Context, pkg Package) error {
_, err := d.conn.NamedExecContext(ctx, `
INSERT OR REPLACE INTO pkgs (
basepkg_name,
name,
repository,
version,
@ -213,6 +216,7 @@ func (d *Database) InsertPackage(ctx context.Context, pkg Package) error {
builddepends,
optdepends
) VALUES (
:basepkg_name,
:name,
:repository,
:version,

View File

@ -123,6 +123,7 @@ func (FileDownloader) Download(ctx context.Context, opts Options) (Type, string,
} else {
out = fl
}
defer out.Close()
h, err := opts.NewHash()
if err != nil {

View File

@ -164,7 +164,10 @@ func (d *Decoder) DecodeVars(val any) error {
return nil
}
type ScriptFunc func(ctx context.Context, opts ...interp.RunnerOption) error
type (
ScriptFunc func(ctx context.Context, opts ...interp.RunnerOption) error
ScriptFuncWithSubshell func(ctx context.Context, opts ...interp.RunnerOption) (*interp.Runner, error)
)
// GetFunc returns a function corresponding to a bash function
// with the given name
@ -197,6 +200,24 @@ func (d *Decoder) GetFuncP(name string, prepare PrepareFunc) (ScriptFunc, bool)
}, true
}
func (d *Decoder) GetFuncWithSubshell(name string) (ScriptFuncWithSubshell, bool) {
fn := d.getFunc(name)
if fn == nil {
return nil, false
}
return func(ctx context.Context, opts ...interp.RunnerOption) (*interp.Runner, error) {
sub := d.Runner.Subshell()
for _, opt := range opts {
err := opt(sub)
if err != nil {
return nil, err
}
}
return sub, sub.Run(ctx, fn)
}, true
}
func (d *Decoder) getFunc(name string) *syntax.Stmt {
names, err := overrides.Resolve(d.info, overrides.DefaultOpts.WithName(name))
if err != nil {

View File

@ -29,9 +29,9 @@ import (
"syscall"
"time"
"gitea.plemya-x.ru/Plemya-x/fakeroot"
"mvdan.cc/sh/v3/expand"
"mvdan.cc/sh/v3/interp"
"plemya-x.ru/fakeroot"
)
// FakerootExecHandler was extracted from github.com/mvdan/sh/interp/handler.go

View File

@ -9,40 +9,56 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: build.go:41
#: build.go:44
msgid "Build a local package"
msgstr ""
#: build.go:47
#: build.go:50
msgid "Path to the build script"
msgstr ""
#: build.go:52
#: build.go:55
msgid "Specify package in script (for multi package script only)"
msgstr ""
#: build.go:60
msgid "Name of the package to build and its repo (example: default/go-bin)"
msgstr ""
#: build.go:57
#: build.go:65
msgid ""
"Build package from scratch even if there's an already built package available"
msgstr ""
#: build.go:87
msgid "Error pulling repositories"
#: build.go:75
msgid "Error db init"
msgstr ""
#: build.go:95
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:107
msgid "Error building package"
msgstr ""
#: build.go:114
msgid "Error getting working directory"
#: build.go:105
msgid "Package not found"
msgstr ""
#: build.go:123
msgid "Error pulling repositories"
msgstr ""
#: build.go:131
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:137
msgid "Error parsing os release"
msgstr ""
#: build.go:158
msgid "Error building package"
msgstr ""
#: build.go:165
msgid "Error getting working directory"
msgstr ""
#: build.go:174
msgid "Error moving the package"
msgstr ""
@ -130,31 +146,31 @@ msgstr ""
msgid "Error encoding script variables"
msgstr ""
#: install.go:42
#: install.go:43
msgid "Install a new package"
msgstr ""
#: install.go:56
#: install.go:57
msgid "Command install expected at least 1 argument, got %d"
msgstr ""
#: install.go:91
#: install.go:124
msgid "Error getting packages"
msgstr ""
#: install.go:100
#: install.go:133
msgid "Error iterating over packages"
msgstr ""
#: install.go:113
#: install.go:146
msgid "Remove an installed package"
msgstr ""
#: install.go:118
#: install.go:151
msgid "Command remove expected at least 1 argument, got %d"
msgstr ""
#: install.go:130
#: install.go:163
msgid "Error removing packages"
msgstr ""
@ -222,11 +238,11 @@ msgstr ""
msgid "Error parsing system language"
msgstr ""
#: internal/db/db.go:131
#: internal/db/db.go:133
msgid "Database version mismatch; resetting"
msgstr ""
#: internal/db/db.go:138
#: internal/db/db.go:140
msgid ""
"Database version does not exist. Run alr fix if something isn't working."
msgstr ""
@ -293,82 +309,70 @@ msgstr ""
msgid "Error while running app"
msgstr ""
#: pkg/build/build.go:108
#: pkg/build/build.go:153
msgid "Failed to prompt user to view build script"
msgstr ""
#: pkg/build/build.go:112
#: pkg/build/build.go:157
msgid "Building package"
msgstr ""
#: pkg/build/build.go:156
#: pkg/build/build.go:228
msgid "Downloading sources"
msgstr ""
#: pkg/build/build.go:168
#: pkg/build/build.go:246
msgid "Building package metadata"
msgstr ""
#: pkg/build/build.go:190
#: pkg/build/build.go:268
msgid "Compressing package"
msgstr ""
#: pkg/build/build.go:316
#: pkg/build/build.go:419
msgid ""
"Your system's CPU architecture doesn't match this package. Do you want to "
"build anyway?"
msgstr ""
#: pkg/build/build.go:327
#: pkg/build/build.go:433
msgid "This package is already installed"
msgstr ""
#: pkg/build/build.go:355
#: pkg/build/build.go:457
msgid "Installing build dependencies"
msgstr ""
#: pkg/build/build.go:397
#: pkg/build/build.go:498
msgid "Installing dependencies"
msgstr ""
#: pkg/build/build.go:443
msgid "Executing version()"
#: pkg/build/build.go:533
msgid "The checksums array must be the same length as sources"
msgstr ""
#: pkg/build/build.go:463
msgid "Updating version"
msgstr ""
#: pkg/build/build.go:468
msgid "Executing prepare()"
msgstr ""
#: pkg/build/build.go:478
msgid "Executing build()"
msgstr ""
#: pkg/build/build.go:488
msgid "Executing package()"
msgstr ""
#: pkg/build/build.go:510
msgid "Executing files()"
msgstr ""
#: pkg/build/build.go:588
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/build.go:599
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/build.go:706
#: pkg/build/build.go:584
msgid "Would you like to remove the build dependencies?"
msgstr ""
#: pkg/build/build.go:812
msgid "The checksums array must be the same length as sources"
#: pkg/build/build.go:647
msgid "Executing prepare()"
msgstr ""
#: pkg/build/build.go:657
msgid "Executing build()"
msgstr ""
#: pkg/build/build.go:687 pkg/build/build.go:707
msgid "Executing %s()"
msgstr ""
#: pkg/build/build.go:766
msgid "Error installing native packages"
msgstr ""
#: pkg/build/build.go:790
msgid "Error installing package"
msgstr ""
#: pkg/build/findDeps.go:35
@ -383,27 +387,27 @@ msgstr ""
msgid "Required dependency found"
msgstr ""
#: pkg/build/install.go:42
msgid "Error installing native packages"
#: pkg/build/utils.go:133
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/build/install.go:79
msgid "Error installing package"
#: pkg/build/utils.go:144
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
#: pkg/repos/pull.go:75
#: pkg/repos/pull.go:79
msgid "Pulling repository"
msgstr ""
#: pkg/repos/pull.go:99
#: pkg/repos/pull.go:103
msgid "Repository up to date"
msgstr ""
#: pkg/repos/pull.go:156
#: pkg/repos/pull.go:160
msgid "Git repository does not appear to be a valid ALR repo"
msgstr ""
#: pkg/repos/pull.go:172
#: pkg/repos/pull.go:176
msgid ""
"ALR repo's minimum ALR version is greater than the current version. Try "
"updating ALR if something doesn't work."
@ -457,10 +461,10 @@ msgstr ""
msgid "Upgrade all installed packages"
msgstr ""
#: upgrade.go:83
#: upgrade.go:90
msgid "Error checking for updates"
msgstr ""
#: upgrade.go:94
#: upgrade.go:112
msgid "There is nothing to do."
msgstr ""

View File

@ -16,40 +16,57 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 47.1\n"
#: build.go:41
#: build.go:44
msgid "Build a local package"
msgstr "Сборка локального пакета"
#: build.go:47
#: build.go:50
msgid "Path to the build script"
msgstr "Путь к скрипту сборки"
#: build.go:52
#: build.go:55
msgid "Specify package in script (for multi package script only)"
msgstr ""
#: build.go:60
msgid "Name of the package to build and its repo (example: default/go-bin)"
msgstr "Имя пакета для сборки и его репозиторий (пример: default/go-bin)"
#: build.go:57
#: build.go:65
msgid ""
"Build package from scratch even if there's an already built package available"
msgstr "Создайте пакет с нуля, даже если уже имеется готовый пакет"
#: build.go:87
#: build.go:75
msgid "Error db init"
msgstr ""
#: build.go:105
msgid "Package not found"
msgstr ""
#: build.go:123
msgid "Error pulling repositories"
msgstr "Ошибка при извлечении репозиториев"
#: build.go:95
#: build.go:131
msgid "Unable to detect a supported package manager on the system"
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
#: build.go:107
#: build.go:137
#, fuzzy
msgid "Error parsing os release"
msgstr "Ошибка при разборе файла выпуска операционной системы"
#: build.go:158
msgid "Error building package"
msgstr "Ошибка при сборке пакета"
#: build.go:114
#: build.go:165
msgid "Error getting working directory"
msgstr "Ошибка при получении рабочего каталога"
#: build.go:123
#: build.go:174
msgid "Error moving the package"
msgstr "Ошибка при перемещении пакета"
@ -137,31 +154,31 @@ msgstr "Ошибка устранения переорпеделений"
msgid "Error encoding script variables"
msgstr "Ошибка кодирования переменных скрита"
#: install.go:42
#: install.go:43
msgid "Install a new package"
msgstr "Установить новый пакет"
#: install.go:56
#: install.go:57
msgid "Command install expected at least 1 argument, got %d"
msgstr "Для команды install ожидался хотя бы 1 аргумент, получено %d"
#: install.go:91
#: install.go:124
msgid "Error getting packages"
msgstr "Ошибка при получении пакетов"
#: install.go:100
#: install.go:133
msgid "Error iterating over packages"
msgstr "Ошибка при переборе пакетов"
#: install.go:113
#: install.go:146
msgid "Remove an installed package"
msgstr "Удалить установленный пакет"
#: install.go:118
#: install.go:151
msgid "Command remove expected at least 1 argument, got %d"
msgstr "Для команды remove ожидался хотя бы 1 аргумент, получено %d"
#: install.go:130
#: install.go:163
msgid "Error removing packages"
msgstr "Ошибка при удалении пакетов"
@ -233,11 +250,11 @@ msgstr "Не удалось создать каталог кэша пакето
msgid "Error parsing system language"
msgstr "Ошибка при парсинге языка системы"
#: internal/db/db.go:131
#: internal/db/db.go:133
msgid "Database version mismatch; resetting"
msgstr "Несоответствие версий базы данных; сброс настроек"
#: internal/db/db.go:138
#: internal/db/db.go:140
msgid ""
"Database version does not exist. Run alr fix if something isn't working."
msgstr ""
@ -307,27 +324,27 @@ msgstr ""
msgid "Error while running app"
msgstr "Ошибка при запуске приложения"
#: pkg/build/build.go:108
#: pkg/build/build.go:153
msgid "Failed to prompt user to view build script"
msgstr "Не удалось предложить пользователю просмотреть скрипт сборки"
#: pkg/build/build.go:112
#: pkg/build/build.go:157
msgid "Building package"
msgstr "Сборка пакета"
#: pkg/build/build.go:156
#: pkg/build/build.go:228
msgid "Downloading sources"
msgstr "Скачивание источников"
#: pkg/build/build.go:168
#: pkg/build/build.go:246
msgid "Building package metadata"
msgstr "Сборка метаданных пакета"
#: pkg/build/build.go:190
#: pkg/build/build.go:268
msgid "Compressing package"
msgstr "Сжатие пакета"
#: pkg/build/build.go:316
#: pkg/build/build.go:419
msgid ""
"Your system's CPU architecture doesn't match this package. Do you want to "
"build anyway?"
@ -335,59 +352,46 @@ msgstr ""
"Архитектура процессора вашей системы не соответствует этому пакету. Вы все "
"равно хотите выполнить сборку?"
#: pkg/build/build.go:327
#: pkg/build/build.go:433
msgid "This package is already installed"
msgstr "Этот пакет уже установлен"
#: pkg/build/build.go:355
#: pkg/build/build.go:457
msgid "Installing build dependencies"
msgstr "Установка зависимостей сборки"
#: pkg/build/build.go:397
#: pkg/build/build.go:498
msgid "Installing dependencies"
msgstr "Установка зависимостей"
#: pkg/build/build.go:443
msgid "Executing version()"
msgstr "Исполнение версия()"
#: pkg/build/build.go:533
msgid "The checksums array must be the same length as sources"
msgstr "Массив контрольных сумм должен быть той же длины, что и источники"
#: pkg/build/build.go:463
msgid "Updating version"
msgstr "Обновление версии"
#: pkg/build/build.go:468
msgid "Executing prepare()"
msgstr "Исполнение prepare()"
#: pkg/build/build.go:478
msgid "Executing build()"
msgstr "Исполнение build()"
#: pkg/build/build.go:488
msgid "Executing package()"
msgstr "Исполнение package()"
#: pkg/build/build.go:510
msgid "Executing files()"
msgstr "Исполнение files()"
#: pkg/build/build.go:588
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/build.go:599
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/build.go:706
#: pkg/build/build.go:584
msgid "Would you like to remove the build dependencies?"
msgstr "Хотели бы вы удалить зависимости сборки?"
#: pkg/build/build.go:812
msgid "The checksums array must be the same length as sources"
msgstr "Массив контрольных сумм должен быть той же длины, что и источники"
#: pkg/build/build.go:647
msgid "Executing prepare()"
msgstr "Исполнение prepare()"
#: pkg/build/build.go:657
msgid "Executing build()"
msgstr "Исполнение build()"
#: pkg/build/build.go:687 pkg/build/build.go:707
#, fuzzy
msgid "Executing %s()"
msgstr "Исполнение files()"
#: pkg/build/build.go:766
msgid "Error installing native packages"
msgstr "Ошибка при установке нативных пакетов"
#: pkg/build/build.go:790
msgid "Error installing package"
msgstr "Ошибка при установке пакета"
#: pkg/build/findDeps.go:35
msgid "Command not found on the system"
@ -401,27 +405,29 @@ msgstr "Найденная предоставленная зависимость
msgid "Required dependency found"
msgstr "Найдена требуемая зависимость"
#: pkg/build/install.go:42
msgid "Error installing native packages"
msgstr "Ошибка при установке нативных пакетов"
#: pkg/build/utils.go:133
msgid "AutoProv is not implemented for this package format, so it's skipped"
msgstr ""
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/install.go:79
msgid "Error installing package"
msgstr "Ошибка при установке пакета"
#: pkg/build/utils.go:144
msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr ""
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/repos/pull.go:75
#: pkg/repos/pull.go:79
msgid "Pulling repository"
msgstr "Скачивание репозитория"
#: pkg/repos/pull.go:99
#: pkg/repos/pull.go:103
msgid "Repository up to date"
msgstr "Репозиторий уже обновлён"
#: pkg/repos/pull.go:156
#: pkg/repos/pull.go:160
msgid "Git repository does not appear to be a valid ALR repo"
msgstr "Репозиторий Git не поддерживается репозиторием ALR"
#: pkg/repos/pull.go:172
#: pkg/repos/pull.go:176
msgid ""
"ALR repo's minimum ALR version is greater than the current version. Try "
"updating ALR if something doesn't work."
@ -477,10 +483,19 @@ msgstr "Скачать все изменённые репозитории"
msgid "Upgrade all installed packages"
msgstr "Обновить все установленные пакеты"
#: upgrade.go:83
#: upgrade.go:90
msgid "Error checking for updates"
msgstr "Ошибка при проверке обновлений"
#: upgrade.go:94
#: upgrade.go:112
msgid "There is nothing to do."
msgstr "Здесь нечего делать."
#~ msgid "Executing version()"
#~ msgstr "Исполнение версия()"
#~ msgid "Updating version"
#~ msgstr "Обновление версии"
#~ msgid "Executing package()"
#~ msgstr "Исполнение package()"

View File

@ -23,11 +23,61 @@ import "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
type BuildOpts struct {
Script string
Packages []string
Manager manager.Manager
Clean bool
Interactive bool
}
type BuildVarsPre struct {
Version string `sh:"version,required"`
Release int `sh:"release,required"`
Epoch uint `sh:"epoch"`
Description string `sh:"desc"`
Homepage string `sh:"homepage"`
Maintainer string `sh:"maintainer"`
Architectures []string `sh:"architectures"`
Licenses []string `sh:"license"`
Provides []string `sh:"provides"`
Conflicts []string `sh:"conflicts"`
Depends []string `sh:"deps"`
BuildDepends []string `sh:"build_deps"`
OptDepends []string `sh:"opt_deps"`
Replaces []string `sh:"replaces"`
Sources []string `sh:"sources"`
Checksums []string `sh:"checksums"`
Backup []string `sh:"backup"`
Scripts Scripts `sh:"scripts"`
AutoReq []string `sh:"auto_req"`
AutoProv []string `sh:"auto_prov"`
}
func (bv *BuildVarsPre) ToBuildVars() BuildVars {
return BuildVars{
Name: "",
Version: bv.Version,
Release: bv.Release,
Epoch: bv.Epoch,
Description: bv.Description,
Homepage: bv.Homepage,
Maintainer: bv.Maintainer,
Architectures: bv.Architectures,
Licenses: bv.Licenses,
Provides: bv.Provides,
Conflicts: bv.Conflicts,
Depends: bv.Depends,
BuildDepends: bv.BuildDepends,
OptDepends: bv.OptDepends,
Replaces: bv.Replaces,
Sources: bv.Sources,
Checksums: bv.Checksums,
Backup: bv.Backup,
Scripts: bv.Scripts,
AutoReq: bv.AutoReq,
AutoProv: bv.AutoProv,
}
}
// BuildVars represents the script variables required
// to build a package
type BuildVars struct {