Pass logger around in a context
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
This commit is contained in:
parent
1b8c05b257
commit
d86776feb1
13
build.go
13
build.go
|
@ -23,11 +23,11 @@ import (
|
|||
"path/filepath"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/osutils"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/build"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
)
|
||||
|
@ -54,12 +54,15 @@ var buildCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
script := c.String("script")
|
||||
if c.String("package") != "" {
|
||||
script = filepath.Join(config.GetPaths().RepoDir, c.String("package"), "lure.sh")
|
||||
script = filepath.Join(config.GetPaths(ctx).RepoDir, c.String("package"), "lure.sh")
|
||||
}
|
||||
|
||||
err := repos.Pull(c.Context, config.Config().Repos)
|
||||
err := repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repositories").Err(err).Send()
|
||||
}
|
||||
|
@ -69,7 +72,7 @@ var buildCmd = &cli.Command{
|
|||
log.Fatal("Unable to detect a supported package manager on the system").Send()
|
||||
}
|
||||
|
||||
pkgPaths, _, err := build.BuildPackage(c.Context, types.BuildOpts{
|
||||
pkgPaths, _, err := build.BuildPackage(ctx, types.BuildOpts{
|
||||
Script: script,
|
||||
Manager: mgr,
|
||||
Clean: c.Bool("clean"),
|
||||
|
|
9
fix.go
9
fix.go
|
@ -22,9 +22,9 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
)
|
||||
|
||||
|
@ -32,8 +32,11 @@ var fixCmd = &cli.Command{
|
|||
Name: "fix",
|
||||
Usage: "Attempt to fix problems with LURE",
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
db.Close()
|
||||
paths := config.GetPaths()
|
||||
paths := config.GetPaths(ctx)
|
||||
|
||||
log.Info("Removing cache directory").Send()
|
||||
|
||||
|
@ -49,7 +52,7 @@ var fixCmd = &cli.Command{
|
|||
log.Fatal("Unable to create new cache directory").Err(err).Send()
|
||||
}
|
||||
|
||||
err = repos.Pull(c.Context, config.Config().Repos)
|
||||
err = repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repos").Err(err).Send()
|
||||
}
|
||||
|
|
16
info.go
16
info.go
|
@ -22,13 +22,12 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
|
||||
"go.elara.ws/lure/internal/log"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/cliutils"
|
||||
"go.elara.ws/lure/internal/overrides"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/overrides"
|
||||
"go.elara.ws/lure/pkg/distro"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
@ -44,17 +43,20 @@ var infoCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
args := c.Args()
|
||||
if args.Len() < 1 {
|
||||
log.Fatalf("Command info expected at least 1 argument, got %d", args.Len()).Send()
|
||||
}
|
||||
|
||||
err := repos.Pull(c.Context, config.Config().Repos)
|
||||
err := repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repositories").Err(err).Send()
|
||||
}
|
||||
|
||||
found, _, err := repos.FindPkgs(args.Slice())
|
||||
found, _, err := repos.FindPkgs(ctx, args.Slice())
|
||||
if err != nil {
|
||||
log.Fatal("Error finding packages").Err(err).Send()
|
||||
}
|
||||
|
@ -63,13 +65,13 @@ var infoCmd = &cli.Command{
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
pkgs := cliutils.FlattenPkgs(found, "show", c.Bool("interactive"))
|
||||
pkgs := cliutils.FlattenPkgs(ctx, found, "show", c.Bool("interactive"))
|
||||
|
||||
var names []string
|
||||
all := c.Bool("all")
|
||||
|
||||
if !all {
|
||||
info, err := distro.ParseOSRelease(c.Context)
|
||||
info, err := distro.ParseOSRelease(ctx)
|
||||
if err != nil {
|
||||
log.Fatal("Error parsing os-release file").Err(err).Send()
|
||||
}
|
||||
|
|
22
install.go
22
install.go
|
@ -23,11 +23,11 @@ import (
|
|||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/cliutils"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/build"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/build"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
)
|
||||
|
@ -44,6 +44,9 @@ var installCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
args := c.Args()
|
||||
if args.Len() < 1 {
|
||||
log.Fatalf("Command install expected at least 1 argument, got %d", args.Len()).Send()
|
||||
|
@ -54,18 +57,18 @@ var installCmd = &cli.Command{
|
|||
log.Fatal("Unable to detect a supported package manager on the system").Send()
|
||||
}
|
||||
|
||||
err := repos.Pull(c.Context, config.Config().Repos)
|
||||
err := repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repositories").Err(err).Send()
|
||||
}
|
||||
|
||||
found, notFound, err := repos.FindPkgs(args.Slice())
|
||||
found, notFound, err := repos.FindPkgs(ctx, args.Slice())
|
||||
if err != nil {
|
||||
log.Fatal("Error finding packages").Err(err).Send()
|
||||
}
|
||||
|
||||
pkgs := cliutils.FlattenPkgs(found, "install", c.Bool("interactive"))
|
||||
build.InstallPkgs(c.Context, pkgs, notFound, types.BuildOpts{
|
||||
pkgs := cliutils.FlattenPkgs(ctx, found, "install", c.Bool("interactive"))
|
||||
build.InstallPkgs(ctx, pkgs, notFound, types.BuildOpts{
|
||||
Manager: mgr,
|
||||
Clean: c.Bool("clean"),
|
||||
Interactive: c.Bool("interactive"),
|
||||
|
@ -73,7 +76,8 @@ var installCmd = &cli.Command{
|
|||
return nil
|
||||
},
|
||||
BashComplete: func(c *cli.Context) {
|
||||
result, err := db.GetPkgs("true")
|
||||
log := loggerctx.From(c.Context)
|
||||
result, err := db.GetPkgs(c.Context, "true")
|
||||
if err != nil {
|
||||
log.Fatal("Error getting packages").Err(err).Send()
|
||||
}
|
||||
|
@ -96,6 +100,8 @@ var removeCmd = &cli.Command{
|
|||
Usage: "Remove an installed package",
|
||||
Aliases: []string{"rm"},
|
||||
Action: func(c *cli.Context) error {
|
||||
log := loggerctx.From(c.Context)
|
||||
|
||||
args := c.Args()
|
||||
if args.Len() < 1 {
|
||||
log.Fatalf("Command remove expected at least 1 argument, got %d", args.Len()).Send()
|
||||
|
|
|
@ -19,24 +19,25 @@
|
|||
package cliutils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/pager"
|
||||
"go.elara.ws/lure/internal/translations"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/pager"
|
||||
"go.elara.ws/lure/internal/translations"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
)
|
||||
|
||||
// YesNoPrompt asks the user a yes or no question, using def as the default answer
|
||||
func YesNoPrompt(msg string, interactive, def bool) (bool, error) {
|
||||
func YesNoPrompt(ctx context.Context, msg string, interactive, def bool) (bool, error) {
|
||||
if interactive {
|
||||
var answer bool
|
||||
err := survey.AskOne(
|
||||
&survey.Confirm{
|
||||
Message: translations.Translator().TranslateTo(msg, config.Language()),
|
||||
Message: translations.Translator(ctx).TranslateTo(msg, config.Language(ctx)),
|
||||
Default: def,
|
||||
},
|
||||
&answer,
|
||||
|
@ -50,13 +51,15 @@ func YesNoPrompt(msg string, interactive, def bool) (bool, error) {
|
|||
// PromptViewScript asks the user if they'd like to see a script,
|
||||
// shows it if they answer yes, then asks if they'd still like to
|
||||
// continue, and exits if they answer no.
|
||||
func PromptViewScript(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 {
|
||||
return nil
|
||||
}
|
||||
|
||||
scriptPrompt := translations.Translator().TranslateTo("Would you like to view the build script for", config.Language()) + " " + name
|
||||
view, err := YesNoPrompt(scriptPrompt, interactive, false)
|
||||
scriptPrompt := translations.Translator(ctx).TranslateTo("Would you like to view the build script for", config.Language(ctx)) + " " + name
|
||||
view, err := YesNoPrompt(ctx, scriptPrompt, interactive, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -67,13 +70,13 @@ func PromptViewScript(script, name, style string, interactive bool) error {
|
|||
return err
|
||||
}
|
||||
|
||||
cont, err := YesNoPrompt("Would you still like to continue?", interactive, false)
|
||||
cont, err := YesNoPrompt(ctx, "Would you still like to continue?", interactive, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !cont {
|
||||
log.Fatal(translations.Translator().TranslateTo("User chose not to continue after reading script", config.Language())).Send()
|
||||
log.Fatal(translations.Translator(ctx).TranslateTo("User chose not to continue after reading script", config.Language(ctx))).Send()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,11 +103,12 @@ func ShowScript(path, name, style string) error {
|
|||
|
||||
// FlattenPkgs attempts to flatten the a map of slices of packages into a single slice
|
||||
// of packages by prompting the user if multiple packages match.
|
||||
func FlattenPkgs(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
|
||||
for _, pkgs := range found {
|
||||
if len(pkgs) > 1 && interactive {
|
||||
choice, err := PkgPrompt(pkgs, verb, interactive)
|
||||
choice, err := PkgPrompt(ctx, pkgs, verb, interactive)
|
||||
if err != nil {
|
||||
log.Fatal("Error prompting for choice of package").Send()
|
||||
}
|
||||
|
@ -117,7 +121,7 @@ func FlattenPkgs(found map[string][]db.Package, verb string, interactive bool) [
|
|||
}
|
||||
|
||||
// PkgPrompt asks the user to choose between multiple packages.
|
||||
func PkgPrompt(options []db.Package, verb string, interactive bool) (db.Package, error) {
|
||||
func PkgPrompt(ctx context.Context, options []db.Package, verb string, interactive bool) (db.Package, error) {
|
||||
if !interactive {
|
||||
return options[0], nil
|
||||
}
|
||||
|
@ -129,7 +133,7 @@ func PkgPrompt(options []db.Package, verb string, interactive bool) (db.Package,
|
|||
|
||||
prompt := &survey.Select{
|
||||
Options: names,
|
||||
Message: translations.Translator().TranslateTo("Choose which package to "+verb, config.Language()),
|
||||
Message: translations.Translator(ctx).TranslateTo("Choose which package to "+verb, config.Language(ctx)),
|
||||
}
|
||||
|
||||
var choice int
|
||||
|
@ -143,14 +147,14 @@ func PkgPrompt(options []db.Package, verb string, interactive bool) (db.Package,
|
|||
|
||||
// ChooseOptDepends asks the user to choose between multiple optional dependencies.
|
||||
// The user may choose multiple items.
|
||||
func ChooseOptDepends(options []string, verb string, interactive bool) ([]string, error) {
|
||||
func ChooseOptDepends(ctx context.Context, options []string, verb string, interactive bool) ([]string, error) {
|
||||
if !interactive {
|
||||
return []string{}, nil
|
||||
}
|
||||
|
||||
prompt := &survey.MultiSelect{
|
||||
Options: options,
|
||||
Message: translations.Translator().TranslateTo("Choose which optional package(s) to install", config.Language()),
|
||||
Message: translations.Translator(ctx).TranslateTo("Choose which optional package(s) to install", config.Language(ctx)),
|
||||
}
|
||||
|
||||
var choices []int
|
||||
|
|
|
@ -19,11 +19,12 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
)
|
||||
|
||||
var defaultConfig = &types.Config{
|
||||
|
@ -43,9 +44,10 @@ var config *types.Config
|
|||
// Config returns a LURE configuration struct.
|
||||
// The first time it's called, it'll load the config from a file.
|
||||
// Subsequent calls will just return the same value.
|
||||
func Config() *types.Config {
|
||||
func Config(ctx context.Context) *types.Config {
|
||||
log := loggerctx.From(ctx)
|
||||
if config == nil {
|
||||
cfgFl, err := os.Open(GetPaths().ConfigPath)
|
||||
cfgFl, err := os.Open(GetPaths(ctx).ConfigPath)
|
||||
if err != nil {
|
||||
log.Warn("Error opening config file, using defaults").Err(err).Send()
|
||||
return defaultConfig
|
||||
|
|
|
@ -19,10 +19,11 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
|
@ -35,7 +36,8 @@ var (
|
|||
// The first time it's called, it'll detect the langauge based on
|
||||
// the $LANG environment variable.
|
||||
// Subsequent calls will just return the same value.
|
||||
func Language() language.Tag {
|
||||
func Language(ctx context.Context) language.Tag {
|
||||
log := loggerctx.From(ctx)
|
||||
if !langSet {
|
||||
syslang := SystemLang()
|
||||
tag, err := language.Parse(syslang)
|
||||
|
|
|
@ -19,11 +19,12 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
)
|
||||
|
||||
// Paths contains various paths used by LURE
|
||||
|
@ -42,7 +43,8 @@ var paths *Paths
|
|||
// The first time it's called, it'll generate the struct
|
||||
// using information from the system.
|
||||
// Subsequent calls will return the same value.
|
||||
func GetPaths() *Paths {
|
||||
func GetPaths(ctx context.Context) *Paths {
|
||||
log := loggerctx.From(ctx)
|
||||
if paths == nil {
|
||||
paths = &Paths{}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
|
@ -26,8 +27,8 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"golang.org/x/exp/slices"
|
||||
"modernc.org/sqlite"
|
||||
)
|
||||
|
@ -72,11 +73,12 @@ var (
|
|||
// DB returns the LURE database.
|
||||
// The first time it's called, it opens the SQLite database file.
|
||||
// Subsequent calls return the same connection.
|
||||
func DB() *sqlx.DB {
|
||||
func DB(ctx context.Context) *sqlx.DB {
|
||||
log := loggerctx.From(ctx)
|
||||
if conn != nil && !closed {
|
||||
return conn
|
||||
}
|
||||
db, err := open(config.GetPaths().DBPath)
|
||||
db, err := open(ctx, config.GetPaths(ctx).DBPath)
|
||||
if err != nil {
|
||||
log.Fatal("Error opening database").Err(err).Send()
|
||||
}
|
||||
|
@ -84,7 +86,7 @@ func DB() *sqlx.DB {
|
|||
return conn
|
||||
}
|
||||
|
||||
func open(dsn string) (*sqlx.DB, error) {
|
||||
func open(ctx context.Context, dsn string) (*sqlx.DB, error) {
|
||||
db, err := sqlx.Open("sqlite", dsn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -92,7 +94,7 @@ func open(dsn string) (*sqlx.DB, error) {
|
|||
conn = db
|
||||
closed = false
|
||||
|
||||
err = initDB(dsn)
|
||||
err = initDB(ctx, dsn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -111,9 +113,10 @@ func Close() error {
|
|||
}
|
||||
|
||||
// initDB initializes the database
|
||||
func initDB(dsn string) error {
|
||||
func initDB(ctx context.Context, dsn string) error {
|
||||
log := loggerctx.From(ctx)
|
||||
conn = conn.Unsafe()
|
||||
_, err := conn.Exec(`
|
||||
_, err := conn.ExecContext(ctx, `
|
||||
CREATE TABLE IF NOT EXISTS pkgs (
|
||||
name TEXT NOT NULL,
|
||||
repository TEXT NOT NULL,
|
||||
|
@ -142,33 +145,33 @@ func initDB(dsn string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
ver, ok := GetVersion()
|
||||
ver, ok := GetVersion(ctx)
|
||||
if ok && ver != CurrentVersion {
|
||||
log.Warn("Database version mismatch; resetting").Int("version", ver).Int("expected", CurrentVersion).Send()
|
||||
reset()
|
||||
return initDB(dsn)
|
||||
reset(ctx)
|
||||
return initDB(ctx, dsn)
|
||||
} else if !ok {
|
||||
log.Warn("Database version does not exist. Run lure fix if something isn't working.").Send()
|
||||
return addVersion(CurrentVersion)
|
||||
return addVersion(ctx, CurrentVersion)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// reset drops all the database tables
|
||||
func reset() error {
|
||||
_, err := DB().Exec("DROP TABLE IF EXISTS pkgs;")
|
||||
func reset(ctx context.Context) error {
|
||||
_, err := DB(ctx).ExecContext(ctx, "DROP TABLE IF EXISTS pkgs;")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = DB().Exec("DROP TABLE IF EXISTS lure_db_version;")
|
||||
_, err = DB(ctx).ExecContext(ctx, "DROP TABLE IF EXISTS lure_db_version;")
|
||||
return err
|
||||
}
|
||||
|
||||
// IsEmpty returns true if the database has no packages in it, otherwise it returns false.
|
||||
func IsEmpty() bool {
|
||||
func IsEmpty(ctx context.Context) bool {
|
||||
var count int
|
||||
err := DB().Get(&count, "SELECT count(1) FROM pkgs;")
|
||||
err := DB(ctx).GetContext(ctx, &count, "SELECT count(1) FROM pkgs;")
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
|
@ -177,23 +180,23 @@ func IsEmpty() bool {
|
|||
|
||||
// GetVersion returns the database version and a boolean indicating
|
||||
// whether the database contained a version number
|
||||
func GetVersion() (int, bool) {
|
||||
func GetVersion(ctx context.Context) (int, bool) {
|
||||
var ver version
|
||||
err := DB().Get(&ver, "SELECT * FROM lure_db_version LIMIT 1;")
|
||||
err := DB(ctx).GetContext(ctx, &ver, "SELECT * FROM lure_db_version LIMIT 1;")
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return ver.Version, true
|
||||
}
|
||||
|
||||
func addVersion(ver int) error {
|
||||
_, err := DB().Exec(`INSERT INTO lure_db_version(version) VALUES (?);`, ver)
|
||||
func addVersion(ctx context.Context, ver int) error {
|
||||
_, err := DB(ctx).ExecContext(ctx, `INSERT INTO lure_db_version(version) VALUES (?);`, ver)
|
||||
return err
|
||||
}
|
||||
|
||||
// InsertPackage adds a package to the database
|
||||
func InsertPackage(pkg Package) error {
|
||||
_, err := DB().NamedExec(`
|
||||
func InsertPackage(ctx context.Context, pkg Package) error {
|
||||
_, err := DB(ctx).NamedExecContext(ctx, `
|
||||
INSERT OR REPLACE INTO pkgs (
|
||||
name,
|
||||
repository,
|
||||
|
@ -234,8 +237,8 @@ func InsertPackage(pkg Package) error {
|
|||
}
|
||||
|
||||
// GetPkgs returns a result containing packages that match the where conditions
|
||||
func GetPkgs(where string, args ...any) (*sqlx.Rows, error) {
|
||||
stream, err := DB().Queryx("SELECT * FROM pkgs WHERE "+where, args...)
|
||||
func GetPkgs(ctx context.Context, where string, args ...any) (*sqlx.Rows, error) {
|
||||
stream, err := DB(ctx).QueryxContext(ctx, "SELECT * FROM pkgs WHERE "+where, args...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -243,15 +246,15 @@ func GetPkgs(where string, args ...any) (*sqlx.Rows, error) {
|
|||
}
|
||||
|
||||
// GetPkg returns a single package that matches the where conditions
|
||||
func GetPkg(where string, args ...any) (*Package, error) {
|
||||
func GetPkg(ctx context.Context, where string, args ...any) (*Package, error) {
|
||||
out := &Package{}
|
||||
err := DB().Get(out, "SELECT * FROM pkgs WHERE "+where+" LIMIT 1", args...)
|
||||
err := DB(ctx).GetContext(ctx, out, "SELECT * FROM pkgs WHERE "+where+" LIMIT 1", args...)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// DeletePkgs deletes all packages matching the where conditions
|
||||
func DeletePkgs(where string, args ...any) error {
|
||||
_, err := DB().Exec("DELETE FROM pkgs WHERE "+where, args...)
|
||||
func DeletePkgs(ctx context.Context, where string, args ...any) error {
|
||||
_, err := DB(ctx).ExecContext(ctx, "DELETE FROM pkgs WHERE "+where, args...)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ import (
|
|||
"github.com/PuerkitoBio/purell"
|
||||
"github.com/vmihailenco/msgpack/v5"
|
||||
"go.elara.ws/lure/internal/dlcache"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
|
@ -154,6 +154,7 @@ type UpdatingDownloader interface {
|
|||
// it downloads the source to a new cache directory and links it
|
||||
// to the destination.
|
||||
func Download(ctx context.Context, opts Options) (err error) {
|
||||
log := loggerctx.From(ctx)
|
||||
normalized, err := normalizeURL(opts.URL)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -168,7 +169,7 @@ func Download(ctx context.Context, opts Options) (err error) {
|
|||
}
|
||||
|
||||
var t Type
|
||||
cacheDir, ok := dlcache.Get(opts.URL)
|
||||
cacheDir, ok := dlcache.Get(ctx, opts.URL)
|
||||
if ok {
|
||||
var updated bool
|
||||
if d, ok := d.(UpdatingDownloader); ok {
|
||||
|
@ -216,7 +217,7 @@ func Download(ctx context.Context, opts Options) (err error) {
|
|||
|
||||
log.Info("Downloading source").Str("source", opts.Name).Str("downloader", d.Name()).Send()
|
||||
|
||||
cacheDir, err = dlcache.New(opts.URL)
|
||||
cacheDir, err = dlcache.New(ctx, opts.URL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package dlcache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"io"
|
||||
|
@ -29,19 +30,19 @@ import (
|
|||
)
|
||||
|
||||
// BasePath returns the base path of the download cache
|
||||
func BasePath() string {
|
||||
return filepath.Join(config.GetPaths().RepoDir, "dl")
|
||||
func BasePath(ctx context.Context) string {
|
||||
return filepath.Join(config.GetPaths(ctx).RepoDir, "dl")
|
||||
}
|
||||
|
||||
// New creates a new directory with the given ID in the cache.
|
||||
// If a directory with the same ID already exists,
|
||||
// it will be deleted before creating a new one.
|
||||
func New(id string) (string, error) {
|
||||
func New(ctx context.Context, id string) (string, error) {
|
||||
h, err := hashID(id)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
itemPath := filepath.Join(BasePath(), h)
|
||||
itemPath := filepath.Join(BasePath(ctx), h)
|
||||
|
||||
fi, err := os.Stat(itemPath)
|
||||
if err == nil || (fi != nil && !fi.IsDir()) {
|
||||
|
@ -64,12 +65,12 @@ func New(id string) (string, error) {
|
|||
// returns the directory and true. If it
|
||||
// does not exist, it returns an empty string
|
||||
// and false.
|
||||
func Get(id string) (string, bool) {
|
||||
func Get(ctx context.Context, id string) (string, bool) {
|
||||
h, err := hashID(id)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
itemPath := filepath.Join(BasePath(), h)
|
||||
itemPath := filepath.Join(BasePath(ctx), h)
|
||||
|
||||
_, err = os.Stat(itemPath)
|
||||
if err != nil {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package dlcache_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"io"
|
||||
|
@ -26,8 +27,8 @@ import (
|
|||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"go.elara.ws/lure/internal/dlcache"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/dlcache"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -35,7 +36,7 @@ func init() {
|
|||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
config.GetPaths().RepoDir = dir
|
||||
config.GetPaths(context.Background()).RepoDir = dir
|
||||
}
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
/*
|
||||
* LURE - Linux User REpository
|
||||
* Copyright (C) 2023 Elara Musayelyan
|
||||
*
|
||||
* 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 log
|
||||
|
||||
import (
|
||||
"go.elara.ws/logger"
|
||||
)
|
||||
|
||||
var Logger logger.Logger = logger.NewNop()
|
||||
|
||||
// NoPanic prevents the logger from panicking on panic events
|
||||
func NoPanic() {
|
||||
Logger.NoPanic()
|
||||
}
|
||||
|
||||
// NoExit prevents the logger from exiting on fatal events
|
||||
func NoExit() {
|
||||
Logger.NoExit()
|
||||
}
|
||||
|
||||
// SetLevel sets the log level of the logger
|
||||
func SetLevel(l logger.LogLevel) {
|
||||
Logger.SetLevel(l)
|
||||
}
|
||||
|
||||
// Debug creates a new debug event with the given message
|
||||
func Debug(msg string) logger.LogBuilder {
|
||||
return Logger.Debug(msg)
|
||||
}
|
||||
|
||||
// Debugf creates a new debug event with the formatted message
|
||||
func Debugf(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Debugf(format, v...)
|
||||
}
|
||||
|
||||
// Info creates a new info event with the given message
|
||||
func Info(msg string) logger.LogBuilder {
|
||||
return Logger.Info(msg)
|
||||
}
|
||||
|
||||
// Infof creates a new info event with the formatted message
|
||||
func Infof(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Infof(format, v...)
|
||||
}
|
||||
|
||||
// Warn creates a new warn event with the given message
|
||||
func Warn(msg string) logger.LogBuilder {
|
||||
return Logger.Warn(msg)
|
||||
}
|
||||
|
||||
// Warnf creates a new warn event with the formatted message
|
||||
func Warnf(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Warnf(format, v...)
|
||||
}
|
||||
|
||||
// Error creates a new error event with the given message
|
||||
func Error(msg string) logger.LogBuilder {
|
||||
return Logger.Error(msg)
|
||||
}
|
||||
|
||||
// Errorf creates a new error event with the formatted message
|
||||
func Errorf(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Errorf(format, v...)
|
||||
}
|
||||
|
||||
// Fatal creates a new fatal event with the given message
|
||||
func Fatal(msg string) logger.LogBuilder {
|
||||
return Logger.Fatal(msg)
|
||||
}
|
||||
|
||||
// Fatalf creates a new fatal event with the formatted message
|
||||
func Fatalf(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Fatalf(format, v...)
|
||||
}
|
||||
|
||||
// Fatal creates a new fatal event with the given message
|
||||
func Panic(msg string) logger.LogBuilder {
|
||||
return Logger.Panic(msg)
|
||||
}
|
||||
|
||||
// Fatalf creates a new fatal event with the formatted message
|
||||
func Panicf(format string, v ...any) logger.LogBuilder {
|
||||
return Logger.Panicf(format, v...)
|
||||
}
|
|
@ -19,10 +19,11 @@
|
|||
package translations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"embed"
|
||||
|
||||
"go.elara.ws/logger"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/translate"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
@ -32,7 +33,8 @@ var translationFS embed.FS
|
|||
|
||||
var translator *translate.Translator
|
||||
|
||||
func Translator() *translate.Translator {
|
||||
func Translator(ctx context.Context) *translate.Translator {
|
||||
log := loggerctx.From(ctx)
|
||||
if translator == nil {
|
||||
t, err := translate.NewFromFS(translationFS)
|
||||
if err != nil {
|
||||
|
@ -43,6 +45,6 @@ func Translator() *translate.Translator {
|
|||
return translator
|
||||
}
|
||||
|
||||
func NewLogger(l logger.Logger, lang language.Tag) *translate.TranslatedLogger {
|
||||
return translate.NewLogger(l, *Translator(), lang)
|
||||
func NewLogger(ctx context.Context, l logger.Logger, lang language.Tag) *translate.TranslatedLogger {
|
||||
return translate.NewLogger(l, *Translator(ctx), lang)
|
||||
}
|
||||
|
|
11
list.go
11
list.go
|
@ -22,9 +22,9 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
"golang.org/x/exp/slices"
|
||||
|
@ -41,7 +41,10 @@ var listCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
err := repos.Pull(c.Context, config.Config().Repos)
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
err := repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repositories").Err(err).Send()
|
||||
}
|
||||
|
@ -53,7 +56,7 @@ var listCmd = &cli.Command{
|
|||
args = []any{c.Args().First(), c.Args().First()}
|
||||
}
|
||||
|
||||
result, err := db.GetPkgs(where, args...)
|
||||
result, err := db.GetPkgs(ctx, where, args...)
|
||||
if err != nil {
|
||||
log.Fatal("Error getting packages").Err(err).Send()
|
||||
}
|
||||
|
@ -79,7 +82,7 @@ var listCmd = &cli.Command{
|
|||
return err
|
||||
}
|
||||
|
||||
if slices.Contains(config.Config().IgnorePkgUpdates, pkg.Name) {
|
||||
if slices.Contains(config.Config(ctx).IgnorePkgUpdates, pkg.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
13
main.go
13
main.go
|
@ -28,10 +28,10 @@ import (
|
|||
"github.com/mattn/go-isatty"
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/logger"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/translations"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/translations"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
)
|
||||
|
||||
|
@ -88,16 +88,17 @@ var versionCmd = &cli.Command{
|
|||
}
|
||||
|
||||
func main() {
|
||||
log.Logger = translations.NewLogger(logger.NewCLI(os.Stderr), config.Language())
|
||||
ctx := context.Background()
|
||||
log := translations.NewLogger(ctx, logger.NewCLI(os.Stderr), config.Language(ctx))
|
||||
ctx = loggerctx.With(ctx, log)
|
||||
|
||||
if !config.Config().Unsafe.AllowRunAsRoot && os.Geteuid() == 0 {
|
||||
if !config.Config(ctx).Unsafe.AllowRunAsRoot && os.Geteuid() == 0 {
|
||||
log.Fatal("Running LURE as root is forbidden as it may cause catastrophic damage to your system").Send()
|
||||
}
|
||||
|
||||
// Set the root command to the one set in the LURE config
|
||||
manager.DefaultRootCmd = config.Config().RootCmd
|
||||
manager.DefaultRootCmd = config.Config(ctx).RootCmd
|
||||
|
||||
ctx := context.Background()
|
||||
ctx, cancel := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
|
||||
defer cancel()
|
||||
|
||||
|
|
|
@ -39,16 +39,16 @@ import (
|
|||
"github.com/goreleaser/nfpm/v2"
|
||||
"github.com/goreleaser/nfpm/v2/files"
|
||||
"go.elara.ws/lure/internal/cliutils"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/cpu"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/dl"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/shutils"
|
||||
"go.elara.ws/lure/internal/shutils/decoder"
|
||||
"go.elara.ws/lure/internal/shutils/helpers"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/pkg/distro"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
"mvdan.cc/sh/v3/expand"
|
||||
|
@ -59,6 +59,8 @@ import (
|
|||
// BuildPackage builds the script at the given path. It returns two slices. One contains the paths
|
||||
// to the built package(s), the other contains the names of the built package(s).
|
||||
func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string, error) {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
info, err := distro.ParseOSRelease(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
@ -77,7 +79,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
dirs := getDirs(vars, opts.Script)
|
||||
dirs := getDirs(ctx, vars, opts.Script)
|
||||
|
||||
// If opts.Clean isn't set and we find the package already built,
|
||||
// just return it rather than rebuilding
|
||||
|
@ -93,7 +95,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
|||
}
|
||||
|
||||
// Ask the user if they'd like to see the build script
|
||||
err = cliutils.PromptViewScript(opts.Script, vars.Name, config.Config().PagerStyle, opts.Interactive)
|
||||
err = cliutils.PromptViewScript(ctx, opts.Script, vars.Name, config.Config(ctx).PagerStyle, opts.Interactive)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to prompt user to view build script").Err(err).Send()
|
||||
}
|
||||
|
@ -114,7 +116,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
cont, err := performChecks(vars, opts.Interactive, installed)
|
||||
cont, err := performChecks(ctx, vars, opts.Interactive, installed)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
} else if !cont {
|
||||
|
@ -181,7 +183,7 @@ func BuildPackage(ctx context.Context, opts types.BuildOpts) ([]string, []string
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
err = removeBuildDeps(buildDeps, opts)
|
||||
err = removeBuildDeps(ctx, buildDeps, opts)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
@ -251,8 +253,8 @@ func executeFirstPass(ctx context.Context, info *distro.OSRelease, fl *syntax.Fi
|
|||
}
|
||||
|
||||
// getDirs returns the appropriate directories for the script
|
||||
func getDirs(vars *types.BuildVars, script string) types.Directories {
|
||||
baseDir := filepath.Join(config.GetPaths().PkgsDir, vars.Name)
|
||||
func getDirs(ctx context.Context, vars *types.BuildVars, script string) types.Directories {
|
||||
baseDir := filepath.Join(config.GetPaths(ctx).PkgsDir, vars.Name)
|
||||
return types.Directories{
|
||||
BaseDir: baseDir,
|
||||
SrcDir: filepath.Join(baseDir, "src"),
|
||||
|
@ -297,9 +299,10 @@ func prepareDirs(dirs types.Directories) error {
|
|||
}
|
||||
|
||||
// performChecks checks various things on the system to ensure that the package can be installed.
|
||||
func performChecks(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) {
|
||||
cont, err := cliutils.YesNoPrompt("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 {
|
||||
return false, err
|
||||
}
|
||||
|
@ -322,9 +325,10 @@ func performChecks(vars *types.BuildVars, interactive bool, installed map[string
|
|||
// installBuildDeps installs any build dependencies that aren't already installed and returns
|
||||
// a slice containing the names of all the packages it installed.
|
||||
func installBuildDeps(ctx context.Context, vars *types.BuildVars, opts types.BuildOpts, installed map[string]string) ([]string, error) {
|
||||
log := loggerctx.From(ctx)
|
||||
var buildDeps []string
|
||||
if len(vars.BuildDepends) > 0 {
|
||||
found, notFound, err := repos.FindPkgs(vars.BuildDepends)
|
||||
found, notFound, err := repos.FindPkgs(ctx, vars.BuildDepends)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -333,7 +337,7 @@ func installBuildDeps(ctx context.Context, vars *types.BuildVars, opts types.Bui
|
|||
|
||||
log.Info("Installing build dependencies").Send()
|
||||
|
||||
flattened := cliutils.FlattenPkgs(found, "install", opts.Interactive)
|
||||
flattened := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive)
|
||||
buildDeps = packageNames(flattened)
|
||||
InstallPkgs(ctx, flattened, notFound, opts)
|
||||
}
|
||||
|
@ -344,7 +348,7 @@ func installBuildDeps(ctx context.Context, vars *types.BuildVars, opts types.Bui
|
|||
// If the user chooses to install any optional dependencies, it performs the installation.
|
||||
func installOptDeps(ctx context.Context, vars *types.BuildVars, opts types.BuildOpts, installed map[string]string) error {
|
||||
if len(vars.OptDepends) > 0 {
|
||||
optDeps, err := cliutils.ChooseOptDepends(vars.OptDepends, "install", opts.Interactive)
|
||||
optDeps, err := cliutils.ChooseOptDepends(ctx, vars.OptDepends, "install", opts.Interactive)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -353,13 +357,13 @@ func installOptDeps(ctx context.Context, vars *types.BuildVars, opts types.Build
|
|||
return nil
|
||||
}
|
||||
|
||||
found, notFound, err := repos.FindPkgs(optDeps)
|
||||
found, notFound, err := repos.FindPkgs(ctx, optDeps)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found = removeAlreadyInstalled(found, installed)
|
||||
flattened := cliutils.FlattenPkgs(found, "install", opts.Interactive)
|
||||
flattened := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive)
|
||||
InstallPkgs(ctx, flattened, notFound, opts)
|
||||
}
|
||||
return nil
|
||||
|
@ -369,18 +373,19 @@ func installOptDeps(ctx context.Context, vars *types.BuildVars, opts types.Build
|
|||
// of the packages it built, as well as all the dependencies it didn't find in the LURE repo so
|
||||
// they can be installed from the system repos.
|
||||
func buildLUREDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildVars) (builtPaths, builtNames, repoDeps []string, err error) {
|
||||
log := loggerctx.From(ctx)
|
||||
if len(vars.Depends) > 0 {
|
||||
log.Info("Installing dependencies").Send()
|
||||
|
||||
found, notFound, err := repos.FindPkgs(vars.Depends)
|
||||
found, notFound, err := repos.FindPkgs(ctx, vars.Depends)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
repoDeps = notFound
|
||||
|
||||
// If there are multiple options for some packages, flatten them all into a single slice
|
||||
pkgs := cliutils.FlattenPkgs(found, "install", opts.Interactive)
|
||||
scripts := GetScriptPaths(pkgs)
|
||||
pkgs := cliutils.FlattenPkgs(ctx, found, "install", opts.Interactive)
|
||||
scripts := GetScriptPaths(ctx, pkgs)
|
||||
for _, script := range scripts {
|
||||
newOpts := opts
|
||||
newOpts.Script = script
|
||||
|
@ -410,6 +415,7 @@ func buildLUREDeps(ctx context.Context, opts types.BuildOpts, vars *types.BuildV
|
|||
|
||||
// executeFunctions executes the special LURE functions, such as version(), prepare(), etc.
|
||||
func executeFunctions(ctx context.Context, dec *decoder.Decoder, dirs types.Directories, vars *types.BuildVars) (err error) {
|
||||
log := loggerctx.From(ctx)
|
||||
version, ok := dec.GetFunc("version")
|
||||
if ok {
|
||||
log.Info("Executing version()").Send()
|
||||
|
@ -585,9 +591,9 @@ func buildContents(vars *types.BuildVars, dirs types.Directories) ([]*files.Cont
|
|||
|
||||
// removeBuildDeps asks the user if they'd like to remove the build dependencies that were
|
||||
// installed by installBuildDeps. If so, it uses the package manager to do that.
|
||||
func removeBuildDeps(buildDeps []string, opts types.BuildOpts) error {
|
||||
func removeBuildDeps(ctx context.Context, buildDeps []string, opts types.BuildOpts) error {
|
||||
if len(buildDeps) > 0 {
|
||||
remove, err := cliutils.YesNoPrompt("Would you like to remove the build dependencies?", opts.Interactive, false)
|
||||
remove, err := cliutils.YesNoPrompt(ctx, "Would you like to remove the build dependencies?", opts.Interactive, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -688,6 +694,7 @@ func createBuildEnvVars(info *distro.OSRelease, dirs types.Directories) []string
|
|||
|
||||
// getSources downloads the sources from the script.
|
||||
func getSources(ctx context.Context, srcdir string, bv *types.BuildVars) error {
|
||||
log := loggerctx.From(ctx)
|
||||
if len(bv.Sources) != len(bv.Checksums) {
|
||||
log.Fatal("The checksums array must be the same length as sources").Send()
|
||||
}
|
||||
|
|
|
@ -22,15 +22,17 @@ import (
|
|||
"context"
|
||||
"path/filepath"
|
||||
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
)
|
||||
|
||||
// InstallPkgs installs native packages via the package manager,
|
||||
// then builds and installs the LURE packages
|
||||
func InstallPkgs(ctx context.Context, lurePkgs []db.Package, nativePkgs []string, opts types.BuildOpts) {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
if len(nativePkgs) > 0 {
|
||||
err := opts.Manager.Install(nil, nativePkgs...)
|
||||
if err != nil {
|
||||
|
@ -38,15 +40,15 @@ func InstallPkgs(ctx context.Context, lurePkgs []db.Package, nativePkgs []string
|
|||
}
|
||||
}
|
||||
|
||||
InstallScripts(ctx, GetScriptPaths(lurePkgs), opts)
|
||||
InstallScripts(ctx, GetScriptPaths(ctx, lurePkgs), opts)
|
||||
}
|
||||
|
||||
// GetScriptPaths returns a slice of script paths corresponding to the
|
||||
// given packages
|
||||
func GetScriptPaths(pkgs []db.Package) []string {
|
||||
func GetScriptPaths(ctx context.Context, pkgs []db.Package) []string {
|
||||
var scripts []string
|
||||
for _, pkg := range pkgs {
|
||||
scriptPath := filepath.Join(config.GetPaths().RepoDir, pkg.Repository, pkg.Name, "lure.sh")
|
||||
scriptPath := filepath.Join(config.GetPaths(ctx).RepoDir, pkg.Repository, pkg.Name, "lure.sh")
|
||||
scripts = append(scripts, scriptPath)
|
||||
}
|
||||
return scripts
|
||||
|
@ -54,6 +56,7 @@ func GetScriptPaths(pkgs []db.Package) []string {
|
|||
|
||||
// InstallScripts builds and installs the given LURE build scripts
|
||||
func InstallScripts(ctx context.Context, scripts []string, opts types.BuildOpts) {
|
||||
log := loggerctx.From(ctx)
|
||||
for _, script := range scripts {
|
||||
opts.Script = script
|
||||
builtPkgs, _, err := BuildPackage(ctx, opts)
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
package log
|
||||
|
||||
import (
|
||||
"go.elara.ws/logger"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
)
|
||||
|
||||
// SetLogger sets LURE's global logger, which is disabled by default
|
||||
func SetLogger(l logger.Logger) {
|
||||
log.Logger = l
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package loggerctx
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go.elara.ws/logger"
|
||||
)
|
||||
|
||||
type loggerCtxKey struct{}
|
||||
|
||||
func With(ctx context.Context, log logger.Logger) context.Context {
|
||||
return context.WithValue(ctx, loggerCtxKey{}, log)
|
||||
}
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
|
@ -18,12 +18,16 @@
|
|||
|
||||
package repos
|
||||
|
||||
import "go.elara.ws/lure/internal/db"
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go.elara.ws/lure/internal/db"
|
||||
)
|
||||
|
||||
// FindPkgs looks for packages matching the inputs inside the database.
|
||||
// It returns a map that maps the package name input to any packages found for it.
|
||||
// It also returns a slice that contains the names of all packages that were not found.
|
||||
func FindPkgs(pkgs []string) (map[string][]db.Package, []string, error) {
|
||||
func FindPkgs(ctx context.Context, pkgs []string) (map[string][]db.Package, []string, error) {
|
||||
found := map[string][]db.Package{}
|
||||
notFound := []string(nil)
|
||||
|
||||
|
@ -32,7 +36,7 @@ func FindPkgs(pkgs []string) (map[string][]db.Package, []string, error) {
|
|||
continue
|
||||
}
|
||||
|
||||
result, err := db.GetPkgs("name LIKE ?", pkgName)
|
||||
result, err := db.GetPkgs(ctx, "name LIKE ?", pkgName)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
@ -51,7 +55,7 @@ func FindPkgs(pkgs []string) (map[string][]db.Package, []string, error) {
|
|||
result.Close()
|
||||
|
||||
if added == 0 {
|
||||
result, err := db.GetPkgs("json_array_contains(provides, ?)", pkgName)
|
||||
result, err := db.GetPkgs(ctx, "json_array_contains(provides, ?)", pkgName)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
|
|
@ -24,8 +24,8 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
)
|
||||
|
||||
|
|
|
@ -36,11 +36,11 @@ import (
|
|||
"github.com/pelletier/go-toml/v2"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/shutils"
|
||||
"go.elara.ws/lure/internal/shutils/decoder"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/distro"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/vercmp"
|
||||
"mvdan.cc/sh/v3/expand"
|
||||
"mvdan.cc/sh/v3/interp"
|
||||
|
@ -52,8 +52,10 @@ import (
|
|||
// In this case, only changed packages will be processed if possible.
|
||||
// If repos is set to nil, the repos in the LURE config will be used.
|
||||
func Pull(ctx context.Context, repos []types.Repo) error {
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
if repos == nil {
|
||||
repos = config.Config().Repos
|
||||
repos = config.Config(ctx).Repos
|
||||
}
|
||||
|
||||
for _, repo := range repos {
|
||||
|
@ -63,7 +65,7 @@ func Pull(ctx context.Context, repos []types.Repo) error {
|
|||
}
|
||||
|
||||
log.Info("Pulling repository").Str("name", repo.Name).Send()
|
||||
repoDir := filepath.Join(config.GetPaths().RepoDir, repo.Name)
|
||||
repoDir := filepath.Join(config.GetPaths(ctx).RepoDir, repo.Name)
|
||||
|
||||
var repoFS billy.Filesystem
|
||||
gitDir := filepath.Join(repoDir, ".git")
|
||||
|
@ -93,7 +95,7 @@ func Pull(ctx context.Context, repos []types.Repo) error {
|
|||
repoFS = w.Filesystem
|
||||
|
||||
// Make sure the DB is created even if the repo is up to date
|
||||
if !errors.Is(err, git.NoErrAlreadyUpToDate) || db.IsEmpty() {
|
||||
if !errors.Is(err, git.NoErrAlreadyUpToDate) || db.IsEmpty(ctx) {
|
||||
new, err := r.Head()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -102,7 +104,7 @@ func Pull(ctx context.Context, repos []types.Repo) error {
|
|||
// If the DB was not present at startup, that means it's
|
||||
// empty. In this case, we need to update the DB fully
|
||||
// rather than just incrementally.
|
||||
if db.IsEmpty() {
|
||||
if db.IsEmpty(ctx) {
|
||||
err = processRepoFull(ctx, repo, repoDir)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -271,7 +273,7 @@ func processRepoChanges(ctx context.Context, repo types.Repo, r *git.Repository,
|
|||
return err
|
||||
}
|
||||
|
||||
err = db.DeletePkgs("name = ? AND repository = ?", pkg.Name, repo.Name)
|
||||
err = db.DeletePkgs(ctx, "name = ? AND repository = ?", pkg.Name, repo.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -306,7 +308,7 @@ func processRepoChanges(ctx context.Context, repo types.Repo, r *git.Repository,
|
|||
|
||||
resolveOverrides(runner, &pkg)
|
||||
|
||||
err = db.InsertPackage(pkg)
|
||||
err = db.InsertPackage(ctx, pkg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -376,7 +378,7 @@ func processRepoFull(ctx context.Context, repo types.Repo, repoDir string) error
|
|||
|
||||
resolveOverrides(runner, &pkg)
|
||||
|
||||
err = db.InsertPackage(pkg)
|
||||
err = db.InsertPackage(ctx, pkg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -24,9 +24,9 @@ import (
|
|||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
)
|
||||
|
||||
|
|
28
repo.go
28
repo.go
|
@ -24,10 +24,10 @@ import (
|
|||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
@ -51,10 +51,13 @@ var addrepoCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
name := c.String("name")
|
||||
repoURL := c.String("url")
|
||||
|
||||
cfg := config.Config()
|
||||
cfg := config.Config(ctx)
|
||||
|
||||
for _, repo := range cfg.Repos {
|
||||
if repo.URL == repoURL {
|
||||
|
@ -67,7 +70,7 @@ var addrepoCmd = &cli.Command{
|
|||
URL: repoURL,
|
||||
})
|
||||
|
||||
cfgFl, err := os.Create(config.GetPaths().ConfigPath)
|
||||
cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath)
|
||||
if err != nil {
|
||||
log.Fatal("Error opening config file").Err(err).Send()
|
||||
}
|
||||
|
@ -77,7 +80,7 @@ var addrepoCmd = &cli.Command{
|
|||
log.Fatal("Error encoding config").Err(err).Send()
|
||||
}
|
||||
|
||||
err = repos.Pull(c.Context, cfg.Repos)
|
||||
err = repos.Pull(ctx, cfg.Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repos").Err(err).Send()
|
||||
}
|
||||
|
@ -99,8 +102,11 @@ var removerepoCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
name := c.String("name")
|
||||
cfg := config.Config()
|
||||
cfg := config.Config(ctx)
|
||||
|
||||
found := false
|
||||
index := 0
|
||||
|
@ -116,7 +122,7 @@ var removerepoCmd = &cli.Command{
|
|||
|
||||
cfg.Repos = slices.Delete(cfg.Repos, index, index+1)
|
||||
|
||||
cfgFl, err := os.Create(config.GetPaths().ConfigPath)
|
||||
cfgFl, err := os.Create(config.GetPaths(ctx).ConfigPath)
|
||||
if err != nil {
|
||||
log.Fatal("Error opening config file").Err(err).Send()
|
||||
}
|
||||
|
@ -126,12 +132,12 @@ var removerepoCmd = &cli.Command{
|
|||
log.Fatal("Error encoding config").Err(err).Send()
|
||||
}
|
||||
|
||||
err = os.RemoveAll(filepath.Join(config.GetPaths().RepoDir, name))
|
||||
err = os.RemoveAll(filepath.Join(config.GetPaths(ctx).RepoDir, name))
|
||||
if err != nil {
|
||||
log.Fatal("Error removing repo directory").Err(err).Send()
|
||||
}
|
||||
|
||||
err = db.DeletePkgs("repository = ?", name)
|
||||
err = db.DeletePkgs(ctx, "repository = ?", name)
|
||||
if err != nil {
|
||||
log.Fatal("Error removing packages from database").Err(err).Send()
|
||||
}
|
||||
|
@ -145,7 +151,9 @@ var refreshCmd = &cli.Command{
|
|||
Usage: "Pull all repositories that have changed",
|
||||
Aliases: []string{"ref"},
|
||||
Action: func(c *cli.Context) error {
|
||||
err := repos.Pull(c.Context, config.Config().Repos)
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
err := repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repos").Err(err).Send()
|
||||
}
|
||||
|
|
21
upgrade.go
21
upgrade.go
|
@ -23,12 +23,12 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.elara.ws/lure/internal/log"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/build"
|
||||
"go.elara.ws/lure/internal/config"
|
||||
"go.elara.ws/lure/internal/db"
|
||||
"go.elara.ws/lure/internal/types"
|
||||
"go.elara.ws/lure/pkg/build"
|
||||
"go.elara.ws/lure/pkg/distro"
|
||||
"go.elara.ws/lure/pkg/loggerctx"
|
||||
"go.elara.ws/lure/pkg/manager"
|
||||
"go.elara.ws/lure/pkg/repos"
|
||||
"go.elara.ws/vercmp"
|
||||
|
@ -48,7 +48,10 @@ var upgradeCmd = &cli.Command{
|
|||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
info, err := distro.ParseOSRelease(c.Context)
|
||||
ctx := c.Context
|
||||
log := loggerctx.From(ctx)
|
||||
|
||||
info, err := distro.ParseOSRelease(ctx)
|
||||
if err != nil {
|
||||
log.Fatal("Error parsing os-release file").Err(err).Send()
|
||||
}
|
||||
|
@ -58,18 +61,18 @@ var upgradeCmd = &cli.Command{
|
|||
log.Fatal("Unable to detect a supported package manager on the system").Send()
|
||||
}
|
||||
|
||||
err = repos.Pull(c.Context, config.Config().Repos)
|
||||
err = repos.Pull(ctx, config.Config(ctx).Repos)
|
||||
if err != nil {
|
||||
log.Fatal("Error pulling repos").Err(err).Send()
|
||||
}
|
||||
|
||||
updates, err := checkForUpdates(c.Context, mgr, info)
|
||||
updates, err := checkForUpdates(ctx, mgr, info)
|
||||
if err != nil {
|
||||
log.Fatal("Error checking for updates").Err(err).Send()
|
||||
}
|
||||
|
||||
if len(updates) > 0 {
|
||||
build.InstallPkgs(c.Context, updates, nil, types.BuildOpts{
|
||||
build.InstallPkgs(ctx, updates, nil, types.BuildOpts{
|
||||
Manager: mgr,
|
||||
Clean: c.Bool("clean"),
|
||||
Interactive: c.Bool("interactive"),
|
||||
|
@ -89,14 +92,14 @@ func checkForUpdates(ctx context.Context, mgr manager.Manager, info *distro.OSRe
|
|||
}
|
||||
|
||||
pkgNames := maps.Keys(installed)
|
||||
found, _, err := repos.FindPkgs(pkgNames)
|
||||
found, _, err := repos.FindPkgs(ctx, pkgNames)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var out []db.Package
|
||||
for pkgName, pkgs := range found {
|
||||
if slices.Contains(config.Config().IgnorePkgUpdates, pkgName) {
|
||||
if slices.Contains(config.Config(ctx).IgnorePkgUpdates, pkgName) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue