ALR
/
install.go
122 строки · 3.2 Кб
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/cliutils"
26"plemya-x.ru/alr/internal/config"
27"plemya-x.ru/alr/internal/db"
28"plemya-x.ru/alr/internal/types"
29"plemya-x.ru/alr/pkg/build"
30"plemya-x.ru/alr/pkg/loggerctx"
31"plemya-x.ru/alr/pkg/manager"
32"plemya-x.ru/alr/pkg/repos"
33)
34
35var installCmd = &cli.Command{
36Name: "install",
37Usage: "Install a new package",
38Aliases: []string{"in"},
39Flags: []cli.Flag{
40&cli.BoolFlag{
41Name: "clean",
42Aliases: []string{"c"},
43Usage: "Build package from scratch even if there's an already built package available",
44},
45},
46Action: func(c *cli.Context) error {
47ctx := c.Context
48log := loggerctx.From(ctx)
49
50args := c.Args()
51if args.Len() < 1 {
52log.Fatalf("Command install expected at least 1 argument, got %d", args.Len()).Send()
53}
54
55mgr := manager.Detect()
56if mgr == nil {
57log.Fatal("Unable to detect a supported package manager on the system").Send()
58}
59
60err := repos.Pull(ctx, config.Config(ctx).Repos)
61if err != nil {
62log.Fatal("Error pulling repositories").Err(err).Send()
63}
64
65found, notFound, err := repos.FindPkgs(ctx, args.Slice())
66if err != nil {
67log.Fatal("Error finding packages").Err(err).Send()
68}
69
70pkgs := cliutils.FlattenPkgs(ctx, found, "install", c.Bool("interactive"))
71build.InstallPkgs(ctx, pkgs, notFound, types.BuildOpts{
72Manager: mgr,
73Clean: c.Bool("clean"),
74Interactive: c.Bool("interactive"),
75})
76return nil
77},
78BashComplete: func(c *cli.Context) {
79log := loggerctx.From(c.Context)
80result, err := db.GetPkgs(c.Context, "true")
81if err != nil {
82log.Fatal("Error getting packages").Err(err).Send()
83}
84defer result.Close()
85
86for result.Next() {
87var pkg db.Package
88err = result.StructScan(&pkg)
89if err != nil {
90log.Fatal("Error iterating over packages").Err(err).Send()
91}
92
93fmt.Println(pkg.Name)
94}
95},
96}
97
98var removeCmd = &cli.Command{
99Name: "remove",
100Usage: "Remove an installed package",
101Aliases: []string{"rm"},
102Action: func(c *cli.Context) error {
103log := loggerctx.From(c.Context)
104
105args := c.Args()
106if args.Len() < 1 {
107log.Fatalf("Command remove expected at least 1 argument, got %d", args.Len()).Send()
108}
109
110mgr := manager.Detect()
111if mgr == nil {
112log.Fatal("Unable to detect a supported package manager on the system").Send()
113}
114
115err := mgr.Remove(nil, c.Args().Slice()...)
116if err != nil {
117log.Fatal("Error removing packages").Err(err).Send()
118}
119
120return nil
121},
122}
123