Compare commits
30 Commits
v0.0.14
...
65ab4de561
| Author | SHA1 | Date | |
|---|---|---|---|
| 65ab4de561 | |||
| 1cdab8dfed | |||
| 237e2c338d | |||
| 703ab8e8c4 | |||
| 06fcab4ce7 | |||
| 7741c7368b | |||
| 69f4af0a4d | |||
| bcf627f176 | |||
| 6ec95e4bd9 | |||
| 578da7ff52 | |||
| c51caf5c52 | |||
| 09dba577c6 | |||
| ca82bf3024 | |||
| c0023db6cd | |||
| 152e5077ec | |||
| 15ba8700e8 | |||
| a8aefc0524 | |||
| 9540030579 | |||
| 4f9d4260b8 | |||
| 38b5e6f581 | |||
| 408bd12302 | |||
| fb83d544de | |||
| 2cb963d4b2 | |||
| e74d74cdf6 | |||
| 5b3d53d253 | |||
| 36e704f735 | |||
| 07356d5e55 | |||
| 52bd6aca93 | |||
| 2f1770b43b | |||
| 9d5b5b51ff |
@@ -39,19 +39,18 @@ jobs:
|
|||||||
uses: https://github.com/actions/setup-go@v5
|
uses: https://github.com/actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '1.24'
|
go-version: '1.24'
|
||||||
|
cache: false
|
||||||
|
|
||||||
- name: Cache Podman images
|
# - name: Cache Podman images
|
||||||
uses: actions/cache@v4
|
# uses: actions/cache@v4
|
||||||
with:
|
# with:
|
||||||
path: |
|
# path: |
|
||||||
~/.local/share/containers/storage
|
# ~/.local/share/containers/storage
|
||||||
/var/lib/containers/storage
|
# /var/lib/containers/storage
|
||||||
key: ${{ runner.os }}-primes
|
# key: ${{ runner.os }}-primes
|
||||||
|
|
||||||
- name: Run E2E tests
|
- name: Run E2E tests
|
||||||
env:
|
env:
|
||||||
DOCKER_HOST: unix:///tmp/podman.sock
|
|
||||||
IGNORE_ROOT_CHECK: 1
|
IGNORE_ROOT_CHECK: 1
|
||||||
run: |
|
run: |
|
||||||
podman system service -t 0 unix:///tmp/podman.sock &
|
|
||||||
make e2e-test
|
make e2e-test
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
pre-commit:
|
pre-commit:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -45,9 +45,15 @@ jobs:
|
|||||||
echo "Version - $version"
|
echo "Version - $version"
|
||||||
echo "VERSION=$version" >> $GITHUB_ENV
|
echo "VERSION=$version" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Build alr binary
|
- name: Prepare for install
|
||||||
run: |
|
run: |
|
||||||
CGO_ENABLED=0 go build -ldflags "-X gitea.plemya-x.ru/Plemya-x/ALR/internal/config.Version=${{ env.VERSION }}" -o alr
|
apt-get update && apt-get install -y libcap2-bin bindfs
|
||||||
|
|
||||||
|
- name: Build alr
|
||||||
|
env:
|
||||||
|
IGNORE_ROOT_CHECK: 1
|
||||||
|
run: |
|
||||||
|
make build
|
||||||
|
|
||||||
- name: Create tar.gz
|
- name: Create tar.gz
|
||||||
run: |
|
run: |
|
||||||
@@ -65,3 +71,50 @@ jobs:
|
|||||||
files: |-
|
files: |-
|
||||||
alr-${{ env.VERSION }}-linux-x86_64.tar.gz
|
alr-${{ env.VERSION }}-linux-x86_64.tar.gz
|
||||||
|
|
||||||
|
- name: Checkout alr-default repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: Plemya-x/alr-default
|
||||||
|
token: ${{ secrets.GITEAPUBLIC }}
|
||||||
|
path: alr-default
|
||||||
|
|
||||||
|
- name: Update version in alr-bin
|
||||||
|
run: |
|
||||||
|
# Замените значения в файле с конфигурацией
|
||||||
|
sed -i "s/version='[0-9]\+\.[0-9]\+\.[0-9]\+'/version='${{ env.VERSION }}'/g" alr-default/alr-bin/alr.sh
|
||||||
|
sed -i "s/release='[0-9]\+'/release='1'/g" alr-default/alr-bin/alr.sh
|
||||||
|
|
||||||
|
- name: Install alr
|
||||||
|
run: |
|
||||||
|
make install
|
||||||
|
|
||||||
|
# temporary fix
|
||||||
|
groupadd wheel
|
||||||
|
usermod -aG wheel root
|
||||||
|
|
||||||
|
- name: Build packages
|
||||||
|
run: |
|
||||||
|
SCRIPT_PATH=alr-default/alr-bin/alr.sh
|
||||||
|
ALR_DISTRO=altlinux ALR_PKG_FORMAT=rpm alr build -s "$SCRIPT_PATH"
|
||||||
|
ALR_PKG_FORMAT=rpm alr build -s "$SCRIPT_PATH"
|
||||||
|
ALR_PKG_FORMAT=deb alr build -s "$SCRIPT_PATH"
|
||||||
|
ALR_PKG_FORMAT=archlinux alr build -s "$SCRIPT_PATH"
|
||||||
|
|
||||||
|
- name: Upload assets
|
||||||
|
uses: akkuman/gitea-release-action@v1
|
||||||
|
with:
|
||||||
|
body: ${{ steps.changes.outputs.changes }}
|
||||||
|
files: |-
|
||||||
|
alr-bin+alr-default_${{ env.VERSION }}-1.red80_amd64.deb \
|
||||||
|
alr-bin+alr-default-${{ env.VERSION }}-1-x86_64.pkg.tar.zst \
|
||||||
|
alr-bin+alr-default-${{ env.VERSION }}-1.red80.x86_64.rpm \
|
||||||
|
alr-bin+alr-default-${{ env.VERSION }}-alt1.x86_64.rpm
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
run: |
|
||||||
|
cd alr-default
|
||||||
|
git config user.name "gitea"
|
||||||
|
git config user.email "admin@plemya-x.ru"
|
||||||
|
git add .
|
||||||
|
git commit -m "Обновление версии до ${{ env.VERSION }}"
|
||||||
|
git push
|
||||||
|
|||||||
8
Makefile
8
Makefile
@@ -24,7 +24,7 @@ $(BIN):
|
|||||||
go build -ldflags="-X 'gitea.plemya-x.ru/Plemya-x/ALR/internal/config.Version=$(GIT_VERSION)'" -o $@
|
go build -ldflags="-X 'gitea.plemya-x.ru/Plemya-x/ALR/internal/config.Version=$(GIT_VERSION)'" -o $@
|
||||||
|
|
||||||
check-no-root:
|
check-no-root:
|
||||||
@if [[ "$(IGNORE_ROOT_CHECK)" != "1" ]] && [[ "$$(whoami)" == 'root' ]]; then \
|
@if [ "$$IGNORE_ROOT_CHECK" != "1" ] && [ "`whoami`" = "root" ]; then \
|
||||||
echo "This target shouldn't run as root" 1>&2; \
|
echo "This target shouldn't run as root" 1>&2; \
|
||||||
echo "Set IGNORE_ROOT_CHECK=1 to override" 1>&2; \
|
echo "Set IGNORE_ROOT_CHECK=1 to override" 1>&2; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
@@ -39,6 +39,12 @@ install: \
|
|||||||
$(INSTALED_BIN): $(BIN)
|
$(INSTALED_BIN): $(BIN)
|
||||||
install -Dm755 $< $@
|
install -Dm755 $< $@
|
||||||
setcap cap_setuid,cap_setgid+ep $(INSTALED_BIN)
|
setcap cap_setuid,cap_setgid+ep $(INSTALED_BIN)
|
||||||
|
@if id alr >/dev/null 2>&1; then \
|
||||||
|
echo "User 'alr' already exists. Skipping."; \
|
||||||
|
else \
|
||||||
|
useradd -r -s /usr/sbin/nologin alr; \
|
||||||
|
fi
|
||||||
|
install -d -o alr -g alr -m 755 /var/cache/alr /etc/alr
|
||||||
|
|
||||||
$(INSTALLED_BASH_COMPLETION): $(BASH_COMPLETION)
|
$(INSTALLED_BASH_COMPLETION): $(BASH_COMPLETION)
|
||||||
install -Dm755 $< $@
|
install -Dm755 $< $@
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -20,10 +20,10 @@ ALR написан на чистом Go и после сборки не имее
|
|||||||
Установочный скрипт автоматически загрузит и установит соответствующий пакет ALR в вашей системе. Чтобы использовать его, просто выполните следующую команду:
|
Установочный скрипт автоматически загрузит и установит соответствующий пакет ALR в вашей системе. Чтобы использовать его, просто выполните следующую команду:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL plemya-x.ru/alr/install.sh | bash
|
curl -fsSL https://gitea.plemya-x.ru/Plemya-x/ALR/raw/branch/master/scripts/install.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
**ВАЖНО**: При этом скрипт будет загружен и запущен с <https://plemya-x.ru/alr/install.sh>. Пожалуйста, просматривайте любые скрипты, которые вы скачиваете из Интернета (включая этот), прежде чем запускать их.
|
**ВАЖНО**: При этом скрипт будет загружен и запущен [скрипт](https://gitea.plemya-x.ru/Plemya-x/ALR/src/branch/master/scripts/install.sh). Пожалуйста, просматривайте любые скрипты, которые вы скачиваете из Интернета (включая этот), прежде чем запускать их.
|
||||||
|
|
||||||
### Сборка из исходного кода
|
### Сборка из исходного кода
|
||||||
|
|
||||||
@@ -52,9 +52,17 @@ ALR был создан потому, что упаковка программн
|
|||||||
|
|
||||||
Репозитории alr - это git-хранилища, которые содержат каталог для каждого пакета с файлом `alr.sh` внутри. Файл `alr.sh` содержит все инструкции по сборке пакета и информацию о нем. Скрипты `alr.sh` аналогичны скриптам Aur PKGBUILD.
|
Репозитории alr - это git-хранилища, которые содержат каталог для каждого пакета с файлом `alr.sh` внутри. Файл `alr.sh` содержит все инструкции по сборке пакета и информацию о нем. Скрипты `alr.sh` аналогичны скриптам Aur PKGBUILD.
|
||||||
|
|
||||||
Например, репозиторий [Plemya-x/alr-repo](https://gitea.plemya-x.ru/Plemya-x/alr-repo.git) можно подключить так:
|
Например, репозиторий с ALR [Plemya-x/alr-default](https://gitea.plemya-x.ru/Plemya-x/alr-default.git)
|
||||||
```
|
```
|
||||||
alr addrepo --name alr-repo --url https://gitea.plemya-x.ru/Plemya-x/alr-repo.git
|
alr repo add alr-default https://gitea.plemya-x.ru/Plemya-x/alr-default.git
|
||||||
|
```
|
||||||
|
Репозиторий пакетов [Plemya-x/alr-repo](https://gitea.plemya-x.ru/Plemya-x/alr-repo.git) можно подключить так:
|
||||||
|
```
|
||||||
|
alr repo add alr-repo https://gitea.plemya-x.ru/Plemya-x/alr-repo.git
|
||||||
|
```
|
||||||
|
Репозиторий Linux-Gaming [Plemya-x/alr-LG](https://gitea.plemya-x.ru/Plemya-x/alr-LG.git) можно подключить так:
|
||||||
|
```
|
||||||
|
alr repo add alr-LG https://gitea.plemya-x.ru/Plemya-x/alr-LG.git
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||||
<text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
|
<text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
|
||||||
<text x="33.5" y="14">coverage</text>
|
<text x="33.5" y="14">coverage</text>
|
||||||
<text x="86" y="15" fill="#010101" fill-opacity=".3">16.9%</text>
|
<text x="86" y="15" fill="#010101" fill-opacity=".3">16.7%</text>
|
||||||
<text x="86" y="14">16.9%</text>
|
<text x="86" y="14">16.7%</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B |
12
build.go
12
build.go
@@ -28,12 +28,12 @@ import (
|
|||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BuildCmd() *cli.Command {
|
func BuildCmd() *cli.Command {
|
||||||
@@ -97,7 +97,7 @@ func BuildCmd() *cli.Command {
|
|||||||
var script string
|
var script string
|
||||||
var packages []string
|
var packages []string
|
||||||
|
|
||||||
var res *build.BuildResult
|
var res []*build.BuiltDep
|
||||||
|
|
||||||
var scriptArgs *build.BuildPackageFromScriptArgs
|
var scriptArgs *build.BuildPackageFromScriptArgs
|
||||||
var dbArgs *build.BuildPackageFromDbArgs
|
var dbArgs *build.BuildPackageFromDbArgs
|
||||||
@@ -222,9 +222,9 @@ func BuildCmd() *cli.Command {
|
|||||||
return cliutils.FormatCliExit(gotext.Get("Error building package"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error building package"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pkgPath := range res.PackagePaths {
|
for _, pkg := range res {
|
||||||
name := filepath.Base(pkgPath)
|
name := filepath.Base(pkg.Path)
|
||||||
err = osutils.Move(pkgPath, filepath.Join(wd, name))
|
err = osutils.Move(pkg.Path, filepath.Join(wd, name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error moving the package"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error moving the package"), err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ func runTestCommands(t *testing.T, r e2e.Runnable, timeout time.Duration, expect
|
|||||||
}
|
}
|
||||||
|
|
||||||
const REPO_NAME_FOR_E2E_TESTS = "alr-repo"
|
const REPO_NAME_FOR_E2E_TESTS = "alr-repo"
|
||||||
const REPO_URL_FOR_E2E_TESTS = "https://gitea.plemya-x.ru/Maks1mS/repo-for-tests.git"
|
const REPO_URL_FOR_E2E_TESTS = "https://gitea.plemya-x.ru/Plemya-x/repo-for-tests.git"
|
||||||
|
|
||||||
func defaultPrepare(t *testing.T, r e2e.Runnable) {
|
func defaultPrepare(t *testing.T, r e2e.Runnable) {
|
||||||
execShouldNoError(t, r,
|
execShouldNoError(t, r,
|
||||||
|
|||||||
49
e2e-tests/issue_94_twice_build_test.go
Normal file
49
e2e-tests/issue_94_twice_build_test.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// ALR - Any Linux Repository
|
||||||
|
// Copyright (C) 2025 The ALR Authors
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
//go:build e2e
|
||||||
|
|
||||||
|
package e2etests_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/efficientgo/e2e"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestE2EIssue94TwiceBuild(t *testing.T) {
|
||||||
|
dockerMultipleRun(
|
||||||
|
t,
|
||||||
|
"issue-94-twice-build",
|
||||||
|
COMMON_SYSTEMS,
|
||||||
|
func(t *testing.T, r e2e.Runnable) {
|
||||||
|
defaultPrepare(t, r)
|
||||||
|
|
||||||
|
var stderr bytes.Buffer
|
||||||
|
err := r.Exec(
|
||||||
|
e2e.NewCommand("sudo", "alr", "in", "test-94-app"),
|
||||||
|
e2e.WithExecOptionStderr(&stderr),
|
||||||
|
)
|
||||||
|
assert.NoError(t, err, "command failed")
|
||||||
|
|
||||||
|
output := stderr.String()
|
||||||
|
assert.Equal(t, 1, strings.Count(output, "Building package name=test-94-dep"))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
2
gen.go
2
gen.go
@@ -25,7 +25,7 @@ import (
|
|||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/gen"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/gen"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GenCmd() *cli.Command {
|
func GenCmd() *cli.Command {
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ import (
|
|||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func InstallCmd() *cli.Command {
|
func InstallCmd() *cli.Command {
|
||||||
@@ -98,7 +98,7 @@ func InstallCmd() *cli.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = builder.InstallPkgs(
|
_, err = builder.InstallPkgs(
|
||||||
ctx,
|
ctx,
|
||||||
&build.BuildArgs{
|
&build.BuildArgs{
|
||||||
Opts: &types.BuildOpts{
|
Opts: &types.BuildOpts{
|
||||||
|
|||||||
@@ -32,14 +32,14 @@ import (
|
|||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/constants"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/constants"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"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/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func InternalBuildCmd() *cli.Command {
|
func InternalBuildCmd() *cli.Command {
|
||||||
|
|||||||
@@ -27,15 +27,14 @@ import (
|
|||||||
"log/slog"
|
"log/slog"
|
||||||
|
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"mvdan.cc/sh/v3/syntax"
|
|
||||||
"mvdan.cc/sh/v3/syntax/typedjson"
|
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"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/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BuildInput struct {
|
type BuildInput struct {
|
||||||
@@ -133,50 +132,29 @@ type RepositoryProvider interface {
|
|||||||
|
|
||||||
// ================================================
|
// ================================================
|
||||||
|
|
||||||
type ScriptFile struct {
|
type BuiltDep struct {
|
||||||
File *syntax.File
|
Name string
|
||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptFile) GobEncode() ([]byte, error) {
|
func Map[T, R any](items []T, f func(T) R) []R {
|
||||||
var buf bytes.Buffer
|
res := make([]R, len(items))
|
||||||
enc := gob.NewEncoder(&buf)
|
for i, item := range items {
|
||||||
if err := enc.Encode(s.Path); err != nil {
|
res[i] = f(item)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
var fileBuf bytes.Buffer
|
return res
|
||||||
if err := typedjson.Encode(&fileBuf, s.File); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
fileData := fileBuf.Bytes()
|
|
||||||
if err := enc.Encode(fileData); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return buf.Bytes(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptFile) GobDecode(data []byte) error {
|
func GetBuiltPaths(deps []*BuiltDep) []string {
|
||||||
buf := bytes.NewBuffer(data)
|
return Map(deps, func(dep *BuiltDep) string {
|
||||||
dec := gob.NewDecoder(buf)
|
return dep.Path
|
||||||
if err := dec.Decode(&s.Path); err != nil {
|
})
|
||||||
return err
|
|
||||||
}
|
|
||||||
var fileData []byte
|
|
||||||
if err := dec.Decode(&fileData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fileReader := bytes.NewReader(fileData)
|
|
||||||
file, err := typedjson.Decode(fileReader)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
s.File = file.(*syntax.File)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type BuildResult struct {
|
func GetBuiltName(deps []*BuiltDep) []string {
|
||||||
PackagePaths []string
|
return Map(deps, func(dep *BuiltDep) string {
|
||||||
PackageNames []string
|
return dep.Name
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type PackageFinder interface {
|
type PackageFinder interface {
|
||||||
@@ -199,8 +177,8 @@ type ScriptResolverExecutor interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ScriptExecutor interface {
|
type ScriptExecutor interface {
|
||||||
ReadScript(ctx context.Context, scriptPath string) (*ScriptFile, error)
|
ReadScript(ctx context.Context, scriptPath string) (*alrsh.ALRSh, error)
|
||||||
ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *ScriptFile) (string, []*types.BuildVars, error)
|
ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *alrsh.ALRSh) (string, []*types.BuildVars, error)
|
||||||
PrepareDirs(
|
PrepareDirs(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
@@ -209,12 +187,12 @@ type ScriptExecutor interface {
|
|||||||
ExecuteSecondPass(
|
ExecuteSecondPass(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
sf *ScriptFile,
|
sf *alrsh.ALRSh,
|
||||||
varsOfPackages []*types.BuildVars,
|
varsOfPackages []*types.BuildVars,
|
||||||
repoDeps []string,
|
repoDeps []string,
|
||||||
builtNames []string,
|
builtDeps []*BuiltDep,
|
||||||
basePkg string,
|
basePkg string,
|
||||||
) (*SecondPassResult, error)
|
) ([]*BuiltDep, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type CacheExecutor interface {
|
type CacheExecutor interface {
|
||||||
@@ -222,7 +200,7 @@ type CacheExecutor interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ScriptViewerExecutor interface {
|
type ScriptViewerExecutor interface {
|
||||||
ViewScript(ctx context.Context, input *BuildInput, sf *ScriptFile, basePkg string) error
|
ViewScript(ctx context.Context, input *BuildInput, sf *alrsh.ALRSh, basePkg string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type CheckerExecutor interface {
|
type CheckerExecutor interface {
|
||||||
@@ -320,7 +298,7 @@ type BuildPackageFromScriptArgs struct {
|
|||||||
func (b *Builder) BuildPackageFromDb(
|
func (b *Builder) BuildPackageFromDb(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
args *BuildPackageFromDbArgs,
|
args *BuildPackageFromDbArgs,
|
||||||
) (*BuildResult, error) {
|
) ([]*BuiltDep, error) {
|
||||||
scriptInfo := b.scriptResolver.ResolveScript(ctx, args.Package)
|
scriptInfo := b.scriptResolver.ResolveScript(ctx, args.Package)
|
||||||
|
|
||||||
return b.BuildPackage(ctx, &BuildInput{
|
return b.BuildPackage(ctx, &BuildInput{
|
||||||
@@ -336,7 +314,7 @@ func (b *Builder) BuildPackageFromDb(
|
|||||||
func (b *Builder) BuildPackageFromScript(
|
func (b *Builder) BuildPackageFromScript(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
args *BuildPackageFromScriptArgs,
|
args *BuildPackageFromScriptArgs,
|
||||||
) (*BuildResult, error) {
|
) ([]*BuiltDep, error) {
|
||||||
return b.BuildPackage(ctx, &BuildInput{
|
return b.BuildPackage(ctx, &BuildInput{
|
||||||
script: args.Script,
|
script: args.Script,
|
||||||
repository: "default",
|
repository: "default",
|
||||||
@@ -350,7 +328,7 @@ func (b *Builder) BuildPackageFromScript(
|
|||||||
func (b *Builder) BuildPackage(
|
func (b *Builder) BuildPackage(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
) (*BuildResult, error) {
|
) ([]*BuiltDep, error) {
|
||||||
scriptPath := input.script
|
scriptPath := input.script
|
||||||
|
|
||||||
slog.Debug("ReadScript")
|
slog.Debug("ReadScript")
|
||||||
@@ -365,7 +343,7 @@ func (b *Builder) BuildPackage(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
builtPaths := make([]string, 0)
|
var builtDeps []*BuiltDep
|
||||||
|
|
||||||
if !input.opts.Clean {
|
if !input.opts.Clean {
|
||||||
var remainingVars []*types.BuildVars
|
var remainingVars []*types.BuildVars
|
||||||
@@ -375,14 +353,16 @@ func (b *Builder) BuildPackage(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if ok {
|
if ok {
|
||||||
builtPaths = append(builtPaths, builtPkgPath)
|
builtDeps = append(builtDeps, &BuiltDep{
|
||||||
|
Path: builtPkgPath,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
remainingVars = append(remainingVars, vars)
|
remainingVars = append(remainingVars, vars)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(remainingVars) == 0 {
|
if len(remainingVars) == 0 {
|
||||||
return &BuildResult{builtPaths, nil}, nil
|
return builtDeps, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,19 +407,32 @@ func (b *Builder) BuildPackage(
|
|||||||
sources, checksums = removeDuplicatesSources(sources, checksums)
|
sources, checksums = removeDuplicatesSources(sources, checksums)
|
||||||
|
|
||||||
slog.Debug("installBuildDeps")
|
slog.Debug("installBuildDeps")
|
||||||
err = b.installBuildDeps(ctx, input, buildDepends)
|
alrBuildDeps, err := b.installBuildDeps(ctx, input, buildDepends)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
slog.Debug("installOptDeps")
|
slog.Debug("installOptDeps")
|
||||||
err = b.installOptDeps(ctx, input, optDepends)
|
_, err = b.installOptDeps(ctx, input, optDepends)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
depNames := make(map[string]struct{})
|
||||||
|
for _, dep := range alrBuildDeps {
|
||||||
|
depNames[dep.Name] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We filter so as not to re-build what has already been built at the `installBuildDeps` stage.
|
||||||
|
var filteredDepends []string
|
||||||
|
for _, d := range depends {
|
||||||
|
if _, found := depNames[d]; !found {
|
||||||
|
filteredDepends = append(filteredDepends, d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
slog.Debug("BuildALRDeps")
|
slog.Debug("BuildALRDeps")
|
||||||
builtPaths, builtNames, repoDeps, err := b.BuildALRDeps(ctx, input, depends)
|
newBuiltDeps, repoDeps, err := b.BuildALRDeps(ctx, input, filteredDepends)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -450,8 +443,6 @@ func (b *Builder) BuildPackage(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// builtPaths = append(builtPaths, newBuildPaths...)
|
|
||||||
|
|
||||||
slog.Info(gotext.Get("Downloading sources"))
|
slog.Info(gotext.Get("Downloading sources"))
|
||||||
slog.Debug("DownloadSources")
|
slog.Debug("DownloadSources")
|
||||||
err = b.sourceExecutor.DownloadSources(
|
err = b.sourceExecutor.DownloadSources(
|
||||||
@@ -467,6 +458,8 @@ func (b *Builder) BuildPackage(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
builtDeps = removeDuplicates(append(builtDeps, newBuiltDeps...))
|
||||||
|
|
||||||
slog.Debug("ExecuteSecondPass")
|
slog.Debug("ExecuteSecondPass")
|
||||||
res, err := b.scriptExecutor.ExecuteSecondPass(
|
res, err := b.scriptExecutor.ExecuteSecondPass(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -474,20 +467,16 @@ func (b *Builder) BuildPackage(
|
|||||||
sf,
|
sf,
|
||||||
varsOfPackages,
|
varsOfPackages,
|
||||||
repoDeps,
|
repoDeps,
|
||||||
builtNames,
|
builtDeps,
|
||||||
basePkg,
|
basePkg,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pkgPaths := removeDuplicates(append(builtPaths, res.BuiltPaths...))
|
builtDeps = removeDuplicates(append(builtDeps, res...))
|
||||||
pkgNames := removeDuplicates(append(builtNames, res.BuiltNames...))
|
|
||||||
|
|
||||||
return &BuildResult{
|
return builtDeps, nil
|
||||||
PackagePaths: pkgPaths,
|
|
||||||
PackageNames: pkgNames,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type InstallPkgsArgs struct {
|
type InstallPkgsArgs struct {
|
||||||
@@ -523,7 +512,7 @@ func (b *Builder) InstallALRPackages(
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = b.installerExecutor.InstallLocal(
|
err = b.installerExecutor.InstallLocal(
|
||||||
res.PackagePaths,
|
GetBuiltPaths(res),
|
||||||
&manager.Opts{
|
&manager.Opts{
|
||||||
NoConfirm: !input.BuildOpts().Interactive,
|
NoConfirm: !input.BuildOpts().Interactive,
|
||||||
},
|
},
|
||||||
@@ -544,13 +533,13 @@ func (b *Builder) BuildALRDeps(
|
|||||||
PkgFormatProvider
|
PkgFormatProvider
|
||||||
},
|
},
|
||||||
depends []string,
|
depends []string,
|
||||||
) (builtPaths, builtNames, repoDeps []string, err error) {
|
) (buildDeps []*BuiltDep, repoDeps []string, err error) {
|
||||||
if len(depends) > 0 {
|
if len(depends) > 0 {
|
||||||
slog.Info(gotext.Get("Installing dependencies"))
|
slog.Info(gotext.Get("Installing dependencies"))
|
||||||
|
|
||||||
found, notFound, err := b.repos.FindPkgs(ctx, depends) // Поиск зависимостей
|
found, notFound, err := b.repos.FindPkgs(ctx, depends) // Поиск зависимостей
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
repoDeps = notFound
|
repoDeps = notFound
|
||||||
|
|
||||||
@@ -597,20 +586,17 @@ func (b *Builder) BuildALRDeps(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
builtPaths = append(builtPaths, res.PackagePaths...)
|
buildDeps = append(buildDeps, res...)
|
||||||
builtNames = append(builtNames, res.PackageNames...)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Удаляем возможные дубликаты, которые могут быть введены, если
|
|
||||||
// несколько зависимостей зависят от одних и тех же пакетов.
|
|
||||||
repoDeps = removeDuplicates(repoDeps)
|
repoDeps = removeDuplicates(repoDeps)
|
||||||
builtPaths = removeDuplicates(builtPaths)
|
buildDeps = removeDuplicates(buildDeps)
|
||||||
builtNames = removeDuplicates(builtNames)
|
|
||||||
return builtPaths, builtNames, repoDeps, nil
|
return buildDeps, repoDeps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Builder) installBuildDeps(
|
func (i *Builder) installBuildDeps(
|
||||||
@@ -621,19 +607,20 @@ func (i *Builder) installBuildDeps(
|
|||||||
PkgFormatProvider
|
PkgFormatProvider
|
||||||
},
|
},
|
||||||
pkgs []string,
|
pkgs []string,
|
||||||
) error {
|
) ([]*BuiltDep, error) {
|
||||||
|
var builtDeps []*BuiltDep
|
||||||
if len(pkgs) > 0 {
|
if len(pkgs) > 0 {
|
||||||
deps, err := i.installerExecutor.RemoveAlreadyInstalled(pkgs)
|
deps, err := i.installerExecutor.RemoveAlreadyInstalled(pkgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = i.InstallPkgs(ctx, input, deps) // Устанавливаем выбранные пакеты
|
builtDeps, err = i.InstallPkgs(ctx, input, deps) // Устанавливаем выбранные пакеты
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return builtDeps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Builder) installOptDeps(
|
func (i *Builder) installOptDeps(
|
||||||
@@ -644,10 +631,11 @@ func (i *Builder) installOptDeps(
|
|||||||
PkgFormatProvider
|
PkgFormatProvider
|
||||||
},
|
},
|
||||||
pkgs []string,
|
pkgs []string,
|
||||||
) error {
|
) ([]*BuiltDep, error) {
|
||||||
|
var builtDeps []*BuiltDep
|
||||||
optDeps, err := i.installerExecutor.RemoveAlreadyInstalled(pkgs)
|
optDeps, err := i.installerExecutor.RemoveAlreadyInstalled(pkgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(optDeps) > 0 {
|
if len(optDeps) > 0 {
|
||||||
optDeps, err := cliutils.ChooseOptDepends(
|
optDeps, err := cliutils.ChooseOptDepends(
|
||||||
@@ -657,19 +645,19 @@ func (i *Builder) installOptDeps(
|
|||||||
input.BuildOpts().Interactive,
|
input.BuildOpts().Interactive,
|
||||||
) // Пользователя просят выбрать опциональные зависимости
|
) // Пользователя просят выбрать опциональные зависимости
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(optDeps) == 0 {
|
if len(optDeps) == 0 {
|
||||||
return nil
|
return builtDeps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err = i.InstallPkgs(ctx, input, optDeps) // Устанавливаем выбранные пакеты
|
builtDeps, err = i.InstallPkgs(ctx, input, optDeps) // Устанавливаем выбранные пакеты
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return builtDeps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Builder) InstallPkgs(
|
func (i *Builder) InstallPkgs(
|
||||||
@@ -680,18 +668,18 @@ func (i *Builder) InstallPkgs(
|
|||||||
PkgFormatProvider
|
PkgFormatProvider
|
||||||
},
|
},
|
||||||
pkgs []string,
|
pkgs []string,
|
||||||
) error {
|
) ([]*BuiltDep, error) {
|
||||||
builtPaths, _, repoDeps, err := i.BuildALRDeps(ctx, input, pkgs)
|
builtDeps, repoDeps, err := i.BuildALRDeps(ctx, input, pkgs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(builtPaths) > 0 {
|
if len(builtDeps) > 0 {
|
||||||
err = i.installerExecutor.InstallLocal(builtPaths, &manager.Opts{
|
err = i.installerExecutor.InstallLocal(GetBuiltPaths(builtDeps), &manager.Opts{
|
||||||
NoConfirm: !input.BuildOpts().Interactive,
|
NoConfirm: !input.BuildOpts().Interactive,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,9 +688,9 @@ func (i *Builder) InstallPkgs(
|
|||||||
NoConfirm: !input.BuildOpts().Interactive,
|
NoConfirm: !input.BuildOpts().Interactive,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return builtDeps, nil
|
||||||
}
|
}
|
||||||
@@ -28,9 +28,9 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestPackageFinder struct {
|
type TestPackageFinder struct {
|
||||||
@@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Cache struct {
|
type Cache struct {
|
||||||
@@ -24,8 +24,8 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Checker struct {
|
type Checker struct {
|
||||||
@@ -19,7 +19,7 @@ package build
|
|||||||
import (
|
import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BaseDirProvider interface {
|
type BaseDirProvider interface {
|
||||||
@@ -27,7 +27,7 @@ import (
|
|||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func rpmFindDependenciesALTLinux(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories, command string, envs []string, updateFunc func(string)) error {
|
func rpmFindDependenciesALTLinux(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories, command string, envs []string, updateFunc func(string)) error {
|
||||||
@@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EmptyFindProvReq struct{}
|
type EmptyFindProvReq struct{}
|
||||||
@@ -28,7 +28,7 @@ import (
|
|||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FedoraFindProvReq struct{}
|
type FedoraFindProvReq struct{}
|
||||||
@@ -21,8 +21,8 @@ import (
|
|||||||
|
|
||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProvReqFinder interface {
|
type ProvReqFinder interface {
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
package build
|
package build
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewInstaller(mgr manager.Manager) *Installer {
|
func NewInstaller(mgr manager.Manager) *Installer {
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
package build
|
package build
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewMainBuilder(
|
func NewMainBuilder(
|
||||||
@@ -28,7 +28,7 @@ import (
|
|||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
type InstallerPlugin struct {
|
type InstallerPlugin struct {
|
||||||
@@ -28,7 +28,8 @@ import (
|
|||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
var HandshakeConfig = plugin.HandshakeConfig{
|
var HandshakeConfig = plugin.HandshakeConfig{
|
||||||
@@ -50,13 +51,13 @@ type ScriptExecutorRPCServer struct {
|
|||||||
// ReadScript
|
// ReadScript
|
||||||
//
|
//
|
||||||
|
|
||||||
func (s *ScriptExecutorRPC) ReadScript(ctx context.Context, scriptPath string) (*ScriptFile, error) {
|
func (s *ScriptExecutorRPC) ReadScript(ctx context.Context, scriptPath string) (*alrsh.ALRSh, error) {
|
||||||
var resp *ScriptFile
|
var resp *alrsh.ALRSh
|
||||||
err := s.client.Call("Plugin.ReadScript", scriptPath, &resp)
|
err := s.client.Call("Plugin.ReadScript", scriptPath, &resp)
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptExecutorRPCServer) ReadScript(scriptPath string, resp *ScriptFile) error {
|
func (s *ScriptExecutorRPCServer) ReadScript(scriptPath string, resp *alrsh.ALRSh) error {
|
||||||
file, err := s.Impl.ReadScript(context.Background(), scriptPath)
|
file, err := s.Impl.ReadScript(context.Background(), scriptPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -72,7 +73,7 @@ func (s *ScriptExecutorRPCServer) ReadScript(scriptPath string, resp *ScriptFile
|
|||||||
|
|
||||||
type ExecuteFirstPassArgs struct {
|
type ExecuteFirstPassArgs struct {
|
||||||
Input *BuildInput
|
Input *BuildInput
|
||||||
Sf *ScriptFile
|
Sf *alrsh.ALRSh
|
||||||
}
|
}
|
||||||
|
|
||||||
type ExecuteFirstPassResp struct {
|
type ExecuteFirstPassResp struct {
|
||||||
@@ -80,7 +81,7 @@ type ExecuteFirstPassResp struct {
|
|||||||
VarsOfPackages []*types.BuildVars
|
VarsOfPackages []*types.BuildVars
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptExecutorRPC) ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *ScriptFile) (string, []*types.BuildVars, error) {
|
func (s *ScriptExecutorRPC) ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *alrsh.ALRSh) (string, []*types.BuildVars, error) {
|
||||||
var resp *ExecuteFirstPassResp
|
var resp *ExecuteFirstPassResp
|
||||||
err := s.client.Call("Plugin.ExecuteFirstPass", &ExecuteFirstPassArgs{
|
err := s.client.Call("Plugin.ExecuteFirstPass", &ExecuteFirstPassArgs{
|
||||||
Input: input,
|
Input: input,
|
||||||
@@ -148,29 +149,29 @@ func (s *ScriptExecutorRPCServer) PrepareDirs(args *PrepareDirsArgs, reply *stru
|
|||||||
|
|
||||||
type ExecuteSecondPassArgs struct {
|
type ExecuteSecondPassArgs struct {
|
||||||
Input *BuildInput
|
Input *BuildInput
|
||||||
Sf *ScriptFile
|
Sf *alrsh.ALRSh
|
||||||
VarsOfPackages []*types.BuildVars
|
VarsOfPackages []*types.BuildVars
|
||||||
RepoDeps []string
|
RepoDeps []string
|
||||||
BuiltNames []string
|
BuiltDeps []*BuiltDep
|
||||||
BasePkg string
|
BasePkg string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptExecutorRPC) ExecuteSecondPass(
|
func (s *ScriptExecutorRPC) ExecuteSecondPass(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
sf *ScriptFile,
|
sf *alrsh.ALRSh,
|
||||||
varsOfPackages []*types.BuildVars,
|
varsOfPackages []*types.BuildVars,
|
||||||
repoDeps []string,
|
repoDeps []string,
|
||||||
builtNames []string,
|
builtDeps []*BuiltDep,
|
||||||
basePkg string,
|
basePkg string,
|
||||||
) (*SecondPassResult, error) {
|
) ([]*BuiltDep, error) {
|
||||||
var resp *SecondPassResult
|
var resp []*BuiltDep
|
||||||
err := s.client.Call("Plugin.ExecuteSecondPass", &ExecuteSecondPassArgs{
|
err := s.client.Call("Plugin.ExecuteSecondPass", &ExecuteSecondPassArgs{
|
||||||
Input: input,
|
Input: input,
|
||||||
Sf: sf,
|
Sf: sf,
|
||||||
VarsOfPackages: varsOfPackages,
|
VarsOfPackages: varsOfPackages,
|
||||||
RepoDeps: repoDeps,
|
RepoDeps: repoDeps,
|
||||||
BuiltNames: builtNames,
|
BuiltDeps: builtDeps,
|
||||||
BasePkg: basePkg,
|
BasePkg: basePkg,
|
||||||
}, &resp)
|
}, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -179,20 +180,20 @@ func (s *ScriptExecutorRPC) ExecuteSecondPass(
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScriptExecutorRPCServer) ExecuteSecondPass(args *ExecuteSecondPassArgs, resp *SecondPassResult) error {
|
func (s *ScriptExecutorRPCServer) ExecuteSecondPass(args *ExecuteSecondPassArgs, resp *[]*BuiltDep) error {
|
||||||
res, err := s.Impl.ExecuteSecondPass(
|
res, err := s.Impl.ExecuteSecondPass(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
args.Input,
|
args.Input,
|
||||||
args.Sf,
|
args.Sf,
|
||||||
args.VarsOfPackages,
|
args.VarsOfPackages,
|
||||||
args.RepoDeps,
|
args.RepoDeps,
|
||||||
args.BuiltNames,
|
args.BuiltDeps,
|
||||||
args.BasePkg,
|
args.BasePkg,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
*resp = *res
|
*resp = res
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,7 +19,6 @@ package build
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
@@ -36,12 +35,12 @@ import (
|
|||||||
"mvdan.cc/sh/v3/interp"
|
"mvdan.cc/sh/v3/interp"
|
||||||
"mvdan.cc/sh/v3/syntax"
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
|
||||||
|
finddeps "gitea.plemya-x.ru/Plemya-x/ALR/internal/build/find_deps"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/helpers"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/helpers"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
|
||||||
finddeps "gitea.plemya-x.ru/Plemya-x/ALR/pkg/build/find_deps"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type LocalScriptExecutor struct {
|
type LocalScriptExecutor struct {
|
||||||
@@ -54,107 +53,12 @@ func NewLocalScriptExecutor(cfg Config) *LocalScriptExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *LocalScriptExecutor) ReadScript(ctx context.Context, scriptPath string) (*ScriptFile, error) {
|
func (e *LocalScriptExecutor) ReadScript(ctx context.Context, scriptPath string) (*alrsh.ALRSh, error) {
|
||||||
fl, err := readScript(scriptPath)
|
return alrsh.ReadFromLocal(scriptPath)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &ScriptFile{
|
|
||||||
Path: scriptPath,
|
|
||||||
File: fl,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *LocalScriptExecutor) ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *ScriptFile) (string, []*types.BuildVars, error) {
|
func (e *LocalScriptExecutor) ExecuteFirstPass(ctx context.Context, input *BuildInput, sf *alrsh.ALRSh) (string, []*types.BuildVars, error) {
|
||||||
varsOfPackages := []*types.BuildVars{}
|
return sf.ParseBuildVars(ctx, input.info, input.packages)
|
||||||
|
|
||||||
scriptDir := filepath.Dir(sf.Path)
|
|
||||||
env := createBuildEnvVars(input.info, types.Directories{ScriptDir: scriptDir})
|
|
||||||
|
|
||||||
runner, err := interp.New(
|
|
||||||
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
|
||||||
interp.StdIO(os.Stdin, os.Stderr, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
|
||||||
interp.ExecHandler(helpers.Restricted.ExecHandler(handlers.NopExec)), // Ограничиваем выполнение
|
|
||||||
interp.ReadDirHandler2(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий
|
|
||||||
interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов
|
|
||||||
interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов
|
|
||||||
interp.Dir(scriptDir),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = runner.Run(ctx, sf.File) // Запускаем скрипт
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dec := decoder.New(input.info, runner) // Создаём новый декодер
|
|
||||||
|
|
||||||
type packages struct {
|
|
||||||
BasePkgName string `sh:"basepkg_name"`
|
|
||||||
Names []string `sh:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var pkgs packages
|
|
||||||
err = dec.DecodeVars(&pkgs)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(pkgs.Names) == 0 {
|
|
||||||
return "", nil, errors.New("package name is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
var vars types.BuildVars
|
|
||||||
|
|
||||||
if len(pkgs.Names) == 1 {
|
|
||||||
err = dec.DecodeVars(&vars) // Декодируем переменные
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
varsOfPackages = append(varsOfPackages, &vars)
|
|
||||||
|
|
||||||
return vars.Name, varsOfPackages, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var pkgNames []string
|
|
||||||
|
|
||||||
if len(input.packages) != 0 {
|
|
||||||
pkgNames = input.packages
|
|
||||||
} else {
|
|
||||||
pkgNames = pkgs.Names
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pkgName := range pkgNames {
|
|
||||||
var preVars types.BuildVarsPre
|
|
||||||
funcName := fmt.Sprintf("meta_%s", pkgName)
|
|
||||||
meta, ok := dec.GetFuncWithSubshell(funcName)
|
|
||||||
if !ok {
|
|
||||||
return "", nil, fmt.Errorf("func %s is missing", funcName)
|
|
||||||
}
|
|
||||||
r, err := meta(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
d := decoder.New(&distro.OSRelease{}, r)
|
|
||||||
err = d.DecodeVars(&preVars)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
vars := preVars.ToBuildVars()
|
|
||||||
vars.Name = pkgName
|
|
||||||
vars.Base = pkgs.BasePkgName
|
|
||||||
|
|
||||||
varsOfPackages = append(varsOfPackages, &vars)
|
|
||||||
}
|
|
||||||
|
|
||||||
return pkgs.BasePkgName, varsOfPackages, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type SecondPassResult struct {
|
|
||||||
BuiltPaths []string
|
|
||||||
BuiltNames []string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *LocalScriptExecutor) PrepareDirs(
|
func (e *LocalScriptExecutor) PrepareDirs(
|
||||||
@@ -182,13 +86,13 @@ func (e *LocalScriptExecutor) PrepareDirs(
|
|||||||
func (e *LocalScriptExecutor) ExecuteSecondPass(
|
func (e *LocalScriptExecutor) ExecuteSecondPass(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
sf *ScriptFile,
|
sf *alrsh.ALRSh,
|
||||||
varsOfPackages []*types.BuildVars,
|
varsOfPackages []*types.BuildVars,
|
||||||
repoDeps []string,
|
repoDeps []string,
|
||||||
builtNames []string,
|
builtDeps []*BuiltDep,
|
||||||
basePkg string,
|
basePkg string,
|
||||||
) (*SecondPassResult, error) {
|
) ([]*BuiltDep, error) {
|
||||||
dirs, err := getDirs(e.cfg, sf.Path, basePkg)
|
dirs, err := getDirs(e.cfg, sf.Path(), basePkg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -206,14 +110,14 @@ func (e *LocalScriptExecutor) ExecuteSecondPass(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = runner.Run(ctx, sf.File)
|
err = runner.Run(ctx, sf.File())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
dec := decoder.New(input.info, runner)
|
dec := decoder.New(input.info, runner)
|
||||||
|
|
||||||
var builtPaths []string
|
// var builtPaths []string
|
||||||
|
|
||||||
err = e.ExecuteFunctions(ctx, dirs, dec)
|
err = e.ExecuteFunctions(ctx, dirs, dec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -247,7 +151,7 @@ func (e *LocalScriptExecutor) ExecuteSecondPass(
|
|||||||
dirs,
|
dirs,
|
||||||
append(
|
append(
|
||||||
repoDeps,
|
repoDeps,
|
||||||
builtNames...,
|
GetBuiltName(builtDeps)...,
|
||||||
),
|
),
|
||||||
funcOut.Contents,
|
funcOut.Contents,
|
||||||
)
|
)
|
||||||
@@ -273,14 +177,13 @@ func (e *LocalScriptExecutor) ExecuteSecondPass(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
builtPaths = append(builtPaths, pkgPath)
|
builtDeps = append(builtDeps, &BuiltDep{
|
||||||
builtNames = append(builtNames, vars.Name)
|
Name: vars.Name,
|
||||||
|
Path: pkgPath,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return &SecondPassResult{
|
return builtDeps, nil
|
||||||
BuiltPaths: builtPaths,
|
|
||||||
BuiltNames: builtNames,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildPkgMetadata(
|
func buildPkgMetadata(
|
||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/alrsh"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ScriptViewerConfig interface {
|
type ScriptViewerConfig interface {
|
||||||
@@ -33,12 +34,12 @@ type ScriptViewer struct {
|
|||||||
func (s *ScriptViewer) ViewScript(
|
func (s *ScriptViewer) ViewScript(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *BuildInput,
|
input *BuildInput,
|
||||||
sf *ScriptFile,
|
a *alrsh.ALRSh,
|
||||||
basePkg string,
|
basePkg string,
|
||||||
) error {
|
) error {
|
||||||
return cliutils.PromptViewScript(
|
return cliutils.PromptViewScript(
|
||||||
ctx,
|
ctx,
|
||||||
sf.Path,
|
a.Path(),
|
||||||
basePkg,
|
basePkg,
|
||||||
s.config.PagerStyle(),
|
s.config.PagerStyle(),
|
||||||
input.opts.Interactive,
|
input.opts.Interactive,
|
||||||
@@ -33,34 +33,17 @@ import (
|
|||||||
_ "github.com/goreleaser/nfpm/v2/arch"
|
_ "github.com/goreleaser/nfpm/v2/arch"
|
||||||
_ "github.com/goreleaser/nfpm/v2/deb"
|
_ "github.com/goreleaser/nfpm/v2/deb"
|
||||||
_ "github.com/goreleaser/nfpm/v2/rpm"
|
_ "github.com/goreleaser/nfpm/v2/rpm"
|
||||||
"mvdan.cc/sh/v3/syntax"
|
|
||||||
|
|
||||||
"github.com/goreleaser/nfpm/v2"
|
"github.com/goreleaser/nfpm/v2"
|
||||||
"github.com/goreleaser/nfpm/v2/files"
|
"github.com/goreleaser/nfpm/v2/files"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
|
||||||
|
"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/internal/overrides"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Функция readScript анализирует скрипт сборки с использованием встроенной реализации bash
|
|
||||||
func readScript(script string) (*syntax.File, error) {
|
|
||||||
fl, err := os.Open(script) // Открываем файл скрипта
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer fl.Close() // Закрываем файл после выполнения
|
|
||||||
|
|
||||||
file, err := syntax.NewParser().Parse(fl, "alr.sh") // Парсим скрипт с помощью синтаксического анализатора
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return file, nil // Возвращаем синтаксическое дерево
|
|
||||||
}
|
|
||||||
|
|
||||||
// Функция prepareDirs подготавливает директории для сборки.
|
// Функция prepareDirs подготавливает директории для сборки.
|
||||||
func prepareDirs(dirs types.Directories) error {
|
func prepareDirs(dirs types.Directories) error {
|
||||||
err := os.RemoveAll(dirs.BaseDir) // Удаляем базовую директорию, если она существует
|
err := os.RemoveAll(dirs.BaseDir) // Удаляем базовую директорию, если она существует
|
||||||
@@ -288,14 +271,14 @@ func packageNames(pkgs []db.Package) []string {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Функция removeDuplicates убирает любые дубликаты из предоставленного среза.
|
// Функция removeDuplicates убирает любые дубликаты из предоставленного среза.
|
||||||
func removeDuplicates(slice []string) []string {
|
func removeDuplicates[T comparable](slice []T) []T {
|
||||||
seen := map[string]struct{}{}
|
seen := map[T]struct{}{}
|
||||||
result := []string{}
|
result := []T{}
|
||||||
|
|
||||||
for _, s := range slice {
|
for _, item := range slice {
|
||||||
if _, ok := seen[s]; !ok {
|
if _, ok := seen[item]; !ok {
|
||||||
seen[s] = struct{}{}
|
seen[item] = struct{}{}
|
||||||
result = append(result, s)
|
result = append(result, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,9 +26,9 @@ import (
|
|||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/repos"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AppDeps struct {
|
type AppDeps struct {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import (
|
|||||||
"github.com/pelletier/go-toml/v2"
|
"github.com/pelletier/go-toml/v2"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/constants"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/constants"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ALRConfig struct {
|
type ALRConfig struct {
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/repos"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFindPkgs(t *testing.T) {
|
func TestFindPkgs(t *testing.T) {
|
||||||
@@ -41,7 +41,7 @@ func TestFindPkgs(t *testing.T) {
|
|||||||
err := rs.Pull(e.Ctx, []types.Repo{
|
err := rs.Pull(e.Ctx, []types.Repo{
|
||||||
{
|
{
|
||||||
Name: "default",
|
Name: "default",
|
||||||
URL: "https://gitea.plemya-x.ru/xpamych/xpamych-alr-repo.git",
|
URL: "https://gitea.plemya-x.ru/Plemya-x/alr-default.git",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -44,7 +44,7 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type actionType uint8
|
type actionType uint8
|
||||||
@@ -27,7 +27,7 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestALRConfig struct{}
|
type TestALRConfig struct{}
|
||||||
@@ -28,8 +28,8 @@ import (
|
|||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/repos"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestEnv struct {
|
type TestEnv struct {
|
||||||
@@ -19,7 +19,7 @@ package repos
|
|||||||
import (
|
import (
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config interface {
|
type Config interface {
|
||||||
@@ -35,10 +35,10 @@ import (
|
|||||||
"mvdan.cc/sh/v3/syntax"
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/parser"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/parser"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// isValid makes sure the path of the file being updated is valid.
|
// isValid makes sure the path of the file being updated is valid.
|
||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/search"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSearhOptionsBuilder(t *testing.T) {
|
func TestSearhOptionsBuilder(t *testing.T) {
|
||||||
@@ -178,6 +178,68 @@ msgstr ""
|
|||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/build.go:375
|
||||||
|
msgid "Building package"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/build.go:404
|
||||||
|
msgid "The checksums array must be the same length as sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/build.go:446
|
||||||
|
msgid "Downloading sources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/build.go:538
|
||||||
|
msgid "Installing dependencies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/checker.go:43
|
||||||
|
msgid ""
|
||||||
|
"Your system's CPU architecture doesn't match this package. Do you want to "
|
||||||
|
"build anyway?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/checker.go:67
|
||||||
|
msgid "This package is already installed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:35
|
||||||
|
msgid "Command not found on the system"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:86
|
||||||
|
msgid "Provided dependency found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:93
|
||||||
|
msgid "Required dependency found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/find_deps/empty.go:32
|
||||||
|
msgid "AutoProv is not implemented for this package format, so it's skipped"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/find_deps/empty.go:37
|
||||||
|
msgid "AutoReq is not implemented for this package format, so it's skipped"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:145
|
||||||
|
msgid "Building package metadata"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:275
|
||||||
|
msgid "Executing prepare()"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:284
|
||||||
|
msgid "Executing build()"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:313 internal/build/script_executor.go:333
|
||||||
|
msgid "Executing %s()"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: internal/cliutils/app_builder/builder.go:75
|
#: internal/cliutils/app_builder/builder.go:75
|
||||||
msgid "Error loading config"
|
msgid "Error loading config"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -321,6 +383,24 @@ msgstr ""
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:77
|
||||||
|
msgid "Pulling repository"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:113
|
||||||
|
msgid "Repository up to date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:204
|
||||||
|
msgid "Git repository does not appear to be a valid ALR repo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:220
|
||||||
|
msgid ""
|
||||||
|
"ALR repo's minimum ALR version is greater than the current version. Try "
|
||||||
|
"updating ALR if something doesn't work."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:97
|
#: internal/utils/cmd.go:97
|
||||||
msgid "Error on dropping capabilities"
|
msgid "Error on dropping capabilities"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -377,86 +457,6 @@ msgstr ""
|
|||||||
msgid "Error while running app"
|
msgid "Error while running app"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pkg/build/build.go:395
|
|
||||||
msgid "Building package"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/build.go:424
|
|
||||||
msgid "The checksums array must be the same length as sources"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/build.go:455
|
|
||||||
msgid "Downloading sources"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/build.go:549
|
|
||||||
msgid "Installing dependencies"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/checker.go:43
|
|
||||||
msgid ""
|
|
||||||
"Your system's CPU architecture doesn't match this package. Do you want to "
|
|
||||||
"build anyway?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/checker.go:67
|
|
||||||
msgid "This package is already installed"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:35
|
|
||||||
msgid "Command not found on the system"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:86
|
|
||||||
msgid "Provided dependency found"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:93
|
|
||||||
msgid "Required dependency found"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/empty.go:32
|
|
||||||
msgid "AutoProv is not implemented for this package format, so it's skipped"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/empty.go:37
|
|
||||||
msgid "AutoReq is not implemented for this package format, so it's skipped"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:241
|
|
||||||
msgid "Building package metadata"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:372
|
|
||||||
msgid "Executing prepare()"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:381
|
|
||||||
msgid "Executing build()"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:410 pkg/build/script_executor.go:430
|
|
||||||
msgid "Executing %s()"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:77
|
|
||||||
msgid "Pulling repository"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:113
|
|
||||||
msgid "Repository up to date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:204
|
|
||||||
msgid "Git repository does not appear to be a valid ALR repo"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:220
|
|
||||||
msgid ""
|
|
||||||
"ALR repo's minimum ALR version is greater than the current version. Try "
|
|
||||||
"updating ALR if something doesn't work."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: refresh.go:30
|
#: refresh.go:30
|
||||||
msgid "Pull all repositories that have changed"
|
msgid "Pull all repositories that have changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ msgstr ""
|
|||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||||
"X-Generator: Gtranslator 48.0\n"
|
"X-Generator: Gtranslator 48.0\n"
|
||||||
|
|
||||||
#: build.go:42
|
#: build.go:42
|
||||||
@@ -185,6 +185,72 @@ msgstr "Для команды remove ожидался хотя бы 1 аргум
|
|||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr "Ошибка при удалении пакетов"
|
msgstr "Ошибка при удалении пакетов"
|
||||||
|
|
||||||
|
#: internal/build/build.go:375
|
||||||
|
msgid "Building package"
|
||||||
|
msgstr "Сборка пакета"
|
||||||
|
|
||||||
|
#: internal/build/build.go:404
|
||||||
|
msgid "The checksums array must be the same length as sources"
|
||||||
|
msgstr "Массив контрольных сумм должен быть той же длины, что и источники"
|
||||||
|
|
||||||
|
#: internal/build/build.go:446
|
||||||
|
msgid "Downloading sources"
|
||||||
|
msgstr "Скачивание источников"
|
||||||
|
|
||||||
|
#: internal/build/build.go:538
|
||||||
|
msgid "Installing dependencies"
|
||||||
|
msgstr "Установка зависимостей"
|
||||||
|
|
||||||
|
#: internal/build/checker.go:43
|
||||||
|
msgid ""
|
||||||
|
"Your system's CPU architecture doesn't match this package. Do you want to "
|
||||||
|
"build anyway?"
|
||||||
|
msgstr ""
|
||||||
|
"Архитектура процессора вашей системы не соответствует этому пакету. Вы все "
|
||||||
|
"равно хотите выполнить сборку?"
|
||||||
|
|
||||||
|
#: internal/build/checker.go:67
|
||||||
|
msgid "This package is already installed"
|
||||||
|
msgstr "Этот пакет уже установлен"
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:35
|
||||||
|
msgid "Command not found on the system"
|
||||||
|
msgstr "Команда не найдена в системе"
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:86
|
||||||
|
msgid "Provided dependency found"
|
||||||
|
msgstr "Найденная предоставленная зависимость"
|
||||||
|
|
||||||
|
#: internal/build/find_deps/alt_linux.go:93
|
||||||
|
msgid "Required dependency found"
|
||||||
|
msgstr "Найдена требуемая зависимость"
|
||||||
|
|
||||||
|
#: internal/build/find_deps/empty.go:32
|
||||||
|
msgid "AutoProv is not implemented for this package format, so it's skipped"
|
||||||
|
msgstr ""
|
||||||
|
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
|
||||||
|
|
||||||
|
#: internal/build/find_deps/empty.go:37
|
||||||
|
msgid "AutoReq is not implemented for this package format, so it's skipped"
|
||||||
|
msgstr ""
|
||||||
|
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:145
|
||||||
|
msgid "Building package metadata"
|
||||||
|
msgstr "Сборка метаданных пакета"
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:275
|
||||||
|
msgid "Executing prepare()"
|
||||||
|
msgstr "Выполнение prepare()"
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:284
|
||||||
|
msgid "Executing build()"
|
||||||
|
msgstr "Выполнение build()"
|
||||||
|
|
||||||
|
#: internal/build/script_executor.go:313 internal/build/script_executor.go:333
|
||||||
|
msgid "Executing %s()"
|
||||||
|
msgstr "Выполнение %s()"
|
||||||
|
|
||||||
#: internal/cliutils/app_builder/builder.go:75
|
#: internal/cliutils/app_builder/builder.go:75
|
||||||
msgid "Error loading config"
|
msgid "Error loading config"
|
||||||
msgstr "Ошибка при загрузке"
|
msgstr "Ошибка при загрузке"
|
||||||
@@ -290,8 +356,8 @@ msgid ""
|
|||||||
"This command is deprecated and would be removed in the future, use \"%s\" "
|
"This command is deprecated and would be removed in the future, use \"%s\" "
|
||||||
"instead!"
|
"instead!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Эта команда устарела и будет удалена в будущем, используйте вместо нее "
|
"Эта команда устарела и будет удалена в будущем, используйте вместо нее \"%s"
|
||||||
"\"%s\"!"
|
"\"!"
|
||||||
|
|
||||||
#: internal/db/db.go:137
|
#: internal/db/db.go:137
|
||||||
msgid "Database version mismatch; resetting"
|
msgid "Database version mismatch; resetting"
|
||||||
@@ -331,6 +397,26 @@ msgstr "%s %s загружается — %s/с\n"
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr "ОШИБКА"
|
msgstr "ОШИБКА"
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:77
|
||||||
|
msgid "Pulling repository"
|
||||||
|
msgstr "Скачивание репозитория"
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:113
|
||||||
|
msgid "Repository up to date"
|
||||||
|
msgstr "Репозиторий уже обновлён"
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:204
|
||||||
|
msgid "Git repository does not appear to be a valid ALR repo"
|
||||||
|
msgstr "Репозиторий Git не поддерживается репозиторием ALR"
|
||||||
|
|
||||||
|
#: internal/repos/pull.go:220
|
||||||
|
msgid ""
|
||||||
|
"ALR repo's minimum ALR version is greater than the current version. Try "
|
||||||
|
"updating ALR if something doesn't work."
|
||||||
|
msgstr ""
|
||||||
|
"Минимальная версия ALR для ALR-репозитория выше текущей версии. Попробуйте "
|
||||||
|
"обновить ALR, если что-то не работает."
|
||||||
|
|
||||||
#: internal/utils/cmd.go:97
|
#: internal/utils/cmd.go:97
|
||||||
msgid "Error on dropping capabilities"
|
msgid "Error on dropping capabilities"
|
||||||
msgstr "Ошибка при понижении привилегий"
|
msgstr "Ошибка при понижении привилегий"
|
||||||
@@ -387,92 +473,6 @@ msgstr "Показать справку"
|
|||||||
msgid "Error while running app"
|
msgid "Error while running app"
|
||||||
msgstr "Ошибка при запуске приложения"
|
msgstr "Ошибка при запуске приложения"
|
||||||
|
|
||||||
#: pkg/build/build.go:395
|
|
||||||
msgid "Building package"
|
|
||||||
msgstr "Сборка пакета"
|
|
||||||
|
|
||||||
#: pkg/build/build.go:424
|
|
||||||
msgid "The checksums array must be the same length as sources"
|
|
||||||
msgstr "Массив контрольных сумм должен быть той же длины, что и источники"
|
|
||||||
|
|
||||||
#: pkg/build/build.go:455
|
|
||||||
msgid "Downloading sources"
|
|
||||||
msgstr "Скачивание источников"
|
|
||||||
|
|
||||||
#: pkg/build/build.go:549
|
|
||||||
msgid "Installing dependencies"
|
|
||||||
msgstr "Установка зависимостей"
|
|
||||||
|
|
||||||
#: pkg/build/checker.go:43
|
|
||||||
msgid ""
|
|
||||||
"Your system's CPU architecture doesn't match this package. Do you want to "
|
|
||||||
"build anyway?"
|
|
||||||
msgstr ""
|
|
||||||
"Архитектура процессора вашей системы не соответствует этому пакету. Вы все "
|
|
||||||
"равно хотите выполнить сборку?"
|
|
||||||
|
|
||||||
#: pkg/build/checker.go:67
|
|
||||||
msgid "This package is already installed"
|
|
||||||
msgstr "Этот пакет уже установлен"
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:35
|
|
||||||
msgid "Command not found on the system"
|
|
||||||
msgstr "Команда не найдена в системе"
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:86
|
|
||||||
msgid "Provided dependency found"
|
|
||||||
msgstr "Найденная предоставленная зависимость"
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/alt_linux.go:93
|
|
||||||
msgid "Required dependency found"
|
|
||||||
msgstr "Найдена требуемая зависимость"
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/empty.go:32
|
|
||||||
msgid "AutoProv is not implemented for this package format, so it's skipped"
|
|
||||||
msgstr ""
|
|
||||||
"AutoProv не реализовано для этого формата пакета, поэтому будет пропущено"
|
|
||||||
|
|
||||||
#: pkg/build/find_deps/empty.go:37
|
|
||||||
msgid "AutoReq is not implemented for this package format, so it's skipped"
|
|
||||||
msgstr ""
|
|
||||||
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:241
|
|
||||||
msgid "Building package metadata"
|
|
||||||
msgstr "Сборка метаданных пакета"
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:372
|
|
||||||
msgid "Executing prepare()"
|
|
||||||
msgstr "Выполнение prepare()"
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:381
|
|
||||||
msgid "Executing build()"
|
|
||||||
msgstr "Выполнение build()"
|
|
||||||
|
|
||||||
#: pkg/build/script_executor.go:410 pkg/build/script_executor.go:430
|
|
||||||
msgid "Executing %s()"
|
|
||||||
msgstr "Выполнение %s()"
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:77
|
|
||||||
msgid "Pulling repository"
|
|
||||||
msgstr "Скачивание репозитория"
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:113
|
|
||||||
msgid "Repository up to date"
|
|
||||||
msgstr "Репозиторий уже обновлён"
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:204
|
|
||||||
msgid "Git repository does not appear to be a valid ALR repo"
|
|
||||||
msgstr "Репозиторий Git не поддерживается репозиторием ALR"
|
|
||||||
|
|
||||||
#: pkg/repos/pull.go:220
|
|
||||||
msgid ""
|
|
||||||
"ALR repo's minimum ALR version is greater than the current version. Try "
|
|
||||||
"updating ALR if something doesn't work."
|
|
||||||
msgstr ""
|
|
||||||
"Минимальная версия ALR для ALR-репозитория выше текущей версии. Попробуйте "
|
|
||||||
"обновить ALR, если что-то не работает."
|
|
||||||
|
|
||||||
#: refresh.go:30
|
#: refresh.go:30
|
||||||
msgid "Pull all repositories that have changed"
|
msgid "Pull all repositories that have changed"
|
||||||
msgstr "Скачать все изменённые репозитории"
|
msgstr "Скачать все изменённые репозитории"
|
||||||
|
|||||||
4
list.go
4
list.go
@@ -29,12 +29,12 @@ import (
|
|||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/manager"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ListCmd() *cli.Command {
|
func ListCmd() *cli.Command {
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -33,8 +33,8 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
|
"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/translations"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -52,9 +52,9 @@
|
|||||||
./internal/translations/files/lure.en.toml
|
./internal/translations/files/lure.en.toml
|
||||||
./internal/translations/files/lure.ru.toml
|
./internal/translations/files/lure.ru.toml
|
||||||
./internal/translations/translations.go
|
./internal/translations/translations.go
|
||||||
./internal/types/build.go
|
./pkg/types/build.go
|
||||||
./internal/types/config.go
|
./pkg/types/config.go
|
||||||
./internal/types/repo.go
|
./pkg/types/repo.go
|
||||||
./list.go
|
./list.go
|
||||||
./main.go
|
./main.go
|
||||||
./pkg/build/build.go
|
./pkg/build/build.go
|
||||||
|
|||||||
168
pkg/alrsh/alrsh.go
Normal file
168
pkg/alrsh/alrsh.go
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
// ALR - Any Linux Repository
|
||||||
|
// Copyright (C) 2025 The ALR Authors
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
package alrsh
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"mvdan.cc/sh/v3/expand"
|
||||||
|
"mvdan.cc/sh/v3/interp"
|
||||||
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/decoder"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/helpers"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ALRSh struct {
|
||||||
|
file *syntax.File
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func createBuildEnvVars(info *distro.OSRelease, dirs types.Directories) []string {
|
||||||
|
env := os.Environ()
|
||||||
|
|
||||||
|
env = append(
|
||||||
|
env,
|
||||||
|
"DISTRO_NAME="+info.Name,
|
||||||
|
"DISTRO_PRETTY_NAME="+info.PrettyName,
|
||||||
|
"DISTRO_ID="+info.ID,
|
||||||
|
"DISTRO_VERSION_ID="+info.VersionID,
|
||||||
|
"DISTRO_ID_LIKE="+strings.Join(info.Like, " "),
|
||||||
|
"ARCH="+cpu.Arch(),
|
||||||
|
"NCPU="+strconv.Itoa(runtime.NumCPU()),
|
||||||
|
)
|
||||||
|
|
||||||
|
if dirs.ScriptDir != "" {
|
||||||
|
env = append(env, "scriptdir="+dirs.ScriptDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
if dirs.PkgDir != "" {
|
||||||
|
env = append(env, "pkgdir="+dirs.PkgDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
if dirs.SrcDir != "" {
|
||||||
|
env = append(env, "srcdir="+dirs.SrcDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
return env
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ALRSh) ParseBuildVars(ctx context.Context, info *distro.OSRelease, packages []string) (string, []*types.BuildVars, error) {
|
||||||
|
varsOfPackages := []*types.BuildVars{}
|
||||||
|
|
||||||
|
scriptDir := filepath.Dir(s.path)
|
||||||
|
env := createBuildEnvVars(info, types.Directories{ScriptDir: scriptDir})
|
||||||
|
|
||||||
|
runner, err := interp.New(
|
||||||
|
interp.Env(expand.ListEnviron(env...)), // Устанавливаем окружение
|
||||||
|
interp.StdIO(os.Stdin, os.Stderr, os.Stderr), // Устанавливаем стандартный ввод-вывод
|
||||||
|
interp.ExecHandler(helpers.Restricted.ExecHandler(handlers.NopExec)), // Ограничиваем выполнение
|
||||||
|
interp.ReadDirHandler2(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий
|
||||||
|
interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов
|
||||||
|
interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов
|
||||||
|
interp.Dir(scriptDir),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = runner.Run(ctx, s.file) // Запускаем скрипт
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dec := decoder.New(info, runner) // Создаём новый декодер
|
||||||
|
|
||||||
|
type Packages struct {
|
||||||
|
BasePkgName string `sh:"basepkg_name"`
|
||||||
|
Names []string `sh:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var pkgs Packages
|
||||||
|
err = dec.DecodeVars(&pkgs)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pkgs.Names) == 0 {
|
||||||
|
return "", nil, errors.New("package name is missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
var vars types.BuildVars
|
||||||
|
|
||||||
|
if len(pkgs.Names) == 1 {
|
||||||
|
err = dec.DecodeVars(&vars)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
varsOfPackages = append(varsOfPackages, &vars)
|
||||||
|
|
||||||
|
return vars.Name, varsOfPackages, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var pkgNames []string
|
||||||
|
|
||||||
|
if len(packages) != 0 {
|
||||||
|
pkgNames = packages
|
||||||
|
} else {
|
||||||
|
pkgNames = pkgs.Names
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pkgName := range pkgNames {
|
||||||
|
var preVars types.BuildVarsPre
|
||||||
|
funcName := fmt.Sprintf("meta_%s", pkgName)
|
||||||
|
meta, ok := dec.GetFuncWithSubshell(funcName)
|
||||||
|
if !ok {
|
||||||
|
return "", nil, fmt.Errorf("func %s is missing", funcName)
|
||||||
|
}
|
||||||
|
r, err := meta(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
d := decoder.New(&distro.OSRelease{}, r)
|
||||||
|
err = d.DecodeVars(&preVars)
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
vars := preVars.ToBuildVars()
|
||||||
|
vars.Name = pkgName
|
||||||
|
vars.Base = pkgs.BasePkgName
|
||||||
|
|
||||||
|
varsOfPackages = append(varsOfPackages, &vars)
|
||||||
|
}
|
||||||
|
|
||||||
|
return pkgs.BasePkgName, varsOfPackages, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *ALRSh) Path() string {
|
||||||
|
return a.path
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *ALRSh) File() *syntax.File {
|
||||||
|
return a.file
|
||||||
|
}
|
||||||
61
pkg/alrsh/gob.go
Normal file
61
pkg/alrsh/gob.go
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// ALR - Any Linux Repository
|
||||||
|
// Copyright (C) 2025 The ALR Authors
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
package alrsh
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/gob"
|
||||||
|
|
||||||
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
"mvdan.cc/sh/v3/syntax/typedjson"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *ALRSh) GobEncode() ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
enc := gob.NewEncoder(&buf)
|
||||||
|
if err := enc.Encode(s.path); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var fileBuf bytes.Buffer
|
||||||
|
if err := typedjson.Encode(&fileBuf, s.file); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fileData := fileBuf.Bytes()
|
||||||
|
if err := enc.Encode(fileData); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ALRSh) GobDecode(data []byte) error {
|
||||||
|
buf := bytes.NewBuffer(data)
|
||||||
|
dec := gob.NewDecoder(buf)
|
||||||
|
if err := dec.Decode(&s.path); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var fileData []byte
|
||||||
|
if err := dec.Decode(&fileData); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fileReader := bytes.NewReader(fileData)
|
||||||
|
file, err := typedjson.Decode(fileReader)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.file = file.(*syntax.File)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
52
pkg/alrsh/read.go
Normal file
52
pkg/alrsh/read.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// ALR - Any Linux Repository
|
||||||
|
// Copyright (C) 2025 The ALR Authors
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
package alrsh
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
)
|
||||||
|
|
||||||
|
type localFs struct{}
|
||||||
|
|
||||||
|
func (fs *localFs) Open(name string) (fs.File, error) {
|
||||||
|
return os.Open(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadFromFS(fsys fs.FS, script string) (*ALRSh, error) {
|
||||||
|
fl, err := fsys.Open(script)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open alr.sh: %w", err)
|
||||||
|
}
|
||||||
|
defer fl.Close()
|
||||||
|
|
||||||
|
file, err := syntax.NewParser().Parse(fl, "alr.sh")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ALRSh{
|
||||||
|
file: file,
|
||||||
|
path: script,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadFromLocal(script string) (*ALRSh, error) {
|
||||||
|
return ReadFromFS(&localFs{}, script)
|
||||||
|
}
|
||||||
66
pkg/types/script.go
Normal file
66
pkg/types/script.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
// ALR - Any Linux Repository
|
||||||
|
// Copyright (C) 2025 The ALR Authors
|
||||||
|
//
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/gob"
|
||||||
|
|
||||||
|
"mvdan.cc/sh/v3/syntax"
|
||||||
|
"mvdan.cc/sh/v3/syntax/typedjson"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ScriptFile struct {
|
||||||
|
File *syntax.File
|
||||||
|
Path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ScriptFile) GobEncode() ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
enc := gob.NewEncoder(&buf)
|
||||||
|
if err := enc.Encode(s.Path); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var fileBuf bytes.Buffer
|
||||||
|
if err := typedjson.Encode(&fileBuf, s.File); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fileData := fileBuf.Bytes()
|
||||||
|
if err := enc.Encode(fileData); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ScriptFile) GobDecode(data []byte) error {
|
||||||
|
buf := bytes.NewBuffer(data)
|
||||||
|
dec := gob.NewDecoder(buf)
|
||||||
|
if err := dec.Decode(&s.Path); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var fileData []byte
|
||||||
|
if err := dec.Decode(&fileData); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fileReader := bytes.NewReader(fileData)
|
||||||
|
file, err := typedjson.Decode(fileReader)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.File = file.(*syntax.File)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
2
repo.go
2
repo.go
@@ -29,8 +29,8 @@ import (
|
|||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RepoCmd() *cli.Command {
|
func RepoCmd() *cli.Command {
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ installPkg() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
pacman) $rootCmd pacman --noconfirm -U ${@:2} ;;
|
pacman) $rootCmd pacman --noconfirm -U "${@:2}" ;;
|
||||||
apk) $rootCmd apk add --allow-untrusted ${@:2} ;;
|
apk) $rootCmd apk add --allow-untrusted "${@:2}" ;;
|
||||||
zypper) $rootCmd zypper --no-gpg-checks install ${@:2} ;;
|
zypper) $rootCmd zypper --no-gpg-checks install "${@:2}" ;;
|
||||||
*) $rootCmd $1 install -y ${@:2} ;;
|
*) $rootCmd "$1" install -y "${@:2}" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,60 +88,51 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$noPkgMgr" ]; then
|
if [ -z "$noPkgMgr" ]; then
|
||||||
info "Получение списка файлов с https://plemya-x.ru/"
|
info "Получение списка файлов с https://gitea.plemya-x.ru/Plemya-x/ALR/releases"
|
||||||
pageContent=$(curl -s https://plemya-x.ru/?dir=alr)
|
|
||||||
|
# Изменено URL и регулярное выражение для списка файлов
|
||||||
|
pageContent=$(curl -s https://gitea.plemya-x.ru/Plemya-x/ALR/releases)
|
||||||
|
|
||||||
# Извлечение списка файлов из HTML
|
# Извлечение списка файлов из HTML
|
||||||
fileList=$(echo "$pageContent" | grep -oP '(?<=href=").*?(?=")' | grep -E 'alr-bin-.*.(pkg.tar.zst|rpm|deb)')
|
fileList=$(echo "$pageContent" | grep -oP '(?<=href=").*?(?=")' | grep -E 'alr-bin.*\.(pkg.tar.zst|rpm|deb)')
|
||||||
|
|
||||||
echo "Полученный список файлов:"
|
echo "Полученный список файлов:"
|
||||||
echo "$fileList"
|
echo "$fileList"
|
||||||
if [ "$pkgMgr" == "pacman" ]; then
|
|
||||||
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*\.pkg\.tar\.zst' | sort -V | tail -n 1)
|
if [ "$pkgMgr" == "pacman" ]; then
|
||||||
elif [ "$pkgMgr" == "apt" ]; then
|
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*\.pkg\.tar\.zst' | sort -V | tail -n 1)
|
||||||
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*\.amd64\.deb' | sort -V | tail -n 1)
|
elif [ "$pkgMgr" == "apt" ]; then
|
||||||
elif [[ "$pkgMgr" == "dnf" || "$pkgMgr" == "yum" || "$pkgMgr" == "zypper" ]]; then
|
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*\.amd64\.deb' | sort -V | tail -n 1)
|
||||||
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*\.x86_64\.rpm' | grep -v 'alt1' | sort -V | tail -n 1)
|
elif [[ "$pkgMgr" == "dnf" || "$pkgMgr" == "yum" || "$pkgMgr" == "zypper" ]]; then
|
||||||
elif [ "$pkgMgr" == "apt-get" ]; then
|
latestFile=$(printf "%s\n" "${fileList[@]}" | grep -E 'alr-bin-.*\.x86_64\.rpm' | grep -v 'alt[0-9]*' | sort -V | tail -n 1)
|
||||||
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*-alt[0-9]+\.x86_64\.rpm' | sort -V | tail -n 1)
|
elif [ "$pkgMgr" == "apt-get" ]; then
|
||||||
|
latestFile=$(echo "$fileList" | grep -E 'alr-bin-.*-alt[0-9]+\.x86_64\.rpm' | sort -V | tail -n 1)
|
||||||
|
else
|
||||||
|
error "Не поддерживаемый менеджер пакетов для автоматической установки"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$latestFile" ]; then
|
||||||
|
error "Не удалось найти соответствующий пакет для $pkgMgr"
|
||||||
|
fi
|
||||||
|
|
||||||
|
info "Найдена последняя версия ALR: $latestFile"
|
||||||
|
|
||||||
|
fname="$(mktemp -u -p /tmp "alr.XXXXXXXXXX").${pkgFormat}"
|
||||||
|
|
||||||
|
info "Загрузка пакета ALR"
|
||||||
|
curl -o $fname -L "$latestFile"
|
||||||
|
|
||||||
|
if [ ! -f "$fname" ]; then
|
||||||
|
error "Ошибка загрузки пакета ALR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
info "Установка пакета ALR"
|
||||||
|
installPkg "$pkgMgr" "$fname"
|
||||||
|
|
||||||
|
info "Очистка"
|
||||||
|
rm "$fname"
|
||||||
|
|
||||||
|
info "Готово!"
|
||||||
else
|
else
|
||||||
error "Не поддерживаемый менеджер пакетов для автоматической установки"
|
echo "Не найден поддерживаемый менеджер пакетов. О_о"
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$latestFile" ]; then
|
|
||||||
error "Не удалось найти соответствующий пакет для $pkgMgr"
|
|
||||||
fi
|
|
||||||
|
|
||||||
info "Найдена последняя версия ALR: $latestFile"
|
|
||||||
|
|
||||||
url="https://plemya-x.ru/$latestFile"
|
|
||||||
fname="$(mktemp -u -p /tmp "alr.XXXXXXXXXX").${pkgFormat}"
|
|
||||||
|
|
||||||
info "Загрузка пакета ALR"
|
|
||||||
curl -L $url -o $fname
|
|
||||||
|
|
||||||
if [ ! -f "$fname" ]; then
|
|
||||||
error "Ошибка загрузки пакета ALR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
info "Установка пакета ALR"
|
|
||||||
installPkg $pkgMgr $fname
|
|
||||||
|
|
||||||
info "Очистка"
|
|
||||||
rm $fname
|
|
||||||
|
|
||||||
info "Готово!"
|
|
||||||
|
|
||||||
else
|
|
||||||
info "Клонирование репозитория ALR"
|
|
||||||
git clone https://gitea.plemya-x.ru/xpamych/ALR.git /tmp/alr
|
|
||||||
|
|
||||||
info "Установка ALR"
|
|
||||||
cd /tmp/alr
|
|
||||||
sudo make install
|
|
||||||
|
|
||||||
info "Очистка репозитория ALR"
|
|
||||||
rm -rf /tmp/alr
|
|
||||||
|
|
||||||
info "Все задачи выполнены!"
|
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import (
|
|||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/search"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func SearchCmd() *cli.Command {
|
func SearchCmd() *cli.Command {
|
||||||
|
|||||||
@@ -29,16 +29,16 @@ import (
|
|||||||
"go.elara.ws/vercmp"
|
"go.elara.ws/vercmp"
|
||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/build"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
|
||||||
|
"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/internal/overrides"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/search"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/types"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/search"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func UpgradeCmd() *cli.Command {
|
func UpgradeCmd() *cli.Command {
|
||||||
|
|||||||
Reference in New Issue
Block a user