ALR
/
list.go
108 строк · 2.6 Кб
1/*
2* ALR - Any Linux Repository
3* Copyright (C) 2024 Евгений Храмов
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19package main
20
21import (
22"fmt"
23
24"github.com/urfave/cli/v2"
25"plemya-x.ru/alr/internal/config"
26"plemya-x.ru/alr/internal/db"
27"plemya-x.ru/alr/pkg/loggerctx"
28"plemya-x.ru/alr/pkg/manager"
29"plemya-x.ru/alr/pkg/repos"
30"golang.org/x/exp/slices"
31)
32
33var listCmd = &cli.Command{
34Name: "list",
35Usage: "List ALR repo packages",
36Aliases: []string{"ls"},
37Flags: []cli.Flag{
38&cli.BoolFlag{
39Name: "installed",
40Aliases: []string{"I"},
41},
42},
43Action: func(c *cli.Context) error {
44ctx := c.Context
45log := loggerctx.From(ctx)
46
47err := repos.Pull(ctx, config.Config(ctx).Repos)
48if err != nil {
49log.Fatal("Error pulling repositories").Err(err).Send()
50}
51
52where := "true"
53args := []any(nil)
54if c.NArg() > 0 {
55where = "name LIKE ? OR json_array_contains(provides, ?)"
56args = []any{c.Args().First(), c.Args().First()}
57}
58
59result, err := db.GetPkgs(ctx, where, args...)
60if err != nil {
61log.Fatal("Error getting packages").Err(err).Send()
62}
63defer result.Close()
64
65var installed map[string]string
66if c.Bool("installed") {
67mgr := manager.Detect()
68if mgr == nil {
69log.Fatal("Unable to detect a supported package manager on the system").Send()
70}
71
72installed, err = mgr.ListInstalled(&manager.Opts{AsRoot: false})
73if err != nil {
74log.Fatal("Error listing installed packages").Err(err).Send()
75}
76}
77
78for result.Next() {
79var pkg db.Package
80err := result.StructScan(&pkg)
81if err != nil {
82return err
83}
84
85if slices.Contains(config.Config(ctx).IgnorePkgUpdates, pkg.Name) {
86continue
87}
88
89version := pkg.Version
90if c.Bool("installed") {
91instVersion, ok := installed[pkg.Name]
92if !ok {
93continue
94} else {
95version = instVersion
96}
97}
98
99fmt.Printf("%s/%s %s\n", pkg.Repository, pkg.Name, version)
100}
101
102if err != nil {
103log.Fatal("Error iterating over packages").Err(err).Send()
104}
105
106return nil
107},
108}
109