13
"plemya-x.ru/alr/internal/config"
14
"plemya-x.ru/alr/internal/db"
22
FilterNone Filter = iota
44
Description map[string]string
45
Homepage map[string]string
46
Maintainer map[string]string
47
Architectures []string
52
Depends map[string][]string
53
BuildDepends map[string][]string
54
OptDepends map[string][]string
58
func convertPkg(p db.Package) Package {
64
Description: p.Description.Val,
65
Homepage: p.Homepage.Val,
66
Maintainer: p.Maintainer.Val,
67
Architectures: p.Architectures.Val,
68
Licenses: p.Licenses.Val,
69
Provides: p.Provides.Val,
70
Conflicts: p.Conflicts.Val,
71
Replaces: p.Replaces.Val,
72
Depends: p.Depends.Val,
73
BuildDepends: p.BuildDepends.Val,
74
OptDepends: p.OptDepends.Val,
75
Repository: p.Repository,
89
func Search(ctx context.Context, opts Options) ([]Package, error) {
90
query := "(name LIKE ? OR description LIKE ? OR json_array_contains(provides, ?))"
91
args := []any{"%" + opts.Query + "%", "%" + opts.Query + "%", opts.Query}
93
if opts.Filter != FilterNone {
96
query += " AND repository = ?"
97
case FilterSupportsArch:
98
query += " AND json_array_contains(architectures, ?)"
100
args = append(args, opts.FilterValue)
103
if opts.SortBy != SortByNone {
106
query += " ORDER BY name"
108
query += " ORDER BY repository"
110
query += " ORDER BY version"
115
query += " LIMIT " + strconv.FormatInt(opts.Limit, 10)
118
result, err := db.GetPkgs(ctx, query, args...)
126
err = result.StructScan(&pkg)
130
out = append(out, convertPkg(pkg))
137
func GetPkg(ctx context.Context, repo, name string) (Package, error) {
138
pkg, err := db.GetPkg(ctx, "name = ? AND repository = ?", name, repo)
139
return convertPkg(*pkg), err
145
ErrInvalidArgument = errors.New("name and repository must not contain . or /")
149
ErrScriptNotFound = errors.New("requested script not found")
153
func GetScript(ctx context.Context, repo, name string) (io.ReadCloser, error) {
154
if strings.Contains(name, "./") || strings.ContainsAny(repo, "./") {
155
return nil, ErrInvalidArgument
158
scriptPath := filepath.Join(config.GetPaths(ctx).RepoDir, repo, name, "alr.sh")
159
fl, err := os.Open(scriptPath)
160
if errors.Is(err, fs.ErrNotExist) {
161
return nil, ErrScriptNotFound
162
} else if err != nil {