Compare commits
8 Commits
v0.0.3
...
3f428ab7b5
Author | SHA1 | Date | |
---|---|---|---|
3f428ab7b5 | |||
5b7af1f6b5 | |||
3224d7c6e4 | |||
5d1d3d7c45 | |||
a711edbcc0 | |||
d5636e8094 | |||
5d17875813 | |||
41eec2fc98 |
30
.golangci.yml
Normal file
30
.golangci.yml
Normal file
@@ -0,0 +1,30 @@
|
||||
run:
|
||||
timeout: 5m
|
||||
|
||||
linters-settings:
|
||||
goimports:
|
||||
local-prefixes: "plemya-x.ru/alr"
|
||||
gofmt:
|
||||
simplify: true
|
||||
gofumpt:
|
||||
extra-rules: true
|
||||
|
||||
linters:
|
||||
enable:
|
||||
- gofmt
|
||||
- gofumpt
|
||||
- goimports
|
||||
- gocritic
|
||||
- govet
|
||||
- staticcheck
|
||||
- unused
|
||||
- errcheck
|
||||
- typecheck
|
||||
# - forbidigo
|
||||
|
||||
issues:
|
||||
fix: true
|
||||
exclude-rules:
|
||||
- path: _test\.go
|
||||
linters:
|
||||
- errcheck
|
12
Makefile
12
Makefile
@@ -11,6 +11,9 @@ ZSH_COMPLETION := $(COMPLETIONS_DIR)/zsh
|
||||
INSTALLED_BASH_COMPLETION := $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$(NAME)
|
||||
INSTALLED_ZSH_COMPLETION := $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_$(NAME)
|
||||
|
||||
ADD_LICENSE_BIN := go run github.com/google/addlicense@4caba19b7ed7818bb86bc4cd20411a246aa4a524
|
||||
GOLANGCI_LINT_BIN := go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.2
|
||||
|
||||
.PHONY: build install clean clear uninstall check-no-root
|
||||
|
||||
build: check-no-root $(BIN)
|
||||
@@ -48,3 +51,12 @@ uninstall:
|
||||
|
||||
clean clear:
|
||||
rm -f $(BIN)
|
||||
|
||||
OLD_FILES=$$(< old-files)
|
||||
IGNORE_OLD_FILES := $(foreach file,$(shell cat old-files),-ignore $(file))
|
||||
update-license:
|
||||
$(ADD_LICENSE_BIN) -v -f license-header-old-files.tmpl $(OLD_FILES)
|
||||
$(ADD_LICENSE_BIN) -v -f license-header.tmpl $(IGNORE_OLD_FILES) .
|
||||
|
||||
fmt:
|
||||
$(GOLANGCI_LINT_BIN) run --fix
|
||||
|
@@ -222,7 +222,7 @@ func extractFile(r io.Reader, format archiver.Format, name string, opts Options)
|
||||
}
|
||||
|
||||
if f.IsDir() {
|
||||
err = os.Mkdir(path, 0o755)
|
||||
err = os.MkdirAll(path, 0o755)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
18
license-header-old-files.tmpl
Normal file
18
license-header-old-files.tmpl
Normal file
@@ -0,0 +1,18 @@
|
||||
This file was originally part of the project "LURE - Linux User REpository", created by Elara Musayelyan.
|
||||
It has been modified as part of "ALR - Any Linux Repository" by Евгений Храмов.
|
||||
|
||||
ALR - Any Linux Repository
|
||||
Copyright (C) {{ .Year }} Евгений Храмов
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
license-header.tmpl
Normal file
15
license-header.tmpl
Normal file
@@ -0,0 +1,15 @@
|
||||
ALR - Any Linux Repository
|
||||
Copyright (C) {{ .Year }} Евгений Храмов
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
83
old-files
Normal file
83
old-files
Normal file
@@ -0,0 +1,83 @@
|
||||
./.github/FUNDING.yml
|
||||
./.gitignore
|
||||
./.goreleaser.yaml
|
||||
./.woodpecker.yml
|
||||
./LICENSE
|
||||
./Makefile
|
||||
./README.md
|
||||
./assets/logo.png
|
||||
./build.go
|
||||
./docs/README.md
|
||||
./docs/configuration.md
|
||||
./docs/packages/README.md
|
||||
./docs/packages/adding-packages.md
|
||||
./docs/packages/build-scripts.md
|
||||
./docs/packages/conventions.md
|
||||
./docs/usage.md
|
||||
./fix.go
|
||||
./gen.go
|
||||
./go.mod
|
||||
./go.sum
|
||||
./helper.go
|
||||
./info.go
|
||||
./install.go
|
||||
./internal/cliutils/prompt.go
|
||||
./internal/config/config.go
|
||||
./internal/config/lang.go
|
||||
./internal/config/paths.go
|
||||
./internal/config/version.go
|
||||
./internal/cpu/cpu.go
|
||||
./internal/db/db.go
|
||||
./internal/db/db_test.go
|
||||
./internal/dl/dl.go
|
||||
./internal/dl/file.go
|
||||
./internal/dl/git.go
|
||||
./internal/dl/torrent.go
|
||||
./internal/dlcache/dlcache.go
|
||||
./internal/dlcache/dlcache_test.go
|
||||
./internal/osutils/move.go
|
||||
./internal/overrides/overrides.go
|
||||
./internal/overrides/overrides_test.go
|
||||
./internal/pager/highlighting.go
|
||||
./internal/pager/pager.go
|
||||
./internal/shutils/decoder/decoder.go
|
||||
./internal/shutils/decoder/decoder_test.go
|
||||
./internal/shutils/handlers/exec.go
|
||||
./internal/shutils/handlers/exec_test.go
|
||||
./internal/shutils/handlers/fakeroot.go
|
||||
./internal/shutils/handlers/nop.go
|
||||
./internal/shutils/handlers/nop_test.go
|
||||
./internal/shutils/handlers/restricted.go
|
||||
./internal/shutils/helpers/helpers.go
|
||||
./internal/translations/files/lure.en.toml
|
||||
./internal/translations/files/lure.ru.toml
|
||||
./internal/translations/translations.go
|
||||
./internal/types/build.go
|
||||
./internal/types/config.go
|
||||
./internal/types/repo.go
|
||||
./list.go
|
||||
./main.go
|
||||
./pkg/build/build.go
|
||||
./pkg/build/install.go
|
||||
./pkg/distro/osrelease.go
|
||||
./pkg/gen/funcs.go
|
||||
./pkg/gen/pip.go
|
||||
./pkg/gen/tmpls/pip.tmpl.sh
|
||||
./pkg/loggerctx/log.go
|
||||
./pkg/manager/apk.go
|
||||
./pkg/manager/apt.go
|
||||
./pkg/manager/dnf.go
|
||||
./pkg/manager/managers.go
|
||||
./pkg/manager/pacman.go
|
||||
./pkg/manager/yum.go
|
||||
./pkg/manager/zypper.go
|
||||
./pkg/repos/find.go
|
||||
./pkg/repos/find_test.go
|
||||
./pkg/repos/pull.go
|
||||
./pkg/repos/pull_test.go
|
||||
./pkg/search/search.go
|
||||
./repo.go
|
||||
./scripts/completion/bash
|
||||
./scripts/completion/zsh
|
||||
./scripts/install.sh
|
||||
./upgrade.go
|
@@ -41,7 +41,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
// Импортируем пакеты для поддержки различных форматов пакетов (APK, DEB, RPM и ARCH).
|
||||
// Импортируем пакеты для поддержки различных форматов пакетов (APK, DEB, RPM и ARCH).
|
||||
_ "github.com/goreleaser/nfpm/v2/apk"
|
||||
_ "github.com/goreleaser/nfpm/v2/arch"
|
||||
_ "github.com/goreleaser/nfpm/v2/deb"
|
||||
@@ -82,8 +82,8 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
// Первый проход предназначен для получения значений переменных и выполняется
|
||||
// до отображения скрипта, чтобы предотвратить выполнение вредоносного кода.
|
||||
// Первый проход предназначен для получения значений переменных и выполняется
|
||||
// до отображения скрипта, чтобы предотвратить выполнение вредоносного кода.
|
||||
vars, err := executeFirstPass(ctx, info, fl, opts.Script)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
@@ -91,8 +91,8 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
|
||||
dirs := getDirs(ctx, vars, opts.Script)
|
||||
|
||||
// Если флаг opts.Clean не установлен, и пакет уже собран,
|
||||
// возвращаем его, а не собираем заново.
|
||||
// Если флаг opts.Clean не установлен, и пакет уже собран,
|
||||
// возвращаем его, а не собираем заново.
|
||||
if !opts.Clean {
|
||||
builtPkgPath, ok, err := checkForBuiltPackage(opts.Manager, vars, getPkgFormat(opts.Manager), dirs.BaseDir)
|
||||
if err != nil {
|
||||
@@ -104,7 +104,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
}
|
||||
}
|
||||
|
||||
// Спрашиваем у пользователя, хочет ли он увидеть скрипт сборки.
|
||||
// Спрашиваем у пользователя, хочет ли он увидеть скрипт сборки.
|
||||
err = cliutils.PromptViewScript(ctx, opts.Script, vars.Name, config.Config(ctx).PagerStyle, opts.Interactive)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to prompt user to view build script").Err(err).Send()
|
||||
@@ -112,9 +112,9 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
|
||||
log.Info("Building package").Str("name", vars.Name).Str("version", vars.Version).Send()
|
||||
|
||||
// Второй проход будет использоваться для выполнения реального кода,
|
||||
// поэтому он не ограничен. Скрипт уже был показан
|
||||
// пользователю к этому моменту, так что это должно быть безопасно.
|
||||
// Второй проход будет использоваться для выполнения реального кода,
|
||||
// поэтому он не ограничен. Скрипт уже был показан
|
||||
// пользователю к этому моменту, так что это должно быть безопасно.
|
||||
dec, err := executeSecondPass(ctx, info, fl, dirs)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
@@ -133,7 +133,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
os.Exit(1) // Если проверки не пройдены, выходим из программы
|
||||
}
|
||||
|
||||
// Подготавливаем директории для сборки
|
||||
// Подготавливаем директории для сборки
|
||||
err = prepareDirs(dirs)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
@@ -170,7 +170,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
|
||||
pkgFormat := getPkgFormat(opts.Manager) // Получаем формат пакета
|
||||
|
||||
pkgInfo, err := buildPkgMetadata(vars, dirs, pkgFormat, info, append(repoDeps, builtNames...)) // Собираем метаданные пакета
|
||||
pkgInfo, err := buildPkgMetadata(ctx, vars, dirs, pkgFormat, info, append(repoDeps, builtNames...)) // Собираем метаданные пакета
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
@@ -181,7 +181,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
}
|
||||
|
||||
pkgName := packager.ConventionalFileName(pkgInfo) // Получаем имя файла пакета
|
||||
pkgPath := filepath.Join(dirs.BaseDir, pkgName) // Определяем путь к пакету
|
||||
pkgPath := filepath.Join(dirs.BaseDir, pkgName) // Определяем путь к пакету
|
||||
|
||||
pkgFile, err := os.Create(pkgPath) // Создаём файл пакета
|
||||
if err != nil {
|
||||
@@ -200,14 +200,14 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
// Добавляем путь и имя только что собранного пакета в
|
||||
// соответствующие срезы
|
||||
// Добавляем путь и имя только что собранного пакета в
|
||||
// соответствующие срезы
|
||||
pkgPaths := append(builtPaths, pkgPath)
|
||||
pkgNames := append(builtNames, vars.Name)
|
||||
|
||||
// Удаляем дубликаты из pkgPaths и pkgNames.
|
||||
// Дубликаты могут появиться, если несколько зависимостей
|
||||
// зависят от одних и тех же пакетов.
|
||||
// Удаляем дубликаты из pkgPaths и pkgNames.
|
||||
// Дубликаты могут появиться, если несколько зависимостей
|
||||
// зависят от одних и тех же пакетов.
|
||||
pkgPaths = removeDuplicates(pkgPaths)
|
||||
pkgNames = removeDuplicates(pkgNames)
|
||||
|
||||
@@ -233,16 +233,16 @@ func parseScript(info *distro.OSRelease, script string) (*syntax.File, error) {
|
||||
// Функция executeFirstPass выполняет парсированный скрипт в ограниченной среде,
|
||||
// чтобы извлечь переменные сборки без выполнения реального кода.
|
||||
func executeFirstPass(ctx context.Context, info *distro.OSRelease, fl *syntax.File, script string) (*types.BuildVars, error) {
|
||||
scriptDir := filepath.Dir(script) // Получаем директорию скрипта
|
||||
scriptDir := filepath.Dir(script) // Получаем директорию скрипта
|
||||
env := createBuildEnvVars(info, types.Directories{ScriptDir: scriptDir}) // Создаём переменные окружения для сборки
|
||||
|
||||
runner, err := interp.New(
|
||||
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
||||
interp.StdIO(os.Stdin, os.Stdout, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
||||
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
||||
interp.StdIO(os.Stdin, os.Stdout, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
||||
interp.ExecHandler(helpers.Restricted.ExecHandler(handlers.NopExec)), // Ограничиваем выполнение
|
||||
interp.ReadDirHandler(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий
|
||||
interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов
|
||||
interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов
|
||||
interp.ReadDirHandler(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий
|
||||
interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов
|
||||
interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -282,8 +282,8 @@ func executeSecondPass(ctx context.Context, info *distro.OSRelease, fl *syntax.F
|
||||
|
||||
fakeroot := handlers.FakerootExecHandler(2 * time.Second) // Настраиваем "fakeroot" для выполнения
|
||||
runner, err := interp.New(
|
||||
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
||||
interp.StdIO(os.Stdin, os.Stdout, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
||||
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
||||
interp.StdIO(os.Stdin, os.Stdout, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
||||
interp.ExecHandler(helpers.Helpers.ExecHandler(fakeroot)), // Обрабатываем выполнение через fakeroot
|
||||
)
|
||||
if err != nil {
|
||||
@@ -396,30 +396,30 @@ func buildALRDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVa
|
||||
}
|
||||
repoDeps = notFound
|
||||
|
||||
// Если для некоторых пакетов есть несколько опций, упрощаем их все в один срез
|
||||
// Если для некоторых пакетов есть несколько опций, упрощаем их все в один срез
|
||||
pkgs := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive)
|
||||
scripts := GetScriptPaths(ctx, pkgs)
|
||||
for _, script := range scripts {
|
||||
newOpts := opts
|
||||
newOpts.Script = script
|
||||
|
||||
// Собираем зависимости
|
||||
// Собираем зависимости
|
||||
pkgPaths, pkgNames, err := BuildPackage(ctx, newOpts)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
// Добавляем пути всех собранных пакетов в builtPaths
|
||||
// Добавляем пути всех собранных пакетов в builtPaths
|
||||
builtPaths = append(builtPaths, pkgPaths...)
|
||||
// Добавляем пути всех собранных пакетов в builtPaths
|
||||
// Добавляем пути всех собранных пакетов в builtPaths
|
||||
builtNames = append(builtNames, pkgNames...)
|
||||
// Добавляем имя текущего пакета в builtNames
|
||||
// Добавляем имя текущего пакета в builtNames
|
||||
builtNames = append(builtNames, filepath.Base(filepath.Dir(script)))
|
||||
}
|
||||
}
|
||||
|
||||
// Удаляем возможные дубликаты, которые могут быть введены, если
|
||||
// несколько зависимостей зависят от одних и тех же пакетов.
|
||||
// Удаляем возможные дубликаты, которые могут быть введены, если
|
||||
// несколько зависимостей зависят от одних и тех же пакетов.
|
||||
repoDeps = removeDuplicates(repoDeps)
|
||||
builtPaths = removeDuplicates(builtPaths)
|
||||
builtNames = removeDuplicates(builtNames)
|
||||
@@ -474,35 +474,35 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire
|
||||
}
|
||||
}
|
||||
|
||||
// Выполнение всех функций, начинающихся с package_
|
||||
for {
|
||||
packageFn, ok := dec.GetFunc("package")
|
||||
if ok {
|
||||
log.Info("Executing package()").Send()
|
||||
err = packageFn(ctx, interp.Dir(dirs.SrcDir))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Выполнение всех функций, начинающихся с package_
|
||||
for {
|
||||
packageFn, ok := dec.GetFunc("package")
|
||||
if ok {
|
||||
log.Info("Executing package()").Send()
|
||||
err = packageFn(ctx, interp.Dir(dirs.SrcDir))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Проверка на наличие дополнительных функций package_*
|
||||
packageFuncName := "package_"
|
||||
if packageFunc, ok := dec.GetFunc(packageFuncName); ok {
|
||||
log.Info("Executing " + packageFuncName).Send()
|
||||
err = packageFunc(ctx, interp.Dir(dirs.SrcDir))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
break // Если больше нет функций package_*, выходим из цикла
|
||||
}
|
||||
}
|
||||
// Проверка на наличие дополнительных функций package_*
|
||||
packageFuncName := "package_"
|
||||
if packageFunc, ok := dec.GetFunc(packageFuncName); ok {
|
||||
log.Info("Executing " + packageFuncName).Send()
|
||||
err = packageFunc(ctx, interp.Dir(dirs.SrcDir))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
break // Если больше нет функций package_*, выходим из цикла
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Функция buildPkgMetadata создает метаданные для пакета, который будет собран.
|
||||
func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat string, info *distro.OSRelease, deps []string) (*nfpm.Info, error) {
|
||||
func buildPkgMetadata(ctx context.Context, vars *types.BuildVars, dirs types.Directories, pkgFormat string, info *distro.OSRelease, deps []string) (*nfpm.Info, error) {
|
||||
pkgInfo := getBasePkgInfo(vars)
|
||||
pkgInfo.Description = vars.Description
|
||||
pkgInfo.Platform = "linux"
|
||||
@@ -517,7 +517,7 @@ func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat s
|
||||
}
|
||||
|
||||
if pkgFormat == "apk" {
|
||||
// Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы
|
||||
// Alpine отказывается устанавливать пакеты, которые предоставляют сами себя, поэтому удаляем такие элементы
|
||||
pkgInfo.Overridables.Provides = slices.DeleteFunc(pkgInfo.Overridables.Provides, func(s string) bool {
|
||||
return s == pkgInfo.Name
|
||||
})
|
||||
@@ -543,6 +543,17 @@ func buildPkgMetadata(vars *types.BuildVars, dirs types.Directories, pkgFormat s
|
||||
}
|
||||
pkgInfo.Overridables.Contents = contents
|
||||
|
||||
if pkgFormat == "rpm" {
|
||||
err = rpmFindProvides(ctx, pkgInfo, dirs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = rpmFindRequires(ctx, pkgInfo, dirs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return pkgInfo, nil
|
||||
}
|
||||
|
||||
@@ -559,7 +570,7 @@ func buildContents(vars *types.BuildVars, dirs types.Directories) ([]*files.Cont
|
||||
return err
|
||||
}
|
||||
|
||||
// Если директория пустая, пропускаем её
|
||||
// Если директория пустая, пропускаем её
|
||||
_, err = f.Readdirnames(1)
|
||||
if err != io.EOF {
|
||||
return nil
|
||||
@@ -576,13 +587,13 @@ func buildContents(vars *types.BuildVars, dirs types.Directories) ([]*files.Cont
|
||||
|
||||
return f.Close()
|
||||
}
|
||||
// Если файл является символической ссылкой, прорабатываем это
|
||||
// Если файл является символической ссылкой, прорабатываем это
|
||||
if fi.Mode()&os.ModeSymlink != 0 {
|
||||
link, err := os.Readlink(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Удаляем pkgdir из пути символической ссылки
|
||||
// Удаляем pkgdir из пути символической ссылки
|
||||
link = strings.TrimPrefix(link, dirs.PkgDir)
|
||||
|
||||
contents = append(contents, &files.Content{
|
||||
@@ -597,7 +608,7 @@ func buildContents(vars *types.BuildVars, dirs types.Directories) ([]*files.Cont
|
||||
|
||||
return nil
|
||||
}
|
||||
// Обрабатываем обычные файлы
|
||||
// Обрабатываем обычные файлы
|
||||
fileContent := &files.Content{
|
||||
Source: path,
|
||||
Destination: trimmed,
|
||||
@@ -608,7 +619,7 @@ func buildContents(vars *types.BuildVars, dirs types.Directories) ([]*files.Cont
|
||||
},
|
||||
}
|
||||
|
||||
// Если файл должен быть сохранен, установите его тип как config|noreplace
|
||||
// Если файл должен быть сохранен, установите его тип как config|noreplace
|
||||
if slices.Contains(vars.Backup, trimmed) {
|
||||
fileContent.Type = "config|noreplace"
|
||||
}
|
||||
@@ -744,9 +755,9 @@ func getSources(ctx context.Context, dirs types.Directories, bv *types.BuildVars
|
||||
}
|
||||
|
||||
if !strings.EqualFold(bv.Checksums[i], "SKIP") {
|
||||
// Если контрольная сумма содержит двоеточие, используйте часть до двоеточия
|
||||
// как алгоритм, а часть после как фактическую контрольную сумму.
|
||||
// В противном случае используйте sha256 по умолчанию с целой строкой как контрольной суммой.
|
||||
// Если контрольная сумма содержит двоеточие, используйте часть до двоеточия
|
||||
// как алгоритм, а часть после как фактическую контрольную сумму.
|
||||
// В противном случае используйте sha256 по умолчанию с целой строкой как контрольной суммой.
|
||||
algo, hashData, ok := strings.Cut(bv.Checksums[i], ":")
|
||||
if ok {
|
||||
checksum, err := hex.DecodeString(hashData)
|
||||
|
80
pkg/build/findDeps.go
Normal file
80
pkg/build/findDeps.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package build
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/goreleaser/nfpm/v2"
|
||||
"plemya-x.ru/alr/internal/types"
|
||||
"plemya-x.ru/alr/pkg/loggerctx"
|
||||
)
|
||||
|
||||
func rpmFindDependencies(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories, command string, updateFunc func(string)) error {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
if _, err := exec.LookPath(command); err != nil {
|
||||
log.Info("Command not found on the system").Str("command", command).Send()
|
||||
return nil
|
||||
}
|
||||
|
||||
var paths []string
|
||||
for _, content := range pkgInfo.Contents {
|
||||
if content.Type != "dir" {
|
||||
paths = append(paths,
|
||||
path.Join(dirs.PkgDir, content.Destination),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if len(paths) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
cmd := exec.Command(command)
|
||||
cmd.Stdin = bytes.NewBufferString(strings.Join(paths, "\n"))
|
||||
cmd.Env = append(cmd.Env,
|
||||
"RPM_BUILD_ROOT="+dirs.PkgDir,
|
||||
"RPM_FINDPROV_METHOD=",
|
||||
"RPM_FINDREQ_METHOD=",
|
||||
"RPM_DATADIR=",
|
||||
"RPM_SUBPACKAGE_NAME=",
|
||||
)
|
||||
var out bytes.Buffer
|
||||
var stderr bytes.Buffer
|
||||
cmd.Stdout = &out
|
||||
cmd.Stderr = &stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Error(stderr.String())
|
||||
return err
|
||||
}
|
||||
|
||||
dependencies := strings.Split(strings.TrimSpace(out.String()), "\n")
|
||||
for _, dep := range dependencies {
|
||||
if dep != "" {
|
||||
updateFunc(dep)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func rpmFindProvides(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories) error {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
return rpmFindDependencies(ctx, pkgInfo, dirs, "/usr/lib/rpm/find-provides", func(dep string) {
|
||||
log.Info("Provided dependency found").Str("dep", dep).Send()
|
||||
pkgInfo.Overridables.Provides = append(pkgInfo.Overridables.Provides, dep)
|
||||
})
|
||||
}
|
||||
|
||||
func rpmFindRequires(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories) error {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
return rpmFindDependencies(ctx, pkgInfo, dirs, "/usr/lib/rpm/find-requires", func(dep string) {
|
||||
log.Info("Required dependency found").Str("dep", dep).Send()
|
||||
pkgInfo.Overridables.Depends = append(pkgInfo.Overridables.Depends, dep)
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user