21 Commits

Author SHA1 Message Date
d78064179f Change package name to linux-user-repository 2022-11-05 16:40:38 -07:00
2157d9ecce Add GPLv3 headers to all files 2022-11-05 16:11:01 -07:00
b686f810fb Fix link for lure-repo-bot 2022-11-03 14:23:20 -07:00
c856bf0686 Create adding-packages doc 2022-11-03 14:18:57 -07:00
c650c1dae0 Fix postremove script decoding 2022-10-23 01:16:42 -07:00
b3b6612ef2 Update license field docs 2022-10-19 05:37:29 +00:00
baf4cca4fb Remove replace directive and update nfpm 2022-10-15 11:44:46 -07:00
e604f61151 Move packages to working directory after build (Fixes #13) 2022-10-14 01:37:13 -07:00
8e74e58cad Don't pull repos if they've already been pulled in the same command 2022-10-03 15:51:46 -07:00
be48f26e75 Add --needed flag to pacman install commands 2022-10-03 15:48:43 -07:00
b6265f4b1d Add documentation for new ~name parameter 2022-10-03 15:40:37 -07:00
c0e535c630 Separate download.Get() function and add ~name parameter to git downloads 2022-10-03 15:38:38 -07:00
2b6815e287 Add docs for version() function 2022-10-02 20:19:50 -07:00
a42c9b27e7 Add version() function 2022-10-02 20:09:12 -07:00
e2c8335381 Pass function directory using new ScriptFunc arguments 2022-10-02 20:06:00 -07:00
b56641c659 Pass options to subshell when executing a ScriptFunc 2022-10-02 19:59:10 -07:00
61ba975e21 Add CI badge to README 2022-10-01 21:04:42 -07:00
75a60070ba Add documentation about Like distros 2022-10-01 21:00:57 -07:00
a02a009b63 Disable like distros if LURE_DISTRO is set 2022-10-01 20:56:08 -07:00
74adb915fc Add option to disable like distros in decoder 2022-10-01 20:53:26 -07:00
bdca0a5ffc Move cross-packaging instructions to usage docs 2022-10-01 18:20:54 -07:00
16 changed files with 369 additions and 194 deletions

View File

@@ -21,6 +21,7 @@ archives:
arm64: aarch64 arm64: aarch64
nfpms: nfpms:
- id: lure - id: lure
package_name: linux-user-repository
file_name_template: '{{.PackageName}}-{{.Version}}-{{.Os}}-{{.Arch}}' file_name_template: '{{.PackageName}}-{{.Version}}-{{.Os}}-{{.Arch}}'
description: "Linux User REpository" description: "Linux User REpository"
replacements: replacements:

View File

@@ -1,6 +1,7 @@
# LURE (Linux User REpository) # LURE (Linux User REpository)
[![Go Report Card](https://goreportcard.com/badge/go.arsenm.dev/lure)](https://goreportcard.com/report/go.arsenm.dev/lure) [![Go Report Card](https://goreportcard.com/badge/go.arsenm.dev/lure)](https://goreportcard.com/report/go.arsenm.dev/lure)
[![Build status](https://ci.appveyor.com/api/projects/status/7anjwy7xcp4dxfu6?svg=true)](https://ci.appveyor.com/project/moussaelianarsen/lure)
[![lure-bin AUR package](https://img.shields.io/aur/version/lure-bin?label=lure-bin&logo=archlinux)](https://aur.archlinux.org/packages/lure-bin/) [![lure-bin AUR package](https://img.shields.io/aur/version/lure-bin?label=lure-bin&logo=archlinux)](https://aur.archlinux.org/packages/lure-bin/)
LURE is intended to bring the AUR to all distros. It is currently in an ***alpha*** state and may not be stable. It can download a repository, build packages in it using a bash script similar to [PKGBUILD](https://wiki.archlinux.org/title/PKGBUILD), and then install them using your system package manager. LURE is intended to bring the AUR to all distros. It is currently in an ***alpha*** state and may not be stable. It can download a repository, build packages in it using a bash script similar to [PKGBUILD](https://wiki.archlinux.org/title/PKGBUILD), and then install them using your system package manager.
@@ -41,20 +42,6 @@ The documentation for LURE is in the [docs](docs) directory in this repo.
--- ---
## Cross-packaging for other Distributions
You can create packages for different distributions
setting the environment variables `LURE_DISTRO` and `LURE_PKG_FORMAT`.
```
LURE_DISTRO=arch LURE_PKG_FORMAT=archlinux lure build
LURE_DISTRO=alpine LURE_PKG_FORMAT=apk lure build
LURE_DISTRO=opensuse LURE_PKG_FORMAT=rpm lure build
LURE_DISTRO=debian LURE_PKG_FORMAT=deb lure build
```
---
## Repositories ## Repositories
Unlike the AUR, LURE supports using multiple repos. Also unlike the AUR, LURE's repos are a single git repo containing all the build scripts. Inside each LURE repo, there should be a separate directory for each package containing a `lure.sh` script, which is a PKGBUILD-like build script for LURE. The default repository is hosted on Github: https://github.com/Arsen6331/lure-repo. Unlike the AUR, LURE supports using multiple repos. Also unlike the AUR, LURE's repos are a single git repo containing all the build scripts. Inside each LURE repo, there should be a separate directory for each package containing a `lure.sh` script, which is a PKGBUILD-like build script for LURE. The default repository is hosted on Github: https://github.com/Arsen6331/lure-repo.

View File

@@ -19,6 +19,7 @@
package main package main
import ( import (
"bytes"
"context" "context"
"encoding/hex" "encoding/hex"
"io" "io"
@@ -76,7 +77,7 @@ type Scripts struct {
PreInstall string `sh:"preinstall"` PreInstall string `sh:"preinstall"`
PostInstall string `sh:"postinstall"` PostInstall string `sh:"postinstall"`
PreRemove string `sh:"preremove"` PreRemove string `sh:"preremove"`
PostRemove string `sh:"postinstall"` PostRemove string `sh:"postremove"`
PreUpgrade string `sh:"preupgrade"` PreUpgrade string `sh:"preupgrade"`
PostUpgrade string `sh:"postupgrade"` PostUpgrade string `sh:"postupgrade"`
PreTrans string `sh:"pretrans"` PreTrans string `sh:"pretrans"`
@@ -91,12 +92,23 @@ func buildCmd(c *cli.Context) error {
log.Fatal("Unable to detect supported package manager on system").Send() log.Fatal("Unable to detect supported package manager on system").Send()
} }
_, pkgNames, err := buildPackage(c.Context, script, mgr) pkgPaths, _, err := buildPackage(c.Context, script, mgr)
if err != nil { if err != nil {
log.Fatal("Error building package").Err(err).Send() log.Fatal("Error building package").Err(err).Send()
} }
log.Info("Package(s) built successfully").Any("names", pkgNames).Send() wd, err := os.Getwd()
if err != nil {
log.Fatal("Error getting working directory").Err(err).Send()
}
for _, pkgPath := range pkgPaths {
name := filepath.Base(pkgPath)
err = os.Rename(pkgPath, filepath.Join(wd, name))
if err != nil {
log.Fatal("Error moving the package").Err(err).Send()
}
}
return nil return nil
} }
@@ -107,8 +119,10 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st
return nil, nil, err return nil, nil, err
} }
var distroChanged bool
if distID, ok := os.LookupEnv("LURE_DISTRO"); ok { if distID, ok := os.LookupEnv("LURE_DISTRO"); ok {
info.ID = distID info.ID = distID
distroChanged = true
} }
fl, err := os.Open(script) fl, err := os.Open(script)
@@ -140,6 +154,12 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st
dec := decoder.New(info, runner) dec := decoder.New(info, runner)
// If distro was changed, the list of like distros
// no longer applies, so disable its use
if distroChanged {
dec.LikeDistros = false
}
var vars BuildVars var vars BuildVars
err = dec.DecodeVars(&vars) err = dec.DecodeVars(&vars)
if err != nil { if err != nil {
@@ -183,7 +203,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st
if len(vars.BuildDepends) > 0 { if len(vars.BuildDepends) > 0 {
log.Info("Installing build dependencies").Send() log.Info("Installing build dependencies").Send()
installPkgs(ctx, vars.BuildDepends, mgr) installPkgs(ctx, vars.BuildDepends, mgr, false)
} }
var builtDeps, builtNames, repoDeps []string var builtDeps, builtNames, repoDeps []string
@@ -219,17 +239,37 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st
if ok { if ok {
log.Info("Executing prepare()").Send() log.Info("Executing prepare()").Send()
err = fn(ctx, srcdir) err = fn(ctx, interp.Dir(srcdir))
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
} }
fn, ok = dec.GetFunc("version")
if ok {
log.Info("Executing version()").Send()
buf := &bytes.Buffer{}
err = fn(
ctx,
interp.Dir(srcdir),
interp.StdIO(os.Stdin, buf, os.Stderr),
)
if err != nil {
return nil, nil, err
}
vars.Version = strings.TrimSpace(buf.String())
log.Info("Updating version").Str("new", vars.Version).Send()
}
fn, ok = dec.GetFunc("build") fn, ok = dec.GetFunc("build")
if ok { if ok {
log.Info("Executing build()").Send() log.Info("Executing build()").Send()
err = fn(ctx, srcdir) err = fn(ctx, interp.Dir(srcdir))
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@@ -239,7 +279,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st
if ok { if ok {
log.Info("Executing package()").Send() log.Info("Executing package()").Send()
err = fn(ctx, srcdir) err = fn(ctx, interp.Dir(srcdir))
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

View File

@@ -3,3 +3,4 @@
- [Build Scripts](build-scripts.md) - [Build Scripts](build-scripts.md)
- [Usage](usage.md) - [Usage](usage.md)
- [Configuration](configuration.md) - [Configuration](configuration.md)
- [Adding Packages to LURE's repo](adding-packages.md)

23
docs/adding-packages.md Normal file
View File

@@ -0,0 +1,23 @@
# Adding Packages to LURE's repo
## Requirements
- `go` (1.18+)
- `git`
- `lure-analyzer`
- `go install go.arsenm.dev/lure-repo-bot/cmd/lure-analyzer@latest`
- `shfmt`
- May be available in distro repos
- `go install mvdan.cc/sh/v3/cmd/shfmt@latest`
---
## How to submit a package
LURE's repo is hosted on Github at https://github.com/Arsen6331/lure-repo. In it, there are multiple directories each containing a `lure.sh` file. In order to add a package to LURE's repo, simply create a PR with a [build script](./build-scripts.md) and place it in a directory with the same name as the package.
Upon submitting the PR, [lure-repo-bot](https://github.com/Arsen6331/lure-repo-bot) will pull your PR and analyze it, providing suggestions for fixes as review comments. If there are no problems, the bot will approve your changes. If there are issues, re-request review from the bot after you've finished applying the fixes and it will automatically review the PR again.
All scripts submitted to the LURE repo should be formatted with `shfmt`. If they are not properly formatted, Github Actions will add suggestions in the "Files Changed" tab of the PR.
Once your PR is merged, LURE will pull the changed repo and your package will be available for people to install.

View File

@@ -26,6 +26,11 @@ LURE uses build scripts similar to the AUR's PKGBUILDs. This is the documentatio
- [checksums](#checksums) - [checksums](#checksums)
- [backup](#backup) - [backup](#backup)
- [scripts](#scripts) - [scripts](#scripts)
- [Functions](#functions)
- [prepare](#prepare)
- [version](#version-1)
- [build](#build)
- [package](#package)
--- ---
@@ -50,6 +55,15 @@ Names are checked in the following order:
Distro detection is performed by reading the `/usr/lib/os-release` and `/etc/os-release` files. Distro detection is performed by reading the `/usr/lib/os-release` and `/etc/os-release` files.
### Like distros
Inside the `os-release` file, there is a list of "like" distros. LURE takes this into account. For example, if a script contains `deps_debian` but not `deps_ubuntu`, Ubuntu builds will use `deps_debian` because Ubuntu is based on debian.
Most specificity is preferred, so if both `deps_debian` and `deps_ubuntu` is provided, Ubuntu and all Ubuntu-based distros will use `deps_ubuntu` while Debian and all Debian-based distros
that are not Ubuntu-based will use `deps_debian`.
Like distros are disabled when using the `LURE_DISTRO` environment variable.
## Variables ## Variables
Any variables marked with `(*)` are required Any variables marked with `(*)` are required
@@ -110,7 +124,7 @@ LURE_ARM_VARIANT=arm5 lure install ...
### licenses ### licenses
The `licenses` array contains the licenses used by this package. Some valid values include `GPLv3` and `MIT`. The `licenses` array contains the licenses used by this package. In order to standardize license names, values should be [SPDX Identifiers](https://spdx.org/licenses/) such as `Apache-2.0`, `MIT`, and `GPL-3.0-only`. If the project uses a license that is not standardized in SPDX, use the value `Custom`. If the project has multiple nonstandard licenses, include `Custom` as many times as there are nonstandard licenses.
### provides ### provides
@@ -154,6 +168,7 @@ If the URL scheme starts with `git+`, the source will be downloaded as a git rep
- `~branch`: Specify which branch of the repo to check out. - `~branch`: Specify which branch of the repo to check out.
- `~commit`: Specify which commit of the repo to check out. - `~commit`: Specify which commit of the repo to check out.
- `~depth`: Specify what depth should be used when cloning the repo. Must be an integer. - `~depth`: Specify what depth should be used when cloning the repo. Must be an integer.
- `~name`: Specify the name of the directory into which the git repo should be cloned.
Examples: Examples:
@@ -216,6 +231,21 @@ All functions start in the `$srcdir` directory
The `prepare()` function runs first. It is meant to prepare the sources for building and packaging. This is the function in which patches should be applied, for example, by the `patch` command, and where tools like `go generate` should be executed. The `prepare()` function runs first. It is meant to prepare the sources for building and packaging. This is the function in which patches should be applied, for example, by the `patch` command, and where tools like `go generate` should be executed.
### version
The `version()` function updates the `version` variable. This allows for automatically deriving the version from sources. This is most useful for git packages, which usually don't need to be changed, so their `version` variable stays the same.
An example of using this for git:
```bash
version() {
cd "$srcdir/itd"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
```
The AUR equivalent is the [`pkgver()` function](https://wiki.archlinux.org/title/VCS_package_guidelines#The_pkgver()_function)
### build ### build
The `build()` function is where the package is actually built. Use the same commands that would be used to manually compile the software. Often, this function is just one line: The `build()` function is where the package is actually built. Use the same commands that would be used to manually compile the software. Often, this function is just one line:

View File

@@ -111,6 +111,8 @@ Example:
lure ref lure ref
``` ```
---
## Environment Variables ## Environment Variables
### LURE_DISTRO ### LURE_DISTRO
@@ -138,3 +140,21 @@ The `LURE_ARM_VARIANT` environment variable dictates which ARM variant to build
- `arm5` - `arm5`
- `arm6` - `arm6`
- `arm7` - `arm7`
---
## Cross-packaging for other Distributions
You can create packages for different distributions
setting the environment variables `LURE_DISTRO` and `LURE_PKG_FORMAT` as mentioned above.
Examples:
```
LURE_DISTRO=arch LURE_PKG_FORMAT=archlinux lure build
LURE_DISTRO=alpine LURE_PKG_FORMAT=apk lure build
LURE_DISTRO=opensuse LURE_PKG_FORMAT=rpm lure build
LURE_DISTRO=debian LURE_PKG_FORMAT=deb lure build
```
---

View File

@@ -23,6 +23,7 @@ import (
"context" "context"
"crypto/sha256" "crypto/sha256"
"errors" "errors"
"hash"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
@@ -67,6 +68,22 @@ func Get(ctx context.Context, opts GetOptions) error {
} }
query := src.Query() query := src.Query()
if strings.HasPrefix(src.Scheme, "git+") {
err = getGit(ctx, src, query, opts)
if err != nil {
return err
}
} else {
err = getFile(ctx, src, query, opts)
if err != nil {
return err
}
}
return nil
}
func getGit(ctx context.Context, src *url.URL, query url.Values, opts GetOptions) (err error) {
tag := query.Get("~tag") tag := query.Get("~tag")
query.Del("~tag") query.Del("~tag")
@@ -79,6 +96,9 @@ func Get(ctx context.Context, opts GetOptions) error {
depthStr := query.Get("~depth") depthStr := query.Get("~depth")
query.Del("~depth") query.Del("~depth")
name := query.Get("~name")
query.Del("~name")
var refName plumbing.ReferenceName var refName plumbing.ReferenceName
if tag != "" { if tag != "" {
refName = plumbing.NewTagReferenceName(tag) refName = plumbing.NewTagReferenceName(tag)
@@ -86,12 +106,13 @@ func Get(ctx context.Context, opts GetOptions) error {
refName = plumbing.NewBranchReferenceName(branch) refName = plumbing.NewBranchReferenceName(branch)
} }
if strings.HasPrefix(src.Scheme, "git+") {
src.Scheme = strings.TrimPrefix(src.Scheme, "git+") src.Scheme = strings.TrimPrefix(src.Scheme, "git+")
src.RawQuery = query.Encode() src.RawQuery = query.Encode()
name := path.Base(src.Path) if name == "" {
name = path.Base(src.Path)
name = strings.TrimSuffix(name, ".git") name = strings.TrimSuffix(name, ".git")
}
dstDir := opts.Destination dstDir := opts.Destination
if opts.EncloseGit { if opts.EncloseGit {
@@ -132,7 +153,9 @@ func Get(ctx context.Context, opts GetOptions) error {
} }
return w.Checkout(checkoutOpts) return w.Checkout(checkoutOpts)
} else { }
func getFile(ctx context.Context, src *url.URL, query url.Values, opts GetOptions) error {
name := query.Get("~name") name := query.Get("~name")
query.Del("~name") query.Del("~name")
@@ -183,6 +206,16 @@ func Get(ctx context.Context, opts GetOptions) error {
} else if err != nil { } else if err != nil {
return err return err
} else { } else {
err = extractFile(ctx, input, hash, format, name, opts)
if err != nil {
return err
}
}
return nil
}
func extractFile(ctx context.Context, input io.Reader, hash hash.Hash, format archiver.Format, name string, opts GetOptions) (err error) {
r := io.TeeReader(input, hash) r := io.TeeReader(input, hash)
fname := format.Name() fname := format.Name()
@@ -249,8 +282,6 @@ func Get(ctx context.Context, opts GetOptions) error {
return ErrChecksumMismatch return ErrChecksumMismatch
} }
} }
}
}
return nil return nil
} }

7
go.mod
View File

@@ -2,12 +2,10 @@ module go.arsenm.dev/lure
go 1.18 go 1.18
replace github.com/goreleaser/nfpm/v2 => github.com/Arsen6331/nfpm/v2 v2.0.0-20220922210414-eae88e8ea4b5
require ( require (
github.com/AlecAivazis/survey/v2 v2.3.6 github.com/AlecAivazis/survey/v2 v2.3.6
github.com/go-git/go-git/v5 v5.4.2 github.com/go-git/go-git/v5 v5.4.2
github.com/goreleaser/nfpm/v2 v2.18.1 github.com/goreleaser/nfpm/v2 v2.20.0
github.com/mholt/archiver/v4 v4.0.0-alpha.7 github.com/mholt/archiver/v4 v4.0.0-alpha.7
github.com/mitchellh/mapstructure v1.5.0 github.com/mitchellh/mapstructure v1.5.0
github.com/pelletier/go-toml/v2 v2.0.5 github.com/pelletier/go-toml/v2 v2.0.5
@@ -39,7 +37,6 @@ require (
github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect
github.com/gobwas/glob v0.2.3 // indirect github.com/gobwas/glob v0.2.3 // indirect
github.com/golang/snappy v0.0.4 // indirect github.com/golang/snappy v0.0.4 // indirect
github.com/google/rpmpack v0.0.0-20220314092521-38642b5e571e // indirect
github.com/google/uuid v1.3.0 // indirect github.com/google/uuid v1.3.0 // indirect
github.com/gookit/color v1.5.1 // indirect github.com/gookit/color v1.5.1 // indirect
github.com/goreleaser/chglog v0.2.2 // indirect github.com/goreleaser/chglog v0.2.2 // indirect
@@ -49,7 +46,7 @@ require (
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/kevinburke/ssh_config v1.1.0 // indirect github.com/kevinburke/ssh_config v1.1.0 // indirect
github.com/klauspost/compress v1.15.5 // indirect github.com/klauspost/compress v1.15.11 // indirect
github.com/klauspost/pgzip v1.2.5 // indirect github.com/klauspost/pgzip v1.2.5 // indirect
github.com/mattn/go-colorable v0.1.2 // indirect github.com/mattn/go-colorable v0.1.2 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-isatty v0.0.14 // indirect

14
go.sum
View File

@@ -2,8 +2,6 @@ github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8
github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w=
github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0=
github.com/Arsen6331/nfpm/v2 v2.0.0-20220922210414-eae88e8ea4b5 h1:SFWe7Ho60w43hXEIxCdiAXZvUyM9GF/L90jMK42s8gU=
github.com/Arsen6331/nfpm/v2 v2.0.0-20220922210414-eae88e8ea4b5/go.mod h1:O4K1mvEORY78CSCInptGG5MWJ19yr9xFTgWWUtY1R7o=
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
@@ -72,11 +70,8 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/rpmpack v0.0.0-20220314092521-38642b5e571e h1:6Jn9JtfCn20uycra92LxTkq5yfBKNSFlRJPBk8/Cxhg=
github.com/google/rpmpack v0.0.0-20220314092521-38642b5e571e/go.mod h1:83rLnx5vhPyN/mDzBYJWtiPf+9xnSVQynTpqZWe7OnY=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ=
@@ -86,6 +81,8 @@ github.com/goreleaser/chglog v0.2.2 h1:V7nf07baXtGAgGevvqgW2MM4kZ6gOr12vKNSAU3VI
github.com/goreleaser/chglog v0.2.2/go.mod h1:2s5JwtCOWjZa8AIneL+xdUl9SRuigCjRHNHsX30dupE= github.com/goreleaser/chglog v0.2.2/go.mod h1:2s5JwtCOWjZa8AIneL+xdUl9SRuigCjRHNHsX30dupE=
github.com/goreleaser/fileglob v1.3.0 h1:/X6J7U8lbDpQtBvGcwwPS6OpzkNVlVEsFUVRx9+k+7I= github.com/goreleaser/fileglob v1.3.0 h1:/X6J7U8lbDpQtBvGcwwPS6OpzkNVlVEsFUVRx9+k+7I=
github.com/goreleaser/fileglob v1.3.0/go.mod h1:Jx6BoXv3mbYkEzwm9THo7xbr5egkAraxkGorbJb4RxU= github.com/goreleaser/fileglob v1.3.0/go.mod h1:Jx6BoXv3mbYkEzwm9THo7xbr5egkAraxkGorbJb4RxU=
github.com/goreleaser/nfpm/v2 v2.20.0 h1:Q/CrX54KUMluz6+M/pjTbknFd5Dao8qXi0C6ZuFCtfY=
github.com/goreleaser/nfpm/v2 v2.20.0/go.mod h1:/Fh6XfwT/T+D4qtNC2iXmHSD/1UT20JkvBXyJ6nFmOY=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
@@ -103,9 +100,8 @@ github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT
github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o=
github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c=
github.com/klauspost/compress v1.15.5 h1:qyCLMz2JCrKADihKOh9FxnW3houKeNsp2h5OEz0QSEA= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.15.5/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=

View File

@@ -36,21 +36,23 @@ func installCmd(c *cli.Context) error {
log.Fatal("Unable to detect supported package manager on system").Send() log.Fatal("Unable to detect supported package manager on system").Send()
} }
installPkgs(c.Context, args.Slice(), mgr) installPkgs(c.Context, args.Slice(), mgr, true)
return nil return nil
} }
func installPkgs(ctx context.Context, pkgs []string, mgr manager.Manager) { func installPkgs(ctx context.Context, pkgs []string, mgr manager.Manager, pull bool) {
if pull {
err := pullRepos(ctx) err := pullRepos(ctx)
if err != nil { if err != nil {
log.Fatal("Error pulling repositories").Err(err).Send() log.Fatal("Error pulling repositories").Err(err).Send()
} }
}
scripts, notFound := findPkgs(pkgs) scripts, notFound := findPkgs(pkgs)
if len(notFound) > 0 { if len(notFound) > 0 {
err = mgr.Install(nil, notFound...) err := mgr.Install(nil, notFound...)
if err != nil { if err != nil {
log.Fatal("Error installing native packages").Err(err).Send() log.Fatal("Error installing native packages").Err(err).Send()
} }

View File

@@ -1,3 +1,21 @@
/*
* LURE - Linux User REpository
* Copyright (C) 2022 Arsen 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 cpu package cpu
import ( import (

View File

@@ -49,12 +49,15 @@ func (nfe VarNotFoundError) Error() string {
type Decoder struct { type Decoder struct {
info *distro.OSRelease info *distro.OSRelease
runner *interp.Runner runner *interp.Runner
// Enable distro overrides (true by default)
Overrides bool Overrides bool
// Enable using like distros for overrides (true by default)
LikeDistros bool
} }
// New creates a new variable decoder // New creates a new variable decoder
func New(info *distro.OSRelease, runner *interp.Runner) *Decoder { func New(info *distro.OSRelease, runner *interp.Runner) *Decoder {
return &Decoder{info, runner, true} return &Decoder{info, runner, true, true}
} }
// DecodeVar decodes a variable to val using reflection. // DecodeVar decodes a variable to val using reflection.
@@ -139,7 +142,7 @@ func (d *Decoder) DecodeVars(val any) error {
return nil return nil
} }
type ScriptFunc func(ctx context.Context, sir string, args ...string) error type ScriptFunc func(ctx context.Context, opts ...interp.RunnerOption) error
// GetFunc returns a function corresponding to a bash function // GetFunc returns a function corresponding to a bash function
// with the given name // with the given name
@@ -149,10 +152,11 @@ func (d *Decoder) GetFunc(name string) (ScriptFunc, bool) {
return nil, false return nil, false
} }
return func(ctx context.Context, dir string, args ...string) error { return func(ctx context.Context, opts ...interp.RunnerOption) error {
sub := d.runner.Subshell() sub := d.runner.Subshell()
interp.Params(args...)(sub) for _, opt := range opts {
interp.Dir(dir)(sub) opt(sub)
}
return sub.Run(ctx, fn) return sub.Run(ctx, fn)
}, true }, true
} }
@@ -206,7 +210,9 @@ func (d *Decoder) genPossibleNames(name string) []string {
} }
distros := []string{d.info.ID} distros := []string{d.info.ID}
if d.LikeDistros {
distros = append(distros, d.info.Like...) distros = append(distros, d.info.Like...)
}
var out []string var out []string
for _, arch := range architectures { for _, arch := range architectures {

18
list.go
View File

@@ -1,3 +1,21 @@
/*
* LURE - Linux User REpository
* Copyright (C) 2022 Arsen 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 main package main
import ( import (

View File

@@ -60,7 +60,7 @@ func (p *Pacman) Sync(opts *Opts) error {
func (p *Pacman) Install(opts *Opts, pkgs ...string) error { func (p *Pacman) Install(opts *Opts, pkgs ...string) error {
opts = ensureOpts(opts) opts = ensureOpts(opts)
cmd := p.getCmd(opts, "pacman", "-S") cmd := p.getCmd(opts, "pacman", "-S", "--needed")
cmd.Args = append(cmd.Args, pkgs...) cmd.Args = append(cmd.Args, pkgs...)
setCmdEnv(cmd) setCmdEnv(cmd)
err := cmd.Run() err := cmd.Run()
@@ -72,7 +72,7 @@ func (p *Pacman) Install(opts *Opts, pkgs ...string) error {
func (p *Pacman) InstallLocal(opts *Opts, pkgs ...string) error { func (p *Pacman) InstallLocal(opts *Opts, pkgs ...string) error {
opts = ensureOpts(opts) opts = ensureOpts(opts)
cmd := p.getCmd(opts, "pacman", "-U") cmd := p.getCmd(opts, "pacman", "-U", "--needed")
cmd.Args = append(cmd.Args, pkgs...) cmd.Args = append(cmd.Args, pkgs...)
setCmdEnv(cmd) setCmdEnv(cmd)
err := cmd.Run() err := cmd.Run()

View File

@@ -38,13 +38,18 @@ func upgradeCmd(c *cli.Context) error {
log.Fatal("Unable to detect supported package manager on system").Send() log.Fatal("Unable to detect supported package manager on system").Send()
} }
err = pullRepos(c.Context)
if err != nil {
log.Fatal("Error pulling repos").Err(err).Send()
}
updates, err := checkForUpdates(c.Context, mgr, info) updates, err := checkForUpdates(c.Context, mgr, info)
if err != nil { if err != nil {
log.Fatal("Error checking for updates").Err(err).Send() log.Fatal("Error checking for updates").Err(err).Send()
} }
if len(updates) > 0 { if len(updates) > 0 {
installPkgs(c.Context, updates, mgr) installPkgs(c.Context, updates, mgr, false)
} else { } else {
log.Info("There is nothing to do.").Send() log.Info("There is nothing to do.").Send()
} }