feat: add autoPull in config #17
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							| @@ -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 | ||||
							
								
								
									
										19
									
								
								build.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								build.go
									
									
									
									
									
								
							| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										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 | ||||
| 	}, | ||||
|   | ||||
							
								
								
									
										13
									
								
								helper.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								helper.go
									
									
									
									
									
								
							| @@ -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{ | ||||
|   | ||||
							
								
								
									
										35
									
								
								install.go
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								install.go
									
									
									
									
									
								
							| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										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
									
									
									
									
									
								
							
							
						
						
									
										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
									
									
									
									
									
								
							
							
						
						
									
										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 | ||||
| 	}, | ||||
|   | ||||
							
								
								
									
										18
									
								
								upgrade.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								upgrade.go
									
									
									
									
									
								
							| @@ -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 { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user