From bd769468a939a99893a595f75eddbf0870f934a5 Mon Sep 17 00:00:00 2001 From: Arsen Musayelyan Date: Sun, 29 Jan 2023 14:40:37 -0800 Subject: [PATCH] Install already-built package by default if available --- build.go | 75 ++++++++++++++++++++++++++++++++++++++++++++---------- install.go | 10 ++++---- main.go | 19 ++++++++++++++ upgrade.go | 2 +- 4 files changed, 86 insertions(+), 20 deletions(-) diff --git a/build.go b/build.go index e4ee744..6bd8e01 100644 --- a/build.go +++ b/build.go @@ -102,7 +102,7 @@ func buildCmd(c *cli.Context) error { log.Fatal("Unable to detect supported package manager on system").Send() } - pkgPaths, _, err := buildPackage(c.Context, script, mgr) + pkgPaths, _, err := buildPackage(c.Context, script, mgr, c.Bool("clean")) if err != nil { log.Fatal("Error building package").Err(err).Send() } @@ -125,7 +125,7 @@ func buildCmd(c *cli.Context) error { // 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, script string, mgr manager.Manager) ([]string, []string, error) { +func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean bool) ([]string, []string, error) { info, err := distro.ParseOSRelease(ctx) if err != nil { return nil, nil, err @@ -189,6 +189,21 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st return nil, nil, err } + baseDir := filepath.Join(config.PkgsDir, vars.Name) + srcdir := filepath.Join(baseDir, "src") + pkgdir := filepath.Join(baseDir, "pkg") + + if !clean { + builtPkgPath, ok, err := checkForBuiltPackage(mgr, &vars, getPkgFormat(mgr), baseDir) + if err != nil { + return nil, nil, err + } + + if ok { + return []string{builtPkgPath}, nil, err + } + } + err = cliutils.PromptViewScript(script, vars.Name, cfg.PagerStyle, translator) if err != nil { log.Fatal("Failed to prompt user to view build script").Err(err).Send() @@ -232,10 +247,6 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st dec.LikeDistros = false } - baseDir := filepath.Join(config.PkgsDir, vars.Name) - srcdir := filepath.Join(baseDir, "src") - pkgdir := filepath.Join(baseDir, "pkg") - err = os.RemoveAll(baseDir) if err != nil { return nil, nil, err @@ -276,7 +287,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st flattened := cliutils.FlattenPkgs(found, "install", translator) buildDeps = packageNames(flattened) - installPkgs(ctx, flattened, notFound, mgr) + installPkgs(ctx, flattened, notFound, mgr, clean) } var builtDeps, builtNames, repoDeps []string @@ -290,7 +301,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st scripts := getScriptPaths(cliutils.FlattenPkgs(found, "install", translator)) for _, script := range scripts { - pkgPaths, pkgNames, err := buildPackage(ctx, script, mgr) + pkgPaths, pkgNames, err := buildPackage(ctx, script, mgr, clean) if err != nil { return nil, nil, err } @@ -472,12 +483,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st pkgInfo.Overridables.Contents = contents - pkgFormat := mgr.Format() - if format, ok := os.LookupEnv("LURE_PKG_FORMAT"); ok { - pkgFormat = format - } - - packager, err := nfpm.Get(pkgFormat) + packager, err := nfpm.Get(getPkgFormat(mgr)) if err != nil { return nil, nil, err } @@ -523,6 +529,47 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st return pkgPaths, pkgNames, nil } +func checkForBuiltPackage(mgr manager.Manager, vars *BuildVars, pkgFormat, baseDir string) (string, bool, error) { + filename, err := pkgFileName(vars, pkgFormat) + if err != nil { + return "", false, err + } + + pkgPath := filepath.Join(baseDir, filename) + + _, err = os.Stat(pkgPath) + if err != nil { + return "", false, nil + } + + return pkgPath, true, nil +} + +func pkgFileName(vars *BuildVars, pkgFormat string) (string, error) { + pkgInfo := &nfpm.Info{ + Name: vars.Name, + Arch: cpu.Arch(), + Version: vars.Version, + Release: strconv.Itoa(vars.Release), + Epoch: strconv.FormatUint(uint64(vars.Epoch), 10), + } + + packager, err := nfpm.Get(pkgFormat) + if err != nil { + return "", err + } + + return packager.ConventionalFileName(pkgInfo), nil +} + +func getPkgFormat(mgr manager.Manager) string { + pkgFormat := mgr.Format() + if format, ok := os.LookupEnv("LURE_PKG_FORMAT"); ok { + pkgFormat = format + } + return pkgFormat +} + func genBuildEnv(info *distro.OSRelease, scriptdir string) []string { env := os.Environ() diff --git a/install.go b/install.go index d77eecc..1286666 100644 --- a/install.go +++ b/install.go @@ -53,13 +53,13 @@ func installCmd(c *cli.Context) error { log.Fatal("Error finding packages").Err(err).Send() } - installPkgs(c.Context, cliutils.FlattenPkgs(found, "install", translator), notFound, mgr) + installPkgs(c.Context, cliutils.FlattenPkgs(found, "install", translator), notFound, mgr, c.Bool("clean")) return nil } // installPkgs installs non-LURE packages via the package manager, then builds and installs LURE // packages -func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr manager.Manager) { +func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr manager.Manager, clean bool) { if len(notFound) > 0 { err := mgr.Install(nil, notFound...) if err != nil { @@ -67,7 +67,7 @@ func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr } } - installScripts(ctx, mgr, getScriptPaths(pkgs)) + installScripts(ctx, mgr, getScriptPaths(pkgs), clean) } // getScriptPaths generates a slice of script paths corresponding to the @@ -82,9 +82,9 @@ func getScriptPaths(pkgs []db.Package) []string { } // installScripts builds and installs LURE build scripts -func installScripts(ctx context.Context, mgr manager.Manager, scripts []string) { +func installScripts(ctx context.Context, mgr manager.Manager, scripts []string, clean bool) { for _, script := range scripts { - builtPkgs, _, err := buildPackage(ctx, script, mgr) + builtPkgs, _, err := buildPackage(ctx, script, mgr, clean) if err != nil { log.Fatal("Error building package").Err(err).Send() } diff --git a/main.go b/main.go index 86dcbb2..682edc7 100644 --- a/main.go +++ b/main.go @@ -80,6 +80,13 @@ func main() { }, Commands: []*cli.Command{ { + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "clean", + Aliases: []string{"c"}, + Usage: "Build package from scratch even if there's an already built package available", + }, + }, Name: "install", Usage: "Install a new package", Aliases: []string{"in"}, @@ -93,6 +100,13 @@ func main() { Action: removeCmd, }, { + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "clean", + Aliases: []string{"c"}, + Usage: "Build package from scratch even if there's an already built package available", + }, + }, Name: "upgrade", Usage: "Upgrade all installed packages", Aliases: []string{"up"}, @@ -130,6 +144,11 @@ func main() { Value: "lure.sh", Usage: "Path to the build script", }, + &cli.BoolFlag{ + Name: "clean", + Aliases: []string{"c"}, + Usage: "Build package from scratch even if there's an already built package available", + }, }, Name: "build", Usage: "Build a local package", diff --git a/upgrade.go b/upgrade.go index 0668099..8fa0405 100644 --- a/upgrade.go +++ b/upgrade.go @@ -55,7 +55,7 @@ func upgradeCmd(c *cli.Context) error { } if len(updates) > 0 { - installPkgs(c.Context, updates, nil, mgr) + installPkgs(c.Context, updates, nil, mgr, c.Bool("clean")) } else { log.Info("There is nothing to do.").Send() }