-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinstall.go
140 lines (131 loc) · 2.8 KB
/
install.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"fmt"
"github.com/mrosset/util/file"
"github.com/mrosset/via/pkg"
"github.com/urfave/cli/v2"
"os"
"path/filepath"
)
func init() {
app.Commands = append(app.Commands, installCommands...)
}
var (
installCommands = []*cli.Command{
&cli.Command{
Name: "install",
Usage: "install a package",
Aliases: []string{"i"},
Flags: []cli.Flag{
&cli.StringFlag{
Name: "r",
Value: config.Root.String(),
Usage: "use `\"DIR\"` as root",
},
&cli.BoolFlag{
Name: "y",
Value: true,
Usage: "Don't prompt to install",
},
&cli.BoolFlag{
Name: "s",
Value: false,
Usage: "use single threaded installer",
},
},
BashComplete: planArgCompletion,
Action: batch,
},
&cli.Command{
Name: "upgrade",
Aliases: []string{"u", "up"},
Usage: "upgrade packages with newer build or versions",
Action: upgrade,
},
}
)
func batch(ctx *cli.Context) error {
var errors []error
if ctx.Bool("s") {
return install(ctx)
}
if !ctx.Args().Present() {
return fmt.Errorf("install requires a 'PLAN' argument. see: 'via help install'")
}
config.Root = via.Path(ctx.String("r"))
batch := via.NewBatch(config)
for _, a := range ctx.Args().Slice() {
p, err := via.NewPlan(config, a)
if err != nil {
return err
}
if p.Cid == "" {
return fmt.Errorf("plan '%s' does not have a Cid. Has the plan been built?", p.Name)
}
if err := batch.Walk(p); err != nil {
return err
}
}
switch ctx.Bool("y") {
case false:
errors = batch.PromptInstall()
case true:
errors = batch.Install()
}
if len(errors) > 0 {
return errors[0]
}
return nil
}
// FIXME: this function is deprecated and should be replaced with batch
func install(ctx *cli.Context) error {
config.Root = via.Path(ctx.String("r"))
if ctx.Bool("b") {
return batch(ctx)
}
if !ctx.Args().Present() {
return fmt.Errorf("install requires a 'PLAN' argument. see: 'via help install'")
}
if !file.Exists(ctx.String("r")) {
if err := os.MkdirAll(ctx.String("r"), 0755); err != nil {
elog.Printf("could not create '%s'. %s", config.Root, err)
return err
}
}
for _, arg := range ctx.Args().Slice() {
p, err := via.NewPlan(config, arg)
if err != nil {
return err
}
if err := via.NewInstaller(config, p).Install(); err != nil {
return err
}
}
return nil
}
func upgrade(ctx *cli.Context) error {
up := via.NewUpgrader(config)
p, err := up.Check()
if err != nil {
return err
}
if len(p) > 0 {
fmt.Println("upgrading", p)
}
errs := up.Upgrade()
if len(errs) > 0 {
return errs[0]
}
return nil
}
func planArgCompletion(_ *cli.Context) {
files, err := via.PlanFiles(config)
if err != nil {
elog.Println(err)
return
}
for _, f := range files {
name := filepath.Base(f)
fmt.Printf("%s ", name[:len(name)-5])
}
}