feat: add autoPull in config #17
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							| @@ -64,4 +64,5 @@ fmt: | |||||||
|  |  | ||||||
| i18n: | i18n: | ||||||
| 	$(XGOTEXT_BIN)  --output ./internal/translations/default.pot | 	$(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 | 	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 | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build" | 	"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/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
| @@ -57,7 +58,6 @@ var buildCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		script := c.String("script") | 		script := c.String("script") | ||||||
| 		if c.String("package") != "" { | 		if c.String("package") != "" { | ||||||
| @@ -66,12 +66,14 @@ var buildCmd = &cli.Command{ | |||||||
|  |  | ||||||
| 		err := repos.Pull(ctx, config.Config(ctx).Repos) | 		err := repos.Pull(ctx, config.Config(ctx).Repos) | ||||||
| 		if err != nil { | 		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() | 		mgr := manager.Detect() | ||||||
| 		if mgr == nil { | 		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{ | 		pkgPaths, _, err := build.BuildPackage(ctx, types.BuildOpts{ | ||||||
| @@ -81,19 +83,22 @@ var buildCmd = &cli.Command{ | |||||||
| 			Interactive: c.Bool("interactive"), | 			Interactive: c.Bool("interactive"), | ||||||
| 		}) | 		}) | ||||||
| 		if err != nil { | 		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() | 		wd, err := os.Getwd() | ||||||
| 		if err != nil { | 		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 { | 		for _, pkgPath := range pkgPaths { | ||||||
| 			name := filepath.Base(pkgPath) | 			name := filepath.Base(pkgPath) | ||||||
| 			err = osutils.Move(pkgPath, filepath.Join(wd, name)) | 			err = osutils.Move(pkgPath, filepath.Join(wd, name)) | ||||||
| 			if err != nil { | 			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 | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -35,31 +36,33 @@ var fixCmd = &cli.Command{ | |||||||
| 	Usage: "Attempt to fix problems with ALR", | 	Usage: "Attempt to fix problems with ALR", | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		db.Close() | 		db.Close() | ||||||
| 		paths := config.GetPaths(ctx) | 		paths := config.GetPaths(ctx) | ||||||
|  |  | ||||||
| 		log.Info("Removing cache directory").Send() | 		slog.Info(gotext.Get("Removing cache directory")) | ||||||
|  |  | ||||||
| 		err := os.RemoveAll(paths.CacheDir) | 		err := os.RemoveAll(paths.CacheDir) | ||||||
| 		if err != nil { | 		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) | 		err = os.MkdirAll(paths.CacheDir, 0o755) | ||||||
| 		if err != nil { | 		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) | 		err = repos.Pull(ctx, config.Config(ctx).Repos) | ||||||
| 		if err != nil { | 		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 | 		return nil | ||||||
| 	}, | 	}, | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								helper.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								helper.go
									
									
									
									
									
								
							| @@ -21,9 +21,11 @@ package main | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| 	"mvdan.cc/sh/v3/expand" | 	"mvdan.cc/sh/v3/expand" | ||||||
| 	"mvdan.cc/sh/v3/interp" | 	"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/cpu" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/helpers" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/helpers" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var helperCmd = &cli.Command{ | var helperCmd = &cli.Command{ | ||||||
| @@ -49,7 +50,6 @@ var helperCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		if c.Args().Len() < 1 { | 		if c.Args().Len() < 1 { | ||||||
| 			cli.ShowSubcommandHelpAndExit(c, 1) | 			cli.ShowSubcommandHelpAndExit(c, 1) | ||||||
| @@ -57,17 +57,20 @@ var helperCmd = &cli.Command{ | |||||||
|  |  | ||||||
| 		helper, ok := helpers.Helpers[c.Args().First()] | 		helper, ok := helpers.Helpers[c.Args().First()] | ||||||
| 		if !ok { | 		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() | 		wd, err := os.Getwd() | ||||||
| 		if err != nil { | 		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) | 		info, err := distro.ParseOSRelease(ctx) | ||||||
| 		if err != nil { | 		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{ | 		hc := interp.HandlerContext{ | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								install.go
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								install.go
									
									
									
									
									
								
							| @@ -21,7 +21,10 @@ package main | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"log/slog" | ||||||
|  | 	"os" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils" | 	"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/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"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/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/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
| @@ -47,26 +49,29 @@ var installCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		args := c.Args() | 		args := c.Args() | ||||||
| 		if args.Len() < 1 { | 		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() | 		mgr := manager.Detect() | ||||||
| 		if mgr == nil { | 		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) | 		err := repos.Pull(ctx, config.Config(ctx).Repos) | ||||||
| 		if err != nil { | 		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()) | 		found, notFound, err := repos.FindPkgs(ctx, args.Slice()) | ||||||
| 		if err != nil { | 		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")) | 		pkgs := cliutils.FlattenPkgs(ctx, found, "install", c.Bool("interactive")) | ||||||
| @@ -78,10 +83,10 @@ var installCmd = &cli.Command{ | |||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
| 	BashComplete: func(c *cli.Context) { | 	BashComplete: func(c *cli.Context) { | ||||||
| 		log := loggerctx.From(c.Context) |  | ||||||
| 		result, err := db.GetPkgs(c.Context, "true") | 		result, err := db.GetPkgs(c.Context, "true") | ||||||
| 		if err != nil { | 		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() | 		defer result.Close() | ||||||
|  |  | ||||||
| @@ -89,7 +94,8 @@ var installCmd = &cli.Command{ | |||||||
| 			var pkg db.Package | 			var pkg db.Package | ||||||
| 			err = result.StructScan(&pkg) | 			err = result.StructScan(&pkg) | ||||||
| 			if err != nil { | 			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) | 			fmt.Println(pkg.Name) | ||||||
| @@ -102,21 +108,22 @@ var removeCmd = &cli.Command{ | |||||||
| 	Usage:   "Remove an installed package", | 	Usage:   "Remove an installed package", | ||||||
| 	Aliases: []string{"rm"}, | 	Aliases: []string{"rm"}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		log := loggerctx.From(c.Context) |  | ||||||
|  |  | ||||||
| 		args := c.Args() | 		args := c.Args() | ||||||
| 		if args.Len() < 1 { | 		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() | 		mgr := manager.Detect() | ||||||
| 		if mgr == nil { | 		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()...) | 		err := mgr.Remove(nil, c.Args().Slice()...) | ||||||
| 		if err != nil { | 		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 | 		return nil | ||||||
|   | |||||||
| @@ -21,16 +21,17 @@ package cliutils | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/AlecAivazis/survey/v2" | 	"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/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/pager" | 	"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/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 | // 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 | // shows it if they answer yes, then asks if they'd still like to | ||||||
| // continue, and exits if they answer no. | // continue, and exits if they answer no. | ||||||
| func PromptViewScript(ctx context.Context, script, name, style string, interactive bool) error { | func PromptViewScript(ctx context.Context, script, name, style string, interactive bool) error { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 	if !interactive { | 	if !interactive { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -78,7 +77,8 @@ func PromptViewScript(ctx context.Context, script, name, style string, interacti | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if !cont { | 		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 | // 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. | // 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 { | func FlattenPkgs(ctx context.Context, found map[string][]db.Package, verb string, interactive bool) []db.Package { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	var outPkgs []db.Package | 	var outPkgs []db.Package | ||||||
| 	for _, pkgs := range found { | 	for _, pkgs := range found { | ||||||
| 		if len(pkgs) > 1 && interactive { | 		if len(pkgs) > 1 && interactive { | ||||||
| 			choice, err := PkgPrompt(ctx, pkgs, verb, interactive) | 			choice, err := PkgPrompt(ctx, pkgs, verb, interactive) | ||||||
| 			if err != nil { | 			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) | 			outPkgs = append(outPkgs, choice) | ||||||
| 		} else if len(pkgs) == 1 || !interactive { | 		} else if len(pkgs) == 1 || !interactive { | ||||||
|   | |||||||
| @@ -21,13 +21,13 @@ package config | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"golang.org/x/text/language" | 	"golang.org/x/text/language" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -43,12 +43,12 @@ var ( | |||||||
| func Language(ctx context.Context) language.Tag { | func Language(ctx context.Context) language.Tag { | ||||||
| 	langMtx.Lock() | 	langMtx.Lock() | ||||||
| 	defer langMtx.Unlock() | 	defer langMtx.Unlock() | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	if !langSet { | 	if !langSet { | ||||||
| 		syslang := SystemLang() | 		syslang := SystemLang() | ||||||
| 		tag, err := language.Parse(syslang) | 		tag, err := language.Parse(syslang) | ||||||
| 		if err != nil { | 		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() | 		base, _ := tag.Base() | ||||||
| 		lang = language.Make(base.String()) | 		lang = language.Make(base.String()) | ||||||
|   | |||||||
| @@ -21,11 +21,12 @@ package db | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
|  |  | ||||||
| 	"github.com/jmoiron/sqlx" | 	"github.com/jmoiron/sqlx" | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // CurrentVersion is the current version of the database. | // 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 { | func (d *Database) initDB(ctx context.Context) error { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	d.conn = d.conn.Unsafe() | 	d.conn = d.conn.Unsafe() | ||||||
| 	conn := d.conn | 	conn := d.conn | ||||||
| 	_, err := conn.ExecContext(ctx, ` | 	_, err := conn.ExecContext(ctx, ` | ||||||
| @@ -128,11 +128,11 @@ func (d *Database) initDB(ctx context.Context) error { | |||||||
|  |  | ||||||
| 	ver, ok := d.GetVersion(ctx) | 	ver, ok := d.GetVersion(ctx) | ||||||
| 	if ok && ver != CurrentVersion { | 	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) | 		d.reset(ctx) | ||||||
| 		return d.initDB(ctx) | 		return d.initDB(ctx) | ||||||
| 	} else if !ok { | 	} 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) | 		return d.addVersion(ctx, CurrentVersion) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,12 +18,14 @@ package db | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
|  | 	"os" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
| 	"github.com/jmoiron/sqlx" | 	"github.com/jmoiron/sqlx" | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // DB returns the ALR database. | // DB returns the ALR database. | ||||||
| @@ -92,12 +94,12 @@ var ( | |||||||
| // Deprecated: For legacy only | // Deprecated: For legacy only | ||||||
| func GetInstance(ctx context.Context) *Database { | func GetInstance(ctx context.Context) *Database { | ||||||
| 	dbOnce.Do(func() { | 	dbOnce.Do(func() { | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
| 		cfg := config.GetInstance(ctx) | 		cfg := config.GetInstance(ctx) | ||||||
| 		database = New(cfg) | 		database = New(cfg) | ||||||
| 		err := database.Init(ctx) | 		err := database.Init(ctx) | ||||||
| 		if err != nil { | 		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 | 	return database | ||||||
|   | |||||||
| @@ -31,11 +31,13 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"hash" | 	"hash" | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/PuerkitoBio/purell" | 	"github.com/PuerkitoBio/purell" | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/vmihailenco/msgpack/v5" | 	"github.com/vmihailenco/msgpack/v5" | ||||||
| 	"golang.org/x/crypto/blake2b" | 	"golang.org/x/crypto/blake2b" | ||||||
| 	"golang.org/x/crypto/blake2s" | 	"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/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/dlcache" | 	"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 загружает файл или каталог с использованием указанных параметров | // Функция Download загружает файл или каталог с использованием указанных параметров | ||||||
| func Download(ctx context.Context, opts Options) (err error) { | func Download(ctx context.Context, opts Options) (err error) { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	cfg := config.GetInstance(ctx) | 	cfg := config.GetInstance(ctx) | ||||||
| 	dc := dlcache.New(cfg) | 	dc := dlcache.New(cfg) | ||||||
|  |  | ||||||
| @@ -166,7 +166,11 @@ func Download(ctx context.Context, opts Options) (err error) { | |||||||
| 	if ok { | 	if ok { | ||||||
| 		var updated bool | 		var updated bool | ||||||
| 		if d, ok := d.(UpdatingDownloader); ok { | 		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{ | 			updated, err = d.Update(Options{ | ||||||
| 				Hash:          opts.Hash, | 				Hash:          opts.Hash, | ||||||
| @@ -193,10 +197,18 @@ func Download(ctx context.Context, opts Options) (err error) { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if ok && !updated { | 			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 | 				return nil | ||||||
| 			} else if ok { | 			} 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 | 				return nil | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} 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) | 	cacheDir, err = dc.New(ctx, opts.URL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -9,6 +9,54 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\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 | #: info.go:42 | ||||||
| msgid "Print information about a package" | msgid "Print information about a package" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -21,10 +69,6 @@ msgstr "" | |||||||
| msgid "Command info expected at least 1 argument, got %d" | msgid "Command info expected at least 1 argument, got %d" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: info.go:65 |  | ||||||
| msgid "Error pulling repositories" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: info.go:71 | #: info.go:71 | ||||||
| msgid "Error finding packages" | msgid "Error finding packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -37,11 +81,38 @@ msgstr "" | |||||||
| msgid "Error resolving overrides" | msgid "Error resolving overrides" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: info.go:105 | #: info.go:105 info.go:111 | ||||||
| #: info.go:111 |  | ||||||
| msgid "Error encoding script variables" | msgid "Error encoding script variables" | ||||||
| msgstr "" | 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 | #: internal/config/config.go:63 | ||||||
| msgid "Error opening config file, using defaults" | msgid "Error opening config file, using defaults" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -78,7 +149,179 @@ msgstr "" | |||||||
| msgid "Unable to create package cache directory" | msgid "Unable to create package cache directory" | ||||||
| msgstr "" | 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 | #: internal/logger/log.go:44 | ||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "" | 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 "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
|  | "Project-Id-Version: \n" | ||||||
| "PO-Revision-Date: 2025-01-22 14:23+0300\n" | "PO-Revision-Date: 2025-01-22 14:23+0300\n" | ||||||
| "Last-Translator: Maxim Slipenko <maks1ms@alt-gnome.ru>\n" | "Last-Translator: Maxim Slipenko <maks1ms@alt-gnome.ru>\n" | ||||||
|  | "Language-Team: Russian\n" | ||||||
| "Language: ru\n" | "Language: ru\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | ||||||
| "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" | ||||||
| "X-Generator: Gtranslator 47.1\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 | #: info.go:42 | ||||||
| msgid "Print information about a package" | msgid "Print information about a package" | ||||||
| @@ -27,10 +75,6 @@ msgstr "Показывать всю информацию, а не только  | |||||||
| msgid "Command info expected at least 1 argument, got %d" | msgid "Command info expected at least 1 argument, got %d" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: info.go:65 |  | ||||||
| msgid "Error pulling repositories" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: info.go:71 | #: info.go:71 | ||||||
| msgid "Error finding packages" | msgid "Error finding packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -47,6 +91,34 @@ msgstr "" | |||||||
| msgid "Error encoding script variables" | msgid "Error encoding script variables" | ||||||
| msgstr "" | 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 | #: internal/config/config.go:63 | ||||||
| msgid "Error opening config file, using defaults" | msgid "Error opening config file, using defaults" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -83,6 +155,179 @@ msgstr "" | |||||||
| msgid "Unable to create package cache directory" | msgid "Unable to create package cache directory" | ||||||
| msgstr "" | 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 | #: internal/logger/log.go:44 | ||||||
| msgid "ERROR" | msgid "ERROR" | ||||||
| msgstr "ОШИБКА" | 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" | 	"context" | ||||||
| 	"embed" | 	"embed" | ||||||
| 	"io/fs" | 	"io/fs" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 	"sync" | 	"sync" | ||||||
| @@ -32,8 +33,6 @@ import ( | |||||||
| 	"go.elara.ws/logger" | 	"go.elara.ws/logger" | ||||||
| 	"go.elara.ws/translate" | 	"go.elara.ws/translate" | ||||||
| 	"golang.org/x/text/language" | 	"golang.org/x/text/language" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| //go:embed files | //go:embed files | ||||||
| @@ -47,11 +46,11 @@ var ( | |||||||
| func Translator(ctx context.Context) *translate.Translator { | func Translator(ctx context.Context) *translate.Translator { | ||||||
| 	mu.Lock() | 	mu.Lock() | ||||||
| 	defer mu.Unlock() | 	defer mu.Unlock() | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	if translator == nil { | 	if translator == nil { | ||||||
| 		t, err := translate.NewFromFS(translationFS) | 		t, err := translate.NewFromFS(translationFS) | ||||||
| 		if err != nil { | 		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 | 		translator = &t | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								list.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								list.go
									
									
									
									
									
								
							| @@ -21,13 +21,15 @@ package main | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"log/slog" | ||||||
|  | 	"os" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| 	"golang.org/x/exp/slices" | 	"golang.org/x/exp/slices" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
| @@ -44,17 +46,18 @@ var listCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
| 		cfg := config.New() | 		cfg := config.New() | ||||||
| 		db := database.New(cfg) | 		db := database.New(cfg) | ||||||
| 		err := db.Init(ctx) | 		err := db.Init(ctx) | ||||||
| 		if err != nil { | 		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) | 		rs := repos.New(cfg, db) | ||||||
| 		err = rs.Pull(ctx, cfg.Repos(ctx)) | 		err = rs.Pull(ctx, cfg.Repos(ctx)) | ||||||
| 		if err != nil { | 		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" | 		where := "true" | ||||||
| @@ -66,7 +69,8 @@ var listCmd = &cli.Command{ | |||||||
|  |  | ||||||
| 		result, err := db.GetPkgs(ctx, where, args...) | 		result, err := db.GetPkgs(ctx, where, args...) | ||||||
| 		if err != nil { | 		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() | 		defer result.Close() | ||||||
|  |  | ||||||
| @@ -74,12 +78,14 @@ var listCmd = &cli.Command{ | |||||||
| 		if c.Bool("installed") { | 		if c.Bool("installed") { | ||||||
| 			mgr := manager.Detect() | 			mgr := manager.Detect() | ||||||
| 			if mgr == nil { | 			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}) | 			installed, err = mgr.ListInstalled(&manager.Opts{AsRoot: false}) | ||||||
| 			if err != nil { | 			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 { | 		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 | 		return nil | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								main.go
									
									
									
									
									
								
							| @@ -21,20 +21,19 @@ package main | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"syscall" | 	"syscall" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/mattn/go-isatty" | 	"github.com/mattn/go-isatty" | ||||||
| 	"github.com/urfave/cli/v2" | 	"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/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/translations" | 	"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/pkg/manager" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger" | ||||||
| @@ -83,11 +82,11 @@ func GetApp() *cli.App { | |||||||
| 		}, | 		}, | ||||||
| 		Before: func(c *cli.Context) error { | 		Before: func(c *cli.Context) error { | ||||||
| 			ctx := c.Context | 			ctx := c.Context | ||||||
| 			log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 			cmd := c.Args().First() | 			cmd := c.Args().First() | ||||||
| 			if cmd != "helper" && !config.Config(ctx).Unsafe.AllowRunAsRoot && os.Geteuid() == 0 { | 			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 != "" { | 			if trimmed := strings.TrimSpace(c.String("pm-args")); trimmed != "" { | ||||||
| @@ -111,8 +110,6 @@ func main() { | |||||||
| 	app := GetApp() | 	app := GetApp() | ||||||
|  |  | ||||||
| 	ctx := context.Background() | 	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 | 	// Set the root command to the one set in the ALR config | ||||||
| 	manager.DefaultRootCmd = config.Config(ctx).RootCmd | 	manager.DefaultRootCmd = config.Config(ctx).RootCmd | ||||||
| @@ -122,6 +119,6 @@ func main() { | |||||||
|  |  | ||||||
| 	err := app.RunContext(ctx, os.Args) | 	err := app.RunContext(ctx, os.Args) | ||||||
| 	if err != nil { | 	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" | 	"encoding/hex" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"runtime" | 	"runtime" | ||||||
| @@ -38,7 +39,7 @@ import ( | |||||||
| 	_ "github.com/goreleaser/nfpm/v2/arch" | 	_ "github.com/goreleaser/nfpm/v2/arch" | ||||||
| 	_ "github.com/goreleaser/nfpm/v2/deb" | 	_ "github.com/goreleaser/nfpm/v2/deb" | ||||||
| 	_ "github.com/goreleaser/nfpm/v2/rpm" | 	_ "github.com/goreleaser/nfpm/v2/rpm" | ||||||
| 	"go.elara.ws/logger/log" | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"mvdan.cc/sh/v3/expand" | 	"mvdan.cc/sh/v3/expand" | ||||||
| 	"mvdan.cc/sh/v3/interp" | 	"mvdan.cc/sh/v3/interp" | ||||||
| 	"mvdan.cc/sh/v3/syntax" | 	"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/shutils/helpers" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
| @@ -64,7 +64,6 @@ import ( | |||||||
| // Функция BuildPackage выполняет сборку скрипта по указанному пути. Возвращает два среза. | // Функция BuildPackage выполняет сборку скрипта по указанному пути. Возвращает два среза. | ||||||
| // Один содержит пути к собранным пакетам, другой - имена собранных пакетов. | // Один содержит пути к собранным пакетам, другой - имена собранных пакетов. | ||||||
| func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string, error) { | func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string, error) { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	reposInstance := repos.GetInstance(ctx) | 	reposInstance := repos.GetInstance(ctx) | ||||||
|  |  | ||||||
| 	info, err := distro.ParseOSRelease(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) | 	err = cliutils.PromptViewScript(ctx, opts.Script, vars.Name, config.Config(ctx).PagerStyle, opts.Interactive) | ||||||
| 	if err != nil { | 	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 | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	log.Info("Downloading sources").Send() // Записываем в лог загрузку источников | 	slog.Info(gotext.Get("Downloading sources")) // Записываем в лог загрузку источников | ||||||
|  |  | ||||||
| 	err = getSources(ctx, dirs, vars) // Загружаем исходники | 	err = getSources(ctx, dirs, vars) // Загружаем исходники | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -161,7 +161,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string | |||||||
| 		return nil, nil, err | 		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) // Получаем формат пакета | 	pkgFormat := getPkgFormat(opts.Manager) // Получаем формат пакета | ||||||
|  |  | ||||||
| @@ -183,7 +183,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string | |||||||
| 		return nil, nil, err | 		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) // Упаковываем пакет | 	err = packager.Package(pkgInfo, pkgFile) // Упаковываем пакет | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -308,7 +308,6 @@ func prepareDirs(dirs types.Directories) error { | |||||||
|  |  | ||||||
| // Функция performChecks проверяет различные аспекты в системе, чтобы убедиться, что пакет может быть установлен. | // Функция performChecks проверяет различные аспекты в системе, чтобы убедиться, что пакет может быть установлен. | ||||||
| func performChecks(ctx context.Context, vars *types.BuildVars, interactive bool, installed map[string]string) (bool, error) { | 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) { // Проверяем совместимость архитектуры | 	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) | 		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 { | 		if err != nil { | ||||||
| @@ -321,10 +320,10 @@ func performChecks(ctx context.Context, vars *types.BuildVars, interactive bool, | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if instVer, ok := installed[vars.Name]; ok { // Если пакет уже установлен, выводим предупреждение | 	if instVer, ok := installed[vars.Name]; ok { // Если пакет уже установлен, выводим предупреждение | ||||||
| 		log.Warn("This package is already installed"). | 		slog.Warn(gotext.Get("This package is already installed"), | ||||||
| 			Str("name", vars.Name). | 			"name", vars.Name, | ||||||
| 			Str("version", instVer). | 			"version", instVer, | ||||||
| 			Send() | 		) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return true, nil | 	return true, nil | ||||||
| @@ -337,7 +336,6 @@ type PackageFinder interface { | |||||||
| // Функция installBuildDeps устанавливает все зависимости сборки, которые еще не установлены, и возвращает | // Функция installBuildDeps устанавливает все зависимости сборки, которые еще не установлены, и возвращает | ||||||
| // срез, содержащий имена всех установленных пакетов. | // срез, содержащий имена всех установленных пакетов. | ||||||
| func installBuildDeps(ctx context.Context, repos PackageFinder, vars *types.BuildVars, opts types.BuildOpts) ([]string, error) { | func installBuildDeps(ctx context.Context, repos PackageFinder, vars *types.BuildVars, opts types.BuildOpts) ([]string, error) { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	var buildDeps []string | 	var buildDeps []string | ||||||
| 	if len(vars.BuildDepends) > 0 { | 	if len(vars.BuildDepends) > 0 { | ||||||
| 		deps, err := removeAlreadyInstalled(opts, vars.BuildDepends) | 		deps, err := removeAlreadyInstalled(opts, vars.BuildDepends) | ||||||
| @@ -350,7 +348,7 @@ func installBuildDeps(ctx context.Context, repos PackageFinder, vars *types.Buil | |||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		log.Info("Installing build dependencies").Send() // Логгируем установку зависимостей | 		slog.Info(gotext.Get("Installing build dependencies")) // Логгируем установку зависимостей | ||||||
|  |  | ||||||
| 		flattened := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive) // Уплощаем список зависимостей | 		flattened := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive) // Уплощаем список зависимостей | ||||||
| 		buildDeps = packageNames(flattened) | 		buildDeps = packageNames(flattened) | ||||||
| @@ -391,9 +389,8 @@ func installOptDeps(ctx context.Context, repos PackageFinder, vars *types.BuildV | |||||||
| // пакетов, которые она собрала, а также все зависимости, которые не были найдены в ALR репозитории, | // пакетов, которые она собрала, а также все зависимости, которые не были найдены в ALR репозитории, | ||||||
| // чтобы они могли быть установлены из системных репозиториев. | // чтобы они могли быть установлены из системных репозиториев. | ||||||
| func buildALRDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVars) (builtPaths, builtNames, repoDeps []string, err error) { | 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 { | 	if len(vars.Depends) > 0 { | ||||||
| 		log.Info("Installing dependencies").Send() | 		slog.Info(gotext.Get("Installing dependencies")) | ||||||
|  |  | ||||||
| 		found, notFound, err := repos.FindPkgs(ctx, vars.Depends) // Поиск зависимостей | 		found, notFound, err := repos.FindPkgs(ctx, vars.Depends) // Поиск зависимостей | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -433,10 +430,9 @@ func buildALRDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVa | |||||||
|  |  | ||||||
| // Функция executeFunctions выполняет специальные функции ALR, такие как version(), prepare() и т.д. | // Функция executeFunctions выполняет специальные функции ALR, такие как version(), prepare() и т.д. | ||||||
| func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Directories, vars *types.BuildVars) (err error) { | 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") | 	version, ok := dec.GetFunc("version") | ||||||
| 	if ok { | 	if ok { | ||||||
| 		log.Info("Executing version()").Send() | 		slog.Info(gotext.Get("Executing version()")) | ||||||
|  |  | ||||||
| 		buf := &bytes.Buffer{} | 		buf := &bytes.Buffer{} | ||||||
|  |  | ||||||
| @@ -456,12 +452,12 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire | |||||||
| 		} | 		} | ||||||
| 		vars.Version = newVer | 		vars.Version = newVer | ||||||
|  |  | ||||||
| 		log.Info("Updating version").Str("new", newVer).Send() | 		slog.Info("Updating version", "new", newVer) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	prepare, ok := dec.GetFunc("prepare") | 	prepare, ok := dec.GetFunc("prepare") | ||||||
| 	if ok { | 	if ok { | ||||||
| 		log.Info("Executing prepare()").Send() | 		slog.Info(gotext.Get("Executing prepare()")) | ||||||
|  |  | ||||||
| 		err = prepare(ctx, interp.Dir(dirs.SrcDir)) | 		err = prepare(ctx, interp.Dir(dirs.SrcDir)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -471,7 +467,7 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire | |||||||
|  |  | ||||||
| 	build, ok := dec.GetFunc("build") | 	build, ok := dec.GetFunc("build") | ||||||
| 	if ok { | 	if ok { | ||||||
| 		log.Info("Executing build()").Send() | 		slog.Info(gotext.Get("Executing build()")) | ||||||
|  |  | ||||||
| 		err = build(ctx, interp.Dir(dirs.SrcDir)) | 		err = build(ctx, interp.Dir(dirs.SrcDir)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -483,17 +479,18 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire | |||||||
| 	for { | 	for { | ||||||
| 		packageFn, ok := dec.GetFunc("package") | 		packageFn, ok := dec.GetFunc("package") | ||||||
| 		if ok { | 		if ok { | ||||||
| 			log.Info("Executing package()").Send() | 			slog.Info(gotext.Get("Executing package()")) | ||||||
| 			err = packageFn(ctx, interp.Dir(dirs.SrcDir)) | 			err = packageFn(ctx, interp.Dir(dirs.SrcDir)) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		/* | ||||||
| 			// Проверка на наличие дополнительных функций package_* | 			// Проверка на наличие дополнительных функций package_* | ||||||
| 			packageFuncName := "package_" | 			packageFuncName := "package_" | ||||||
| 			if packageFunc, ok := dec.GetFunc(packageFuncName); ok { | 			if packageFunc, ok := dec.GetFunc(packageFuncName); ok { | ||||||
| 			log.Info("Executing " + packageFuncName).Send() | 				slog.Info("Executing " + packageFuncName) | ||||||
| 				err = packageFunc(ctx, interp.Dir(dirs.SrcDir)) | 				err = packageFunc(ctx, interp.Dir(dirs.SrcDir)) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return err | 					return err | ||||||
| @@ -501,6 +498,8 @@ func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Dire | |||||||
| 			} else { | 			} else { | ||||||
| 				break // Если больше нет функций package_*, выходим из цикла | 				break // Если больше нет функций package_*, выходим из цикла | ||||||
| 			} | 			} | ||||||
|  | 		*/ | ||||||
|  | 		break | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| @@ -555,7 +554,7 @@ func buildPkgMetadata(ctx context.Context, vars *types.BuildVars, dirs types.Dir | |||||||
| 				return nil, err | 				return nil, err | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} 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 | 				return nil, err | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} 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 загружает исходники скрипта. | // Функция getSources загружает исходники скрипта. | ||||||
| func getSources(ctx context.Context, dirs types.Directories, bv *types.BuildVars) error { | func getSources(ctx context.Context, dirs types.Directories, bv *types.BuildVars) error { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
| 	if len(bv.Sources) != len(bv.Checksums) { | 	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 { | 	for i, src := range bv.Sources { | ||||||
|   | |||||||
| @@ -19,21 +19,20 @@ package build | |||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
| 	"path" | 	"path" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/goreleaser/nfpm/v2" | 	"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/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 { | 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 { | 	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 | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -64,7 +63,7 @@ func rpmFindDependencies(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Dir | |||||||
| 	cmd.Stdout = &out | 	cmd.Stdout = &out | ||||||
| 	cmd.Stderr = &stderr | 	cmd.Stderr = &stderr | ||||||
| 	if err := cmd.Run(); err != nil { | 	if err := cmd.Run(); err != nil { | ||||||
| 		log.Error(stderr.String()).Send() | 		slog.Error(stderr.String()) | ||||||
| 		return err | 		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 { | 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) { | 	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) | 		pkgInfo.Overridables.Provides = append(pkgInfo.Overridables.Provides, dep) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func rpmFindRequires(ctx context.Context, pkgInfo *nfpm.Info, dirs types.Directories) error { | 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) { | 	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) | 		pkgInfo.Overridables.Depends = append(pkgInfo.Overridables.Depends, dep) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,24 +21,26 @@ package build | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"log/slog" | ||||||
|  | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
|  |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // InstallPkgs устанавливает нативные пакеты с использованием менеджера пакетов, | // InstallPkgs устанавливает нативные пакеты с использованием менеджера пакетов, | ||||||
| // затем строит и устанавливает пакеты ALR | // затем строит и устанавливает пакеты ALR | ||||||
| func InstallPkgs(ctx context.Context, alrPkgs []db.Package, nativePkgs []string, opts types.BuildOpts) { | func InstallPkgs(ctx context.Context, alrPkgs []db.Package, nativePkgs []string, opts types.BuildOpts) { | ||||||
| 	log := loggerctx.From(ctx) // Инициализируем логгер из контекста |  | ||||||
|  |  | ||||||
| 	if len(nativePkgs) > 0 { | 	if len(nativePkgs) > 0 { | ||||||
| 		err := opts.Manager.Install(nil, nativePkgs...) | 		err := opts.Manager.Install(nil, nativePkgs...) | ||||||
| 		// Если есть нативные пакеты, выполняем их установку | 		// Если есть нативные пакеты, выполняем их установку | ||||||
| 		if err != nil { | 		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 скрипты сборки | // InstallScripts строит и устанавливает переданные alr скрипты сборки | ||||||
| func InstallScripts(ctx context.Context, scripts []string, opts types.BuildOpts) { | func InstallScripts(ctx context.Context, scripts []string, opts types.BuildOpts) { | ||||||
| 	log := loggerctx.From(ctx) // Получаем логгер из контекста |  | ||||||
| 	for _, script := range scripts { | 	for _, script := range scripts { | ||||||
| 		opts.Script = script // Устанавливаем текущий скрипт в опции | 		opts.Script = script // Устанавливаем текущий скрипт в опции | ||||||
| 		builtPkgs, _, err := BuildPackage(ctx, opts) | 		builtPkgs, _, err := BuildPackage(ctx, opts) | ||||||
| 		// Выполняем сборку пакета | 		// Выполняем сборку пакета | ||||||
| 		if err != nil { | 		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...) | 		err = opts.Manager.InstallLocal(nil, builtPkgs...) | ||||||
| 		// Устанавливаем локально собранные пакеты | 		// Устанавливаем локально собранные пакеты | ||||||
| 		if err != nil { | 		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 ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"log/slog" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| @@ -31,6 +32,7 @@ import ( | |||||||
| 	"github.com/go-git/go-billy/v5/osfs" | 	"github.com/go-git/go-billy/v5/osfs" | ||||||
| 	"github.com/go-git/go-git/v5" | 	"github.com/go-git/go-git/v5" | ||||||
| 	"github.com/go-git/go-git/v5/plumbing" | 	"github.com/go-git/go-git/v5/plumbing" | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/pelletier/go-toml/v2" | 	"github.com/pelletier/go-toml/v2" | ||||||
| 	"go.elara.ws/vercmp" | 	"go.elara.ws/vercmp" | ||||||
| 	"mvdan.cc/sh/v3/expand" | 	"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/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/shutils/handlers" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type actionType uint8 | type actionType uint8 | ||||||
| @@ -61,8 +62,6 @@ type action struct { | |||||||
| // In this case, only changed packages will be processed if possible. | // 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. | // 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 { | func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error { | ||||||
| 	log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 	if repos == nil { | 	if repos == nil { | ||||||
| 		repos = rs.cfg.Repos(ctx) | 		repos = rs.cfg.Repos(ctx) | ||||||
| 	} | 	} | ||||||
| @@ -73,7 +72,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error { | |||||||
| 			return err | 			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) | 		repoDir := filepath.Join(config.GetPaths(ctx).RepoDir, repo.Name) | ||||||
|  |  | ||||||
| 		var repoFS billy.Filesystem | 		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}) | 			err = w.PullContext(ctx, &git.PullOptions{Progress: os.Stderr}) | ||||||
| 			if errors.Is(err, git.NoErrAlreadyUpToDate) { | 			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 { | 			} else if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| @@ -154,7 +153,7 @@ func (rs *Repos) Pull(ctx context.Context, repos []types.Repo) error { | |||||||
|  |  | ||||||
| 		fl, err := repoFS.Open("alr-repo.toml") | 		fl, err := repoFS.Open("alr-repo.toml") | ||||||
| 		if err != nil { | 		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 | 			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". | 		// to compare it to the repo version, so only compare versions with the "v". | ||||||
| 		if strings.HasPrefix(config.Version, "v") { | 		if strings.HasPrefix(config.Version, "v") { | ||||||
| 			if vercmp.Compare(config.Version, repoCfg.Repo.MinVersion) == -1 { | 			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 | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"log/slog" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/pelletier/go-toml/v2" | 	"github.com/pelletier/go-toml/v2" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| 	"golang.org/x/exp/slices" | 	"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/config" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/db" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -54,7 +55,6 @@ var addrepoCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		name := c.String("name") | 		name := c.String("name") | ||||||
| 		repoURL := c.String("url") | 		repoURL := c.String("url") | ||||||
| @@ -63,7 +63,8 @@ var addrepoCmd = &cli.Command{ | |||||||
|  |  | ||||||
| 		for _, repo := range cfg.Repos { | 		for _, repo := range cfg.Repos { | ||||||
| 			if repo.URL == repoURL { | 			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) | 		cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath) | ||||||
| 		if err != nil { | 		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) | 		err = toml.NewEncoder(cfgFl).Encode(cfg) | ||||||
| 		if err != nil { | 		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) | 		err = repos.Pull(ctx, cfg.Repos) | ||||||
| 		if err != nil { | 		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 | 		return nil | ||||||
| @@ -105,7 +109,6 @@ var removerepoCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		name := c.String("name") | 		name := c.String("name") | ||||||
| 		cfg := config.Config(ctx) | 		cfg := config.Config(ctx) | ||||||
| @@ -119,29 +122,34 @@ var removerepoCmd = &cli.Command{ | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if !found { | 		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) | 		cfg.Repos = slices.Delete(cfg.Repos, index, index+1) | ||||||
|  |  | ||||||
| 		cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath) | 		cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath) | ||||||
| 		if err != nil { | 		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) | 		err = toml.NewEncoder(cfgFl).Encode(&cfg) | ||||||
| 		if err != nil { | 		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)) | 		err = os.RemoveAll(filepath.Join(config.GetPaths(ctx).RepoDir, name)) | ||||||
| 		if err != nil { | 		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) | 		err = db.DeletePkgs(ctx, "repository = ?", name) | ||||||
| 		if err != nil { | 		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 | 		return nil | ||||||
| @@ -154,10 +162,10 @@ var refreshCmd = &cli.Command{ | |||||||
| 	Aliases: []string{"ref"}, | 	Aliases: []string{"ref"}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
| 		err := repos.Pull(ctx, config.Config(ctx).Repos) | 		err := repos.Pull(ctx, config.Config(ctx).Repos) | ||||||
| 		if err != nil { | 		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 | 		return nil | ||||||
| 	}, | 	}, | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								upgrade.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								upgrade.go
									
									
									
									
									
								
							| @@ -22,8 +22,12 @@ package main | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"log/slog" | ||||||
|  | 	"os" | ||||||
|  |  | ||||||
|  | 	"github.com/leonelquinteros/gotext" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
|  | 	"go.elara.ws/logger/log" | ||||||
| 	"go.elara.ws/vercmp" | 	"go.elara.ws/vercmp" | ||||||
| 	"golang.org/x/exp/maps" | 	"golang.org/x/exp/maps" | ||||||
| 	"golang.org/x/exp/slices" | 	"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/internal/types" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/loggerctx" |  | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" | ||||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | 	"gitea.plemya-x.ru/Plemya-x/ALR/pkg/repos" | ||||||
| ) | ) | ||||||
| @@ -51,26 +54,29 @@ var upgradeCmd = &cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		ctx := c.Context | 		ctx := c.Context | ||||||
| 		log := loggerctx.From(ctx) |  | ||||||
|  |  | ||||||
| 		info, err := distro.ParseOSRelease(ctx) | 		info, err := distro.ParseOSRelease(ctx) | ||||||
| 		if err != nil { | 		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() | 		mgr := manager.Detect() | ||||||
| 		if mgr == nil { | 		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) | 		err = repos.Pull(ctx, config.Config(ctx).Repos) | ||||||
| 		if err != nil { | 		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) | 		updates, err := checkForUpdates(ctx, mgr, info) | ||||||
| 		if err != nil { | 		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 { | 		if len(updates) > 0 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user