ALR
/
helper.go
86 строк · 1.9 Кб
1package main
2
3import (
4"fmt"
5"os"
6"strings"
7
8"github.com/urfave/cli/v2"
9"plemya-x.ru/alr/internal/cpu"
10"plemya-x.ru/alr/internal/shutils/helpers"
11"plemya-x.ru/alr/pkg/distro"
12"plemya-x.ru/alr/pkg/loggerctx"
13"mvdan.cc/sh/v3/expand"
14"mvdan.cc/sh/v3/interp"
15)
16
17var helperCmd = &cli.Command{
18Name: "helper",
19Usage: "Run a ALR helper command",
20ArgsUsage: `<helper_name|"list">`,
21Subcommands: []*cli.Command{helperListCmd},
22Flags: []cli.Flag{
23&cli.StringFlag{
24Name: "dest-dir",
25Aliases: []string{"d"},
26Usage: "The directory that the install commands will install to",
27Value: "dest",
28},
29},
30Action: func(c *cli.Context) error {
31ctx := c.Context
32log := loggerctx.From(ctx)
33
34if c.Args().Len() < 1 {
35cli.ShowSubcommandHelpAndExit(c, 1)
36}
37
38helper, ok := helpers.Helpers[c.Args().First()]
39if !ok {
40log.Fatal("No such helper command").Str("name", c.Args().First()).Send()
41}
42
43wd, err := os.Getwd()
44if err != nil {
45log.Fatal("Error getting working directory").Err(err).Send()
46}
47
48info, err := distro.ParseOSRelease(ctx)
49if err != nil {
50log.Fatal("Error getting working directory").Err(err).Send()
51}
52
53hc := interp.HandlerContext{
54Env: expand.ListEnviron(
55"pkgdir="+c.String("dest-dir"),
56"DISTRO_ID="+info.ID,
57"DISTRO_ID_LIKE="+strings.Join(info.Like, " "),
58"ARCH="+cpu.Arch(),
59),
60Dir: wd,
61Stdin: os.Stdin,
62Stdout: os.Stdout,
63Stderr: os.Stderr,
64}
65
66return helper(hc, c.Args().First(), c.Args().Slice()[1:])
67},
68CustomHelpTemplate: cli.CommandHelpTemplate,
69BashComplete: func(ctx *cli.Context) {
70for name := range helpers.Helpers {
71fmt.Println(name)
72}
73},
74}
75
76var helperListCmd = &cli.Command{
77Name: "list",
78Usage: "List all the available helper commands",
79Aliases: []string{"ls"},
80Action: func(ctx *cli.Context) error {
81for name := range helpers.Helpers {
82fmt.Println(name)
83}
84return nil
85},
86}
87