chore: replace old logger with new

This commit is contained in:
Maxim Slipenko 2025-01-22 16:37:16 +03:00
parent ac35b4d71d
commit a6076b1253
22 changed files with 707 additions and 221 deletions

@ -64,4 +64,5 @@ fmt:
i18n:
$(XGOTEXT_BIN) --output ./internal/translations/default.pot
msguniq --use-first -o ./internal/translations/default.pot ./internal/translations/default.pot
msgmerge --backup=off -U ./internal/translations/po/ru/default.po ./internal/translations/default.pot

@ -20,16 +20,17 @@
package main
import (
"log/slog"
"os"
"path/filepath"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
"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/pkg/build"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -57,7 +58,6 @@ var buildCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
script := c.String("script")
if c.String("package") != "" {
@ -66,12 +66,14 @@ var buildCmd = &cli.Command{
err := repos.Pull(ctx, config.Config(ctx).Repos)
if err != nil {
log.Fatal("Error pulling repositories").Err(err).Send()
slog.Error(gotext.Get("Error pulling repositories"), "err", err)
os.Exit(1)
}
mgr := manager.Detect()
if mgr == nil {
log.Fatal("Unable to detect a supported package manager on the system").Send()
slog.Error(gotext.Get("Unable to detect a supported package manager on the system"))
os.Exit(1)
}
pkgPaths, _, err := build.BuildPackage(ctx, types.BuildOpts{
@ -81,19 +83,22 @@ var buildCmd = &cli.Command{
Interactive: c.Bool("interactive"),
})
if err != nil {
log.Fatal("Error building package").Err(err).Send()
slog.Error(gotext.Get("Error building package"), "err", err)
os.Exit(1)
}
wd, err := os.Getwd()
if err != nil {
log.Fatal("Error getting working directory").Err(err).Send()
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
for _, pkgPath := range pkgPaths {
name := filepath.Base(pkgPath)
err = osutils.Move(pkgPath, filepath.Join(wd, name))
if err != nil {
log.Fatal("Error moving the package").Err(err).Send()
slog.Error(gotext.Get("Error moving the package"), "err", err)
os.Exit(1)
}
}

19
fix.go

@ -20,13 +20,14 @@
package main
import (
"log/slog"
"os"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"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/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -35,31 +36,33 @@ var fixCmd = &cli.Command{
Usage: "Attempt to fix problems with ALR",
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
db.Close()
paths := config.GetPaths(ctx)
log.Info("Removing cache directory").Send()
slog.Info(gotext.Get("Removing cache directory"))
err := os.RemoveAll(paths.CacheDir)
if err != nil {
log.Fatal("Unable to remove cache directory").Err(err).Send()
slog.Error(gotext.Get("Unable to remove cache directory"), "err", err)
os.Exit(1)
}
log.Info("Rebuilding cache").Send()
slog.Info(gotext.Get("Rebuilding cache"))
err = os.MkdirAll(paths.CacheDir, 0o755)
if err != nil {
log.Fatal("Unable to create new cache directory").Err(err).Send()
slog.Error(gotext.Get("Unable to create new cache directory"), "err", err)
os.Exit(1)
}
err = repos.Pull(ctx, config.Config(ctx).Repos)
if err != nil {
log.Fatal("Error pulling repos").Err(err).Send()
slog.Error(gotext.Get("Error pulling repos"), "err", err)
os.Exit(1)
}
log.Info("Done").Send()
slog.Info(gotext.Get("Done"))
return nil
},

@ -21,9 +21,11 @@ package main
import (
"fmt"
"log/slog"
"os"
"strings"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"mvdan.cc/sh/v3/expand"
"mvdan.cc/sh/v3/interp"
@ -31,7 +33,6 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cpu"
"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/loggerctx"
)
var helperCmd = &cli.Command{
@ -49,7 +50,6 @@ var helperCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
if c.Args().Len() < 1 {
cli.ShowSubcommandHelpAndExit(c, 1)
@ -57,17 +57,20 @@ var helperCmd = &cli.Command{
helper, ok := helpers.Helpers[c.Args().First()]
if !ok {
log.Fatal("No such helper command").Str("name", c.Args().First()).Send()
slog.Error(gotext.Get("No such helper command"), "name", c.Args().First())
os.Exit(1)
}
wd, err := os.Getwd()
if err != nil {
log.Fatal("Error getting working directory").Err(err).Send()
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
info, err := distro.ParseOSRelease(ctx)
if err != nil {
log.Fatal("Error getting working directory").Err(err).Send()
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
hc := interp.HandlerContext{

@ -21,7 +21,10 @@ package main
import (
"fmt"
"log/slog"
"os"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
@ -29,7 +32,6 @@ import (
"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/build"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -47,26 +49,29 @@ var installCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
args := c.Args()
if args.Len() < 1 {
log.Fatalf("Command install expected at least 1 argument, got %d", args.Len()).Send()
slog.Error(gotext.Get("Command install expected at least 1 argument, got %d", args.Len()))
os.Exit(1)
}
mgr := manager.Detect()
if mgr == nil {
log.Fatal("Unable to detect a supported package manager on the system").Send()
slog.Error(gotext.Get("Unable to detect a supported package manager on the system"))
os.Exit(1)
}
err := repos.Pull(ctx, config.Config(ctx).Repos)
if err != nil {
log.Fatal("Error pulling repositories").Err(err).Send()
slog.Error(gotext.Get("Error pulling repositories"), "err", err)
os.Exit(1)
}
found, notFound, err := repos.FindPkgs(ctx, args.Slice())
if err != nil {
log.Fatal("Error finding packages").Err(err).Send()
slog.Error(gotext.Get("Error finding packages"), "err", err)
os.Exit(1)
}
pkgs := cliutils.FlattenPkgs(ctx, found, "install", c.Bool("interactive"))
@ -78,10 +83,10 @@ var installCmd = &cli.Command{
return nil
},
BashComplete: func(c *cli.Context) {
log := loggerctx.From(c.Context)
result, err := db.GetPkgs(c.Context, "true")
if err != nil {
log.Fatal("Error getting packages").Err(err).Send()
slog.Error(gotext.Get("Error getting packages"), "err", err)
os.Exit(1)
}
defer result.Close()
@ -89,7 +94,8 @@ var installCmd = &cli.Command{
var pkg db.Package
err = result.StructScan(&pkg)
if err != nil {
log.Fatal("Error iterating over packages").Err(err).Send()
slog.Error(gotext.Get("Error iterating over packages"), "err", err)
os.Exit(1)
}
fmt.Println(pkg.Name)
@ -102,21 +108,22 @@ var removeCmd = &cli.Command{
Usage: "Remove an installed package",
Aliases: []string{"rm"},
Action: func(c *cli.Context) error {
log := loggerctx.From(c.Context)
args := c.Args()
if args.Len() < 1 {
log.Fatalf("Command remove expected at least 1 argument, got %d", args.Len()).Send()
slog.Error(gotext.Get("Command remove expected at least 1 argument, got %d", args.Len()))
os.Exit(1)
}
mgr := manager.Detect()
if mgr == nil {
log.Fatal("Unable to detect a supported package manager on the system").Send()
slog.Error(gotext.Get("Unable to detect a supported package manager on the system"))
os.Exit(1)
}
err := mgr.Remove(nil, c.Args().Slice()...)
if err != nil {
log.Fatal("Error removing packages").Err(err).Send()
slog.Error(gotext.Get("Error removing packages"), "err", err)
os.Exit(1)
}
return nil

@ -21,16 +21,17 @@ package cliutils
import (
"context"
"log/slog"
"os"
"strings"
"github.com/AlecAivazis/survey/v2"
"github.com/leonelquinteros/gotext"
"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/pager"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/translations"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
// YesNoPrompt asks the user a yes or no question, using def as the default answer
@ -54,8 +55,6 @@ func YesNoPrompt(ctx context.Context, msg string, interactive, def bool) (bool,
// shows it if they answer yes, then asks if they'd still like to
// continue, and exits if they answer no.
func PromptViewScript(ctx context.Context, script, name, style string, interactive bool) error {
log := loggerctx.From(ctx)
if !interactive {
return nil
}
@ -78,7 +77,8 @@ func PromptViewScript(ctx context.Context, script, name, style string, interacti
}
if !cont {
log.Fatal(translations.Translator(ctx).TranslateTo("User chose not to continue after reading script", config.Language(ctx))).Send()
slog.Error(gotext.Get("User chose not to continue after reading script"))
os.Exit(1)
}
}
@ -106,13 +106,13 @@ func ShowScript(path, name, style string) error {
// FlattenPkgs attempts to flatten the a map of slices of packages into a single slice
// of packages by prompting the user if multiple packages match.
func FlattenPkgs(ctx context.Context, found map[string][]db.Package, verb string, interactive bool) []db.Package {
log := loggerctx.From(ctx)
var outPkgs []db.Package
for _, pkgs := range found {
if len(pkgs) > 1 && interactive {
choice, err := PkgPrompt(ctx, pkgs, verb, interactive)
if err != nil {
log.Fatal("Error prompting for choice of package").Send()
slog.Error(gotext.Get("Error prompting for choice of package"))
os.Exit(1)
}
outPkgs = append(outPkgs, choice)
} else if len(pkgs) == 1 || !interactive {

@ -21,13 +21,13 @@ package config
import (
"context"
"log/slog"
"os"
"strings"
"sync"
"github.com/leonelquinteros/gotext"
"golang.org/x/text/language"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
var (
@ -43,12 +43,12 @@ var (
func Language(ctx context.Context) language.Tag {
langMtx.Lock()
defer langMtx.Unlock()
log := loggerctx.From(ctx)
if !langSet {
syslang := SystemLang()
tag, err := language.Parse(syslang)
if err != nil {
log.Fatal("Error parsing system language").Err(err).Send()
slog.Error(gotext.Get("Error parsing system language"), "err", err)
os.Exit(1)
}
base, _ := tag.Base()
lang = language.Make(base.String())

@ -21,11 +21,12 @@ package db
import (
"context"
"log/slog"
"github.com/jmoiron/sqlx"
"github.com/leonelquinteros/gotext"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
// CurrentVersion is the current version of the database.
@ -94,7 +95,6 @@ func (d *Database) GetConn() *sqlx.DB {
}
func (d *Database) initDB(ctx context.Context) error {
log := loggerctx.From(ctx)
d.conn = d.conn.Unsafe()
conn := d.conn
_, err := conn.ExecContext(ctx, `
@ -128,11 +128,11 @@ func (d *Database) initDB(ctx context.Context) error {
ver, ok := d.GetVersion(ctx)
if ok && ver != CurrentVersion {
log.Warn("Database version mismatch; resetting").Int("version", ver).Int("expected", CurrentVersion).Send()
slog.Warn(gotext.Get("Database version mismatch; resetting"), "version", ver, "expected", CurrentVersion)
d.reset(ctx)
return d.initDB(ctx)
} else if !ok {
log.Warn("Database version does not exist. Run alr fix if something isn't working.").Send()
slog.Warn(gotext.Get("Database version does not exist. Run alr fix if something isn't working."), "version", ver, "expected", CurrentVersion)
return d.addVersion(ctx, CurrentVersion)
}

@ -18,12 +18,14 @@ package db
import (
"context"
"log/slog"
"os"
"sync"
"github.com/jmoiron/sqlx"
"github.com/leonelquinteros/gotext"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
// DB returns the ALR database.
@ -92,12 +94,12 @@ var (
// Deprecated: For legacy only
func GetInstance(ctx context.Context) *Database {
dbOnce.Do(func() {
log := loggerctx.From(ctx)
cfg := config.GetInstance(ctx)
database = New(cfg)
err := database.Init(ctx)
if err != nil {
log.Fatal("Error opening database").Err(err).Send()
slog.Error(gotext.Get("Error opening database"), "err", err)
os.Exit(1)
}
})
return database

@ -31,11 +31,13 @@ import (
"fmt"
"hash"
"io"
"log/slog"
"os"
"path/filepath"
"strings"
"github.com/PuerkitoBio/purell"
"github.com/leonelquinteros/gotext"
"github.com/vmihailenco/msgpack/v5"
"golang.org/x/crypto/blake2b"
"golang.org/x/crypto/blake2s"
@ -43,7 +45,6 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/dlcache"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
// Константа для имени файла манифеста кэша
@ -144,7 +145,6 @@ type UpdatingDownloader interface {
// Функция Download загружает файл или каталог с использованием указанных параметров
func Download(ctx context.Context, opts Options) (err error) {
log := loggerctx.From(ctx)
cfg := config.GetInstance(ctx)
dc := dlcache.New(cfg)
@ -166,7 +166,11 @@ func Download(ctx context.Context, opts Options) (err error) {
if ok {
var updated bool
if d, ok := d.(UpdatingDownloader); ok {
log.Info("Source can be updated, updating if required").Str("source", opts.Name).Str("downloader", d.Name()).Send()
slog.Info(
gotext.Get("Source can be updated, updating if required"),
"source", opts.Name,
"downloader", d.Name(),
)
updated, err = d.Update(Options{
Hash: opts.Hash,
@ -193,10 +197,18 @@ func Download(ctx context.Context, opts Options) (err error) {
}
if ok && !updated {
log.Info("Source found in cache and linked to destination").Str("source", opts.Name).Stringer("type", t).Send()
slog.Info(
gotext.Get("Source found in cache and linked to destination"),
"source", opts.Name,
"type", t,
)
return nil
} else if ok {
log.Info("Source updated and linked to destination").Str("source", opts.Name).Stringer("type", t).Send()
slog.Info(
gotext.Get("Source updated and linked to destination"),
"source", opts.Name,
"type", t,
)
return nil
}
} else {
@ -207,7 +219,7 @@ func Download(ctx context.Context, opts Options) (err error) {
}
}
log.Info("Downloading source").Str("source", opts.Name).Str("downloader", d.Name()).Send()
slog.Info("Downloading source", "source", opts.Name, "downloader", d.Name())
cacheDir, err = dc.New(ctx, opts.URL)
if err != nil {

@ -9,6 +9,54 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: build.go:69
msgid "Error pulling repositories"
msgstr ""
#: build.go:75
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:86
msgid "Error building package"
msgstr ""
#: build.go:92
msgid "Error getting working directory"
msgstr ""
#: build.go:100
msgid "Error moving the package"
msgstr ""
#: fix.go:43
msgid "Removing cache directory"
msgstr ""
#: fix.go:47
msgid "Unable to remove cache directory"
msgstr ""
#: fix.go:51
msgid "Rebuilding cache"
msgstr ""
#: fix.go:55
msgid "Unable to create new cache directory"
msgstr ""
#: fix.go:61
msgid "Error pulling repos"
msgstr ""
#: fix.go:65
msgid "Done"
msgstr ""
#: helper.go:60
msgid "No such helper command"
msgstr ""
#: info.go:42
msgid "Print information about a package"
msgstr ""
@ -21,10 +69,6 @@ msgstr ""
msgid "Command info expected at least 1 argument, got %d"
msgstr ""
#: info.go:65
msgid "Error pulling repositories"
msgstr ""
#: info.go:71
msgid "Error finding packages"
msgstr ""
@ -37,11 +81,38 @@ msgstr ""
msgid "Error resolving overrides"
msgstr ""
#: info.go:105
#: info.go:111
#: info.go:105 info.go:111
msgid "Error encoding script variables"
msgstr ""
#: install.go:55
msgid "Command install expected at least 1 argument, got %d"
msgstr ""
#: install.go:88
msgid "Error getting packages"
msgstr ""
#: install.go:97
msgid "Error iterating over packages"
msgstr ""
#: install.go:113
msgid "Command remove expected at least 1 argument, got %d"
msgstr ""
#: install.go:125
msgid "Error removing packages"
msgstr ""
#: internal/cliutils/prompt.go:80
msgid "User chose not to continue after reading script"
msgstr ""
#: internal/cliutils/prompt.go:114
msgid "Error prompting for choice of package"
msgstr ""
#: internal/config/config.go:63
msgid "Error opening config file, using defaults"
msgstr ""
@ -78,7 +149,179 @@ msgstr ""
msgid "Unable to create package cache directory"
msgstr ""
#: internal/config/lang.go:50
msgid "Error parsing system language"
msgstr ""
#: internal/db/db.go:131
msgid "Database version mismatch; resetting"
msgstr ""
#: internal/db/db.go:135
msgid ""
"Database version does not exist. Run alr fix if something isn't working."
msgstr ""
#: internal/db/db_legacy.go:101
msgid "Error opening database"
msgstr ""
#: internal/dl/dl.go:170
msgid "Source can be updated, updating if required"
msgstr ""
#: internal/dl/dl.go:201
msgid "Source found in cache and linked to destination"
msgstr ""
#: internal/dl/dl.go:208
msgid "Source updated and linked to destination"
msgstr ""
#: internal/logger/log.go:44
msgid "ERROR"
msgstr ""
#: internal/translations/translations.go:52
msgid "Error creating new translator"
msgstr ""
#: list.go:53
msgid "Error initialization database"
msgstr ""
#: list.go:87
msgid "Error listing installed packages"
msgstr ""
#: main.go:88
msgid ""
"Running ALR as root is forbidden as it may cause catastrophic damage to your "
"system"
msgstr ""
#: main.go:122
msgid "Error while running app"
msgstr ""
#: pkg/build/build.go:104
msgid "Failed to prompt user to view build script"
msgstr ""
#: pkg/build/build.go:108
msgid "Building package"
msgstr ""
#: pkg/build/build.go:152
msgid "Downloading sources"
msgstr ""
#: pkg/build/build.go:164
msgid "Building package metadata"
msgstr ""
#: pkg/build/build.go:186
msgid "Compressing package"
msgstr ""
#: pkg/build/build.go:323
msgid "This package is already installed"
msgstr ""
#: pkg/build/build.go:351
msgid "Installing build dependencies"
msgstr ""
#: pkg/build/build.go:393
msgid "Installing dependencies"
msgstr ""
#: pkg/build/build.go:435
msgid "Executing version()"
msgstr ""
#: pkg/build/build.go:460
msgid "Executing prepare()"
msgstr ""
#: pkg/build/build.go:470
msgid "Executing build()"
msgstr ""
#: pkg/build/build.go:482
msgid "Executing package()"
msgstr ""
#: pkg/build/build.go:557
msgid "AutoProv is not implemented for this package format, so it's skiped"
msgstr ""
#: pkg/build/build.go:568
msgid "AutoReq is not implemented for this package format, so it's skiped"
msgstr ""
#: pkg/build/build.go:759
msgid "The checksums array must be the same length as sources"
msgstr ""
#: pkg/build/findDeps.go:35
msgid "Command not found on the system"
msgstr ""
#: pkg/build/findDeps.go:82
msgid "Provided dependency found"
msgstr ""
#: pkg/build/findDeps.go:89
msgid "Required dependency found"
msgstr ""
#: pkg/build/install.go:42
msgid "Error installing native packages"
msgstr ""
#: pkg/build/install.go:79
msgid "Error installing package"
msgstr ""
#: pkg/repos/pull.go:75
msgid "Pulling repository"
msgstr ""
#: pkg/repos/pull.go:99
msgid "Repository up to date"
msgstr ""
#: pkg/repos/pull.go:156
msgid "Git repository does not appear to be a valid ALR repo"
msgstr ""
#: pkg/repos/pull.go:172
msgid ""
"ALR repo's minumum ALR version is greater than the current version. Try "
"updating ALR if something doesn't work."
msgstr ""
#: repo.go:78 repo.go:133
msgid "Error opening config file"
msgstr ""
#: repo.go:84 repo.go:139
msgid "Error encoding config"
msgstr ""
#: repo.go:125
msgid "Repo does not exist"
msgstr ""
#: repo.go:145
msgid "Error removing repo directory"
msgstr ""
#: repo.go:151
msgid "Error removing packages from database"
msgstr ""
#: upgrade.go:78
msgid "Error checking for updates"
msgstr ""

@ -3,17 +3,65 @@
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"PO-Revision-Date: 2025-01-22 14:23+0300\n"
"Last-Translator: Maxim Slipenko <maks1ms@alt-gnome.ru>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 47.1\n"
"Project-Id-Version: \n"
"Language-Team: Russian\n"
#: build.go:69
msgid "Error pulling repositories"
msgstr ""
#: build.go:75
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:86
msgid "Error building package"
msgstr ""
#: build.go:92
msgid "Error getting working directory"
msgstr ""
#: build.go:100
msgid "Error moving the package"
msgstr ""
#: fix.go:43
msgid "Removing cache directory"
msgstr ""
#: fix.go:47
msgid "Unable to remove cache directory"
msgstr ""
#: fix.go:51
msgid "Rebuilding cache"
msgstr ""
#: fix.go:55
msgid "Unable to create new cache directory"
msgstr ""
#: fix.go:61
msgid "Error pulling repos"
msgstr ""
#: fix.go:65
msgid "Done"
msgstr ""
#: helper.go:60
msgid "No such helper command"
msgstr ""
#: info.go:42
msgid "Print information about a package"
@ -27,10 +75,6 @@ msgstr "Показывать всю информацию, а не только
msgid "Command info expected at least 1 argument, got %d"
msgstr ""
#: info.go:65
msgid "Error pulling repositories"
msgstr ""
#: info.go:71
msgid "Error finding packages"
msgstr ""
@ -47,6 +91,34 @@ msgstr ""
msgid "Error encoding script variables"
msgstr ""
#: install.go:55
msgid "Command install expected at least 1 argument, got %d"
msgstr ""
#: install.go:88
msgid "Error getting packages"
msgstr ""
#: install.go:97
msgid "Error iterating over packages"
msgstr ""
#: install.go:113
msgid "Command remove expected at least 1 argument, got %d"
msgstr ""
#: install.go:125
msgid "Error removing packages"
msgstr ""
#: internal/cliutils/prompt.go:80
msgid "User chose not to continue after reading script"
msgstr ""
#: internal/cliutils/prompt.go:114
msgid "Error prompting for choice of package"
msgstr ""
#: internal/config/config.go:63
msgid "Error opening config file, using defaults"
msgstr ""
@ -83,6 +155,179 @@ msgstr ""
msgid "Unable to create package cache directory"
msgstr ""
#: internal/config/lang.go:50
msgid "Error parsing system language"
msgstr ""
#: internal/db/db.go:131
msgid "Database version mismatch; resetting"
msgstr ""
#: internal/db/db.go:135
msgid ""
"Database version does not exist. Run alr fix if something isn't working."
msgstr ""
#: internal/db/db_legacy.go:101
msgid "Error opening database"
msgstr ""
#: internal/dl/dl.go:170
msgid "Source can be updated, updating if required"
msgstr ""
#: internal/dl/dl.go:201
msgid "Source found in cache and linked to destination"
msgstr ""
#: internal/dl/dl.go:208
msgid "Source updated and linked to destination"
msgstr ""
#: internal/logger/log.go:44
msgid "ERROR"
msgstr "ОШИБКА"
#: internal/translations/translations.go:52
msgid "Error creating new translator"
msgstr ""
#: list.go:53
msgid "Error initialization database"
msgstr ""
#: list.go:87
msgid "Error listing installed packages"
msgstr ""
#: main.go:88
msgid ""
"Running ALR as root is forbidden as it may cause catastrophic damage to your "
"system"
msgstr ""
#: main.go:122
msgid "Error while running app"
msgstr ""
#: pkg/build/build.go:104
msgid "Failed to prompt user to view build script"
msgstr ""
#: pkg/build/build.go:108
msgid "Building package"
msgstr ""
#: pkg/build/build.go:152
msgid "Downloading sources"
msgstr ""
#: pkg/build/build.go:164
msgid "Building package metadata"
msgstr ""
#: pkg/build/build.go:186
msgid "Compressing package"
msgstr ""
#: pkg/build/build.go:323
msgid "This package is already installed"
msgstr ""
#: pkg/build/build.go:351
msgid "Installing build dependencies"
msgstr ""
#: pkg/build/build.go:393
msgid "Installing dependencies"
msgstr ""
#: pkg/build/build.go:435
msgid "Executing version()"
msgstr ""
#: pkg/build/build.go:460
msgid "Executing prepare()"
msgstr ""
#: pkg/build/build.go:470
msgid "Executing build()"
msgstr ""
#: pkg/build/build.go:482
msgid "Executing package()"
msgstr ""
#: pkg/build/build.go:557
msgid "AutoProv is not implemented for this package format, so it's skiped"
msgstr ""
#: pkg/build/build.go:568
msgid "AutoReq is not implemented for this package format, so it's skiped"
msgstr ""
#: pkg/build/build.go:759
msgid "The checksums array must be the same length as sources"
msgstr ""
#: pkg/build/findDeps.go:35
msgid "Command not found on the system"
msgstr ""
#: pkg/build/findDeps.go:82
msgid "Provided dependency found"
msgstr ""
#: pkg/build/findDeps.go:89
msgid "Required dependency found"
msgstr ""
#: pkg/build/install.go:42
msgid "Error installing native packages"
msgstr ""
#: pkg/build/install.go:79
msgid "Error installing package"
msgstr ""
#: pkg/repos/pull.go:75
msgid "Pulling repository"
msgstr ""
#: pkg/repos/pull.go:99
msgid "Repository up to date"
msgstr ""
#: pkg/repos/pull.go:156
msgid "Git repository does not appear to be a valid ALR repo"
msgstr ""
#: pkg/repos/pull.go:172
msgid ""
"ALR repo's minumum ALR version is greater than the current version. Try "
"updating ALR if something doesn't work."
msgstr ""
#: repo.go:78 repo.go:133
msgid "Error opening config file"
msgstr ""
#: repo.go:84 repo.go:139
msgid "Error encoding config"
msgstr ""
#: repo.go:125
msgid "Repo does not exist"
msgstr ""
#: repo.go:145
msgid "Error removing repo directory"
msgstr ""
#: repo.go:151
msgid "Error removing packages from database"
msgstr ""
#: upgrade.go:78
msgid "Error checking for updates"
msgstr ""

@ -23,6 +23,7 @@ import (
"context"
"embed"
"io/fs"
"log/slog"
"os"
"path"
"sync"
@ -32,8 +33,6 @@ import (
"go.elara.ws/logger"
"go.elara.ws/translate"
"golang.org/x/text/language"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
//go:embed files
@ -47,11 +46,11 @@ var (
func Translator(ctx context.Context) *translate.Translator {
mu.Lock()
defer mu.Unlock()
log := loggerctx.From(ctx)
if translator == nil {
t, err := translate.NewFromFS(translationFS)
if err != nil {
log.Fatal("Error creating new translator").Err(err).Send()
slog.Error(gotext.Get("Error creating new translator"), "err", err)
os.Exit(1)
}
translator = &t
}

23
list.go

@ -21,13 +21,15 @@ package main
import (
"fmt"
"log/slog"
"os"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"golang.org/x/exp/slices"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -44,17 +46,18 @@ var listCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
cfg := config.New()
db := database.New(cfg)
err := db.Init(ctx)
if err != nil {
log.Fatal("Error initialization database").Err(err).Send()
slog.Error(gotext.Get("Error initialization database"), "err", err)
os.Exit(1)
}
rs := repos.New(cfg, db)
err = rs.Pull(ctx, cfg.Repos(ctx))
if err != nil {
log.Fatal("Error pulling repositories").Err(err).Send()
slog.Error(gotext.Get("Error pulling repositories"), "err", err)
os.Exit(1)
}
where := "true"
@ -66,7 +69,8 @@ var listCmd = &cli.Command{
result, err := db.GetPkgs(ctx, where, args...)
if err != nil {
log.Fatal("Error getting packages").Err(err).Send()
slog.Error(gotext.Get("Error getting packages"), "err", err)
os.Exit(1)
}
defer result.Close()
@ -74,12 +78,14 @@ var listCmd = &cli.Command{
if c.Bool("installed") {
mgr := manager.Detect()
if mgr == nil {
log.Fatal("Unable to detect a supported package manager on the system").Send()
slog.Error(gotext.Get("Unable to detect a supported package manager on the system"))
os.Exit(1)
}
installed, err = mgr.ListInstalled(&manager.Opts{AsRoot: false})
if err != nil {
log.Fatal("Error listing installed packages").Err(err).Send()
slog.Error(gotext.Get("Error listing installed packages"), "err", err)
os.Exit(1)
}
}
@ -108,7 +114,8 @@ var listCmd = &cli.Command{
}
if err != nil {
log.Fatal("Error iterating over packages").Err(err).Send()
slog.Error(gotext.Get("Error iterating over packages"), "err", err)
os.Exit(1)
}
return nil

13
main.go

@ -21,20 +21,19 @@ package main
import (
"context"
"log/slog"
"os"
"os/signal"
"strings"
"syscall"
"github.com/leonelquinteros/gotext"
"github.com/mattn/go-isatty"
"github.com/urfave/cli/v2"
oldLogger "go.elara.ws/logger"
"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/translations"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
@ -83,11 +82,11 @@ func GetApp() *cli.App {
},
Before: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
cmd := c.Args().First()
if cmd != "helper" && !config.Config(ctx).Unsafe.AllowRunAsRoot && os.Geteuid() == 0 {
log.Fatal("Running ALR as root is forbidden as it may cause catastrophic damage to your system").Send()
slog.Error(gotext.Get("Running ALR as root is forbidden as it may cause catastrophic damage to your system"))
os.Exit(1)
}
if trimmed := strings.TrimSpace(c.String("pm-args")); trimmed != "" {
@ -111,8 +110,6 @@ func main() {
app := GetApp()
ctx := context.Background()
log := translations.NewLogger(ctx, oldLogger.NewCLI(os.Stderr), config.Language(ctx))
ctx = loggerctx.With(ctx, log)
// Set the root command to the one set in the ALR config
manager.DefaultRootCmd = config.Config(ctx).RootCmd
@ -122,6 +119,6 @@ func main() {
err := app.RunContext(ctx, os.Args)
if err != nil {
log.Error("Error while running app").Err(err).Send()
slog.Error(gotext.Get("Error while running app"), "err", err)
}
}

@ -25,6 +25,7 @@ import (
"encoding/hex"
"fmt"
"io"
"log/slog"
"os"
"path/filepath"
"runtime"
@ -38,7 +39,7 @@ import (
_ "github.com/goreleaser/nfpm/v2/arch"
_ "github.com/goreleaser/nfpm/v2/deb"
_ "github.com/goreleaser/nfpm/v2/rpm"
"go.elara.ws/logger/log"
"github.com/leonelquinteros/gotext"
"mvdan.cc/sh/v3/expand"
"mvdan.cc/sh/v3/interp"
"mvdan.cc/sh/v3/syntax"
@ -56,7 +57,6 @@ import (
"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/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -64,7 +64,6 @@ import (
// Функция BuildPackage выполняет сборку скрипта по указанному пути. Возвращает два среза.
// Один содержит пути к собранным пакетам, другой - имена собранных пакетов.
func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string, error) {
log := loggerctx.From(ctx)
reposInstance := repos.GetInstance(ctx)
info, err := distro.ParseOSRelease(ctx)
@ -102,10 +101,11 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
// Спрашиваем у пользователя, хочет ли он увидеть скрипт сборки.
err = cliutils.PromptViewScript(ctx, opts.Script, vars.Name, config.Config(ctx).PagerStyle, opts.Interactive)
if err != nil {
log.Fatal("Failed to prompt user to view build script").Err(err).Send()
slog.Error(gotext.Get("Failed to prompt user to view build script"), "err", err)
os.Exit(1)
}
log.Info("Building package").Str("name", vars.Name).Str("version", vars.Version).Send()
slog.Info(gotext.Get("Building package"), "name", vars.Name, "version", vars.Version)
// Второй проход будет использоваться для выполнения реального кода,
// поэтому он не ограничен. Скрипт уже был показан
@ -149,7 +149,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
return nil, nil, err
}
log.Info("Downloading sources").Send() // Записываем в лог загрузку источников
slog.Info(gotext.Get("Downloading sources")) // Записываем в лог загрузку источников
err = getSources(ctx, dirs, vars) // Загружаем исходники
if err != nil {
@ -161,7 +161,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
return nil, nil, err
}
log.Info("Building package metadata").Str("name", vars.Name).Send() // Логгируем сборку метаданных пакета
slog.Info(gotext.Get("Building package metadata"), "name", vars.Name)
pkgFormat := getPkgFormat(opts.Manager) // Получаем формат пакета
@ -183,7 +183,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
return nil, nil, err
}
log.Info("Compressing package").Str("name", pkgName).Send() // Логгируем сжатие пакета
slog.Info(gotext.Get("Compressing package"), "name", pkgName) // Логгируем сжатие пакета
err = packager.Package(pkgInfo, pkgFile) // Упаковываем пакет
if err != nil {
@ -308,7 +308,6 @@ func prepareDirs(dirs types.Directories) error {
// Функция performChecks проверяет различные аспекты в системе, чтобы убедиться, что пакет может быть установлен.
func performChecks(ctx context.Context, vars *types.BuildVars, interactive bool, installed map[string]string) (bool, error) {
log := loggerctx.From(ctx)
if !cpu.IsCompatibleWith(cpu.Arch(), vars.Architectures) { // Проверяем совместимость архитектуры
cont, err := cliutils.YesNoPrompt(ctx, "Your system's CPU architecture doesn't match this package. Do you want to build anyway?", interactive, true)
if err != nil {
@ -321,10 +320,10 @@ func performChecks(ctx context.Context, vars *types.BuildVars, interactive bool,
}
if instVer, ok := installed[vars.Name]; ok { // Если пакет уже установлен, выводим предупреждение
log.Warn("This package is already installed").
Str("name", vars.Name).
Str("version", instVer).
Send()
slog.Warn(gotext.Get("This package is already installed"),
"name", vars.Name,
"version", instVer,
)
}
return true, nil
@ -337,7 +336,6 @@ type PackageFinder interface {
// Функция installBuildDeps устанавливает все зависимости сборки, которые еще не установлены, и возвращает
// срез, содержащий имена всех установленных пакетов.
func installBuildDeps(ctx context.Context, repos PackageFinder, vars *types.BuildVars, opts types.BuildOpts) ([]string, error) {
log := loggerctx.From(ctx)
var buildDeps []string
if len(vars.BuildDepends) > 0 {
deps, err := removeAlreadyInstalled(opts, vars.BuildDepends)
@ -350,7 +348,7 @@ func installBuildDeps(ctx context.Context, repos PackageFinder, vars *types.Buil
return nil, err
}
log.Info("Installing build dependencies").Send() // Логгируем установку зависимостей
slog.Info(gotext.Get("Installing build dependencies")) // Логгируем установку зависимостей
flattened := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive) // Уплощаем список зависимостей
buildDeps = packageNames(flattened)
@ -391,9 +389,8 @@ func installOptDeps(ctx context.Context, repos PackageFinder, vars *types.BuildV
// пакетов, которые она собрала, а также все зависимости, которые не были найдены в ALR репозитории,
// чтобы они могли быть установлены из системных репозиториев.
func buildALRDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVars) (builtPaths, builtNames, repoDeps []string, err error) {
log := loggerctx.From(ctx)
if len(vars.Depends) > 0 {
log.Info("Installing dependencies").Send()
slog.Info(gotext.Get("Installing dependencies"))
found, notFound, err := repos.FindPkgs(ctx, vars.Depends) // Поиск зависимостей
if err != nil {
@ -433,10 +430,9 @@ func buildALRDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVa
// Функция executeFunctions выполняет специальные функции ALR, такие как version(), prepare() и т.д.
func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Directories, vars *types.BuildVars) (err error) {
log := loggerctx.From(ctx)
version, ok := dec.GetFunc("version")
if ok {
log.Info("Executing version()").Send()
slog.Info(gotext.Get("Executing version()"))
buf := &bytes.Buffer{}
@ -456,12 +452,12 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire
}
vars.Version = newVer
log.Info("Updating version").Str("new", newVer).Send()
slog.Info("Updating version", "new", newVer)
}
prepare, ok := dec.GetFunc("prepare")
if ok {
log.Info("Executing prepare()").Send()
slog.Info(gotext.Get("Executing prepare()"))
err = prepare(ctx, interp.Dir(dirs.SrcDir))
if err != nil {
@ -471,7 +467,7 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire
build, ok := dec.GetFunc("build")
if ok {
log.Info("Executing build()").Send()
slog.Info(gotext.Get("Executing build()"))
err = build(ctx, interp.Dir(dirs.SrcDir))
if err != nil {
@ -483,24 +479,27 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire
for {
packageFn, ok := dec.GetFunc("package")
if ok {
log.Info("Executing package()").Send()
slog.Info(gotext.Get("Executing package()"))
err = packageFn(ctx, interp.Dir(dirs.SrcDir))
if err != nil {
return err
}
}
// Проверка на наличие дополнительных функций package_*
packageFuncName := "package_"
if packageFunc, ok := dec.GetFunc(packageFuncName); ok {
log.Info("Executing " + packageFuncName).Send()
err = packageFunc(ctx, interp.Dir(dirs.SrcDir))
if err != nil {
return err
/*
// Проверка на наличие дополнительных функций package_*
packageFuncName := "package_"
if packageFunc, ok := dec.GetFunc(packageFuncName); ok {
slog.Info("Executing " + packageFuncName)
err = packageFunc(ctx, interp.Dir(dirs.SrcDir))
if err != nil {
return err
}
} else {
break // Если больше нет функций package_*, выходим из цикла
}
} else {
break // Если больше нет функций package_*, выходим из цикла
}
*/
break
}
return nil
@ -555,7 +554,7 @@ func buildPkgMetadata(ctx context.Context, vars *types.BuildVars, dirs types.Dir
return nil, err
}
} else {
log.Info("AutoProv is not implemented for this package format, so it's skiped").Send()
slog.Info(gotext.Get("AutoProv is not implemented for this package format, so it's skiped"))
}
}
@ -566,7 +565,7 @@ func buildPkgMetadata(ctx context.Context, vars *types.BuildVars, dirs types.Dir
return nil, err
}
} else {
log.Info("AutoReq is not implemented for this package format, so it's skiped").Send()
slog.Info(gotext.Get("AutoReq is not implemented for this package format, so it's skiped"))
}
}
@ -756,9 +755,9 @@ func createBuildEnvVars(info *distro.OSRelease, dirs types.Directories) []string
// Функция getSources загружает исходники скрипта.
func getSources(ctx context.Context, dirs types.Directories, bv *types.BuildVars) error {
log := loggerctx.From(ctx)
if len(bv.Sources) != len(bv.Checksums) {
log.Fatal("The checksums array must be the same length as sources").Send()
slog.Error(gotext.Get("The checksums array must be the same length as sources"))
os.Exit(1)
}
for i, src := range bv.Sources {

@ -19,21 +19,20 @@ package build
import (
"bytes"
"context"
"log/slog"
"os/exec"
"path"
"strings"
"github.com/goreleaser/nfpm/v2"
"github.com/leonelquinteros/gotext"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
func rpmFindDependencies(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories, command string, updateFunc func(string)) error {
log := loggerctx.From(ctx)
if _, err := exec.LookPath(command); err != nil {
log.Info("Command not found on the system").Str("command", command).Send()
slog.Info(gotext.Get("Command not found on the system"), "command", command)
return nil
}
@ -64,7 +63,7 @@ func rpmFindDependencies(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Dir
cmd.Stdout = &out
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
log.Error(stderr.String()).Send()
slog.Error(stderr.String())
return err
}
@ -79,19 +78,15 @@ func rpmFindDependencies(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Dir
}
func rpmFindProvides(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories) error {
log := loggerctx.From(ctx)
return rpmFindDependencies(ctx, pkgInfo, dirs, "/usr/lib/rpm/find-provides", func(dep string) {
log.Info("Provided dependency found").Str("dep", dep).Send()
slog.Info(gotext.Get("Provided dependency found"), "dep", dep)
pkgInfo.Overridables.Provides = append(pkgInfo.Overridables.Provides, dep)
})
}
func rpmFindRequires(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories) error {
log := loggerctx.From(ctx)
return rpmFindDependencies(ctx, pkgInfo, dirs, "/usr/lib/rpm/find-requires", func(dep string) {
log.Info("Required dependency found").Str("dep", dep).Send()
slog.Info(gotext.Get("Required dependency found"), "dep", dep)
pkgInfo.Overridables.Depends = append(pkgInfo.Overridables.Depends, dep)
})
}

@ -21,24 +21,26 @@ package build
import (
"context"
"log/slog"
"os"
"path/filepath"
"github.com/leonelquinteros/gotext"
"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/types"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
)
// InstallPkgs устанавливает нативные пакеты с использованием менеджера пакетов,
// затем строит и устанавливает пакеты ALR
func InstallPkgs(ctx context.Context, alrPkgs []db.Package, nativePkgs []string, opts types.BuildOpts) {
log := loggerctx.From(ctx) // Инициализируем логгер из контекста
if len(nativePkgs) > 0 {
err := opts.Manager.Install(nil, nativePkgs...)
// Если есть нативные пакеты, выполняем их установку
if err != nil {
log.Fatal("Error installing native packages").Err(err).Send()
slog.Error(gotext.Get("Error installing native packages"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке
}
}
@ -61,20 +63,21 @@ func GetScriptPaths(ctx context.Context, pkgs []db.Package) []string {
// InstallScripts строит и устанавливает переданные alr скрипты сборки
func InstallScripts(ctx context.Context, scripts []string, opts types.BuildOpts) {
log := loggerctx.From(ctx) // Получаем логгер из контекста
for _, script := range scripts {
opts.Script = script // Устанавливаем текущий скрипт в опции
builtPkgs, _, err := BuildPackage(ctx, opts)
// Выполняем сборку пакета
if err != nil {
log.Fatal("Error building package").Err(err).Send()
slog.Error(gotext.Get("Error building package"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке сборки
}
err = opts.Manager.InstallLocal(nil, builtPkgs...)
// Устанавливаем локально собранные пакеты
if err != nil {
log.Fatal("Error installing package").Err(err).Send()
slog.Error(gotext.Get("Error installing package"), "err", err)
os.Exit(1)
// Логируем и завершаем выполнение при ошибке установки
}
}

@ -1,48 +0,0 @@
// This file was originally part of the project "LURE - Linux User REpository", created by Elara Musayelyan.
// It has been modified as part of "ALR - Any Linux Repository" by Евгений Храмов.
//
// ALR - Any Linux Repository
// Copyright (C) 2025 Евгений Храмов
//
// 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 loggerctx
import (
"context"
"go.elara.ws/logger"
)
// loggerCtxKey is used as the context key for loggers
type loggerCtxKey struct{}
// With returns a copy of ctx containing log
func With(ctx context.Context, log logger.Logger) context.Context {
return context.WithValue(ctx, loggerCtxKey{}, log)
}
// From attempts to get a logger from ctx. If ctx doesn't
// contain a logger, it returns a nop logger.
func From(ctx context.Context) logger.Logger {
if val := ctx.Value(loggerCtxKey{}); val != nil {
if log, ok := val.(logger.Logger); ok && log != nil {
return log
} else {
return logger.NewNop()
}
} else {
return logger.NewNop()
}
}

@ -22,6 +22,7 @@ package repos
import (
"context"
"errors"
"log/slog"
"net/url"
"os"
"path/filepath"
@ -31,6 +32,7 @@ import (
"github.com/go-git/go-billy/v5/osfs"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/leonelquinteros/gotext"
"github.com/pelletier/go-toml/v2"
"go.elara.ws/vercmp"
"mvdan.cc/sh/v3/expand"
@ -41,7 +43,6 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"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/loggerctx"
)
type actionType uint8
@ -61,8 +62,6 @@ type action struct {
// In this case, only changed packages will be processed if possible.
// If repos is set to nil, the repos in the ALR config will be used.
func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error {
log := loggerctx.From(ctx)
if repos == nil {
repos = rs.cfg.Repos(ctx)
}
@ -73,7 +72,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error {
return err
}
log.Info("Pulling repository").Str("name", repo.Name).Send()
slog.Info(gotext.Get("Pulling repository"), "name", repo.Name)
repoDir := filepath.Join(config.GetPaths(ctx).RepoDir, repo.Name)
var repoFS billy.Filesystem
@ -97,7 +96,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error {
err = w.PullContext(ctx, &git.PullOptions{Progress: os.Stderr})
if errors.Is(err, git.NoErrAlreadyUpToDate) {
log.Info("Repository up to date").Str("name", repo.Name).Send()
slog.Info(gotext.Get("Repository up to date"), "name", repo.Name)
} else if err != nil {
return err
}
@ -154,7 +153,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error {
fl, err := repoFS.Open("alr-repo.toml")
if err != nil {
log.Warn("Git repository does not appear to be a valid ALR repo").Str("repo", repo.Name).Send()
slog.Warn(gotext.Get("Git repository does not appear to be a valid ALR repo"), "repo", repo.Name)
continue
}
@ -170,7 +169,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error {
// to compare it to the repo version, so only compare versions with the "v".
if strings.HasPrefix(config.Version, "v") {
if vercmp.Compare(config.Version, repoCfg.Repo.MinVersion) == -1 {
log.Warn("ALR repo's minumum ALR version is greater than the current version. Try updating ALR if something doesn't work.").Str("repo", repo.Name).Send()
slog.Warn(gotext.Get("ALR repo's minumum ALR version is greater than the current version. Try updating ALR if something doesn't work."), "repo", repo.Name)
}
}
}

36
repo.go

@ -20,9 +20,11 @@
package main
import (
"log/slog"
"os"
"path/filepath"
"github.com/leonelquinteros/gotext"
"github.com/pelletier/go-toml/v2"
"github.com/urfave/cli/v2"
"golang.org/x/exp/slices"
@ -30,7 +32,6 @@ import (
"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/types"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -54,7 +55,6 @@ var addrepoCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
name := c.String("name")
repoURL := c.String("url")
@ -63,7 +63,8 @@ var addrepoCmd = &cli.Command{
for _, repo := range cfg.Repos {
if repo.URL == repoURL {
log.Fatal("Repo already exists").Str("name", repo.Name).Send()
slog.Error("Repo already exists", "name", repo.Name)
os.Exit(1)
}
}
@ -74,17 +75,20 @@ var addrepoCmd = &cli.Command{
cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath)
if err != nil {
log.Fatal("Error opening config file").Err(err).Send()
slog.Error(gotext.Get("Error opening config file"), "err", err)
os.Exit(1)
}
err = toml.NewEncoder(cfgFl).Encode(cfg)
if err != nil {
log.Fatal("Error encoding config").Err(err).Send()
slog.Error(gotext.Get("Error encoding config"), "err", err)
os.Exit(1)
}
err = repos.Pull(ctx, cfg.Repos)
if err != nil {
log.Fatal("Error pulling repos").Err(err).Send()
slog.Error(gotext.Get("Error pulling repos"), "err", err)
os.Exit(1)
}
return nil
@ -105,7 +109,6 @@ var removerepoCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
name := c.String("name")
cfg := config.Config(ctx)
@ -119,29 +122,34 @@ var removerepoCmd = &cli.Command{
}
}
if !found {
log.Fatal("Repo does not exist").Str("name", name).Send()
slog.Error(gotext.Get("Repo does not exist"), "name", name)
os.Exit(1)
}
cfg.Repos = slices.Delete(cfg.Repos, index, index+1)
cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath)
if err != nil {
log.Fatal("Error opening config file").Err(err).Send()
slog.Error(gotext.Get("Error opening config file"), "err", err)
os.Exit(1)
}
err = toml.NewEncoder(cfgFl).Encode(&cfg)
if err != nil {
log.Fatal("Error encoding config").Err(err).Send()
slog.Error(gotext.Get("Error encoding config"), "err", err)
os.Exit(1)
}
err = os.RemoveAll(filepath.Join(config.GetPaths(ctx).RepoDir, name))
if err != nil {
log.Fatal("Error removing repo directory").Err(err).Send()
slog.Error(gotext.Get("Error removing repo directory"), "err", err)
os.Exit(1)
}
err = db.DeletePkgs(ctx, "repository = ?", name)
if err != nil {
log.Fatal("Error removing packages from database").Err(err).Send()
slog.Error(gotext.Get("Error removing packages from database"), "err", err)
os.Exit(1)
}
return nil
@ -154,10 +162,10 @@ var refreshCmd = &cli.Command{
Aliases: []string{"ref"},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
err := repos.Pull(ctx, config.Config(ctx).Repos)
if err != nil {
log.Fatal("Error pulling repos").Err(err).Send()
slog.Error(gotext.Get("Error pulling repos"), "err", err)
os.Exit(1)
}
return nil
},

@ -22,8 +22,12 @@ package main
import (
"context"
"fmt"
"log/slog"
"os"
"github.com/leonelquinteros/gotext"
"github.com/urfave/cli/v2"
"go.elara.ws/logger/log"
"go.elara.ws/vercmp"
"golang.org/x/exp/maps"
"golang.org/x/exp/slices"
@ -33,7 +37,6 @@ import (
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
"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/loggerctx"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos"
)
@ -51,26 +54,29 @@ var upgradeCmd = &cli.Command{
},
Action: func(c *cli.Context) error {
ctx := c.Context
log := loggerctx.From(ctx)
info, err := distro.ParseOSRelease(ctx)
if err != nil {
log.Fatal("Error parsing os-release file").Err(err).Send()
slog.Error(gotext.Get("Error parsing os-release file"), "err", err)
os.Exit(1)
}
mgr := manager.Detect()
if mgr == nil {
log.Fatal("Unable to detect a supported package manager on the system").Send()
slog.Error(gotext.Get("Unable to detect a supported package manager on the system"))
os.Exit(1)
}
err = repos.Pull(ctx, config.Config(ctx).Repos)
if err != nil {
log.Fatal("Error pulling repos").Err(err).Send()
slog.Error(gotext.Get("Error pulling repos"), "err", err)
os.Exit(1)
}
updates, err := checkForUpdates(ctx, mgr, info)
if err != nil {
log.Fatal("Error checking for updates").Err(err).Send()
slog.Error(gotext.Get("Error checking for updates"), "err", err)
os.Exit(1)
}
if len(updates) > 0 {