This repository has been archived by the owner on Jun 30, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
buffalo.go
109 lines (90 loc) · 2.21 KB
/
buffalo.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
package cli
import (
"os"
"github.com/gobuffalo/buffalo-cli/v2/cli/cmds"
"github.com/gobuffalo/buffalo-cli/v2/cli/internal/clifix"
"github.com/gobuffalo/buffalo-cli/v2/cli/internal/plugins/golang"
"github.com/gobuffalo/buffalo-cli/v2/meta"
"github.com/gobuffalo/plugins"
"github.com/gobuffalo/plugins/plugcmd"
"github.com/gobuffalo/plugins/plugprint"
)
var _ plugcmd.SubCommander = &Buffalo{}
var _ plugins.Plugin = &Buffalo{}
var _ plugins.Scoper = &Buffalo{}
var _ plugprint.Describer = &Buffalo{}
// Buffalo represents the `buffalo` cli.
type Buffalo struct {
Plugins []plugins.Plugin
root string
}
// TODO move to the generated application code
// once packages are no longer internal
func insidePlugins(root string) []plugins.Plugin {
var plugs []plugins.Plugin
plugs = append(plugs, golang.Plugins()...)
plugs = append(plugs, clifix.Plugins()...)
return plugs
}
func NewFromRoot(root string) (*Buffalo, error) {
b := &Buffalo{
root: root,
}
b.Plugins = append(b.Plugins, cmds.AvailablePlugins(root)...)
if meta.IsBuffalo(root) {
b.Plugins = append(b.Plugins, insidePlugins(root)...)
}
// pre scope the plugins to thin the initial set
plugs := b.ScopedPlugins()
plugins.Sort(plugs)
b.Plugins = plugs
pfn := b.ScopedPlugins
for _, p := range b.Plugins {
switch t := p.(type) {
case plugins.Needer:
t.WithPlugins(pfn)
}
}
return b, nil
}
func New() (*Buffalo, error) {
pwd, err := os.Getwd()
if err != nil {
return nil, err
}
return NewFromRoot(pwd)
}
func (b Buffalo) ScopedPlugins() []plugins.Plugin {
root := b.root
plugs := make([]plugins.Plugin, 0, len(b.Plugins))
for _, p := range b.Plugins {
switch t := p.(type) {
case AvailabilityChecker:
if !t.PluginAvailable(root) {
continue
}
}
plugs = append(plugs, p)
}
return plugs
}
func (b Buffalo) SubCommands() []plugins.Plugin {
var plugs []plugins.Plugin
for _, p := range b.ScopedPlugins() {
if _, ok := p.(Commander); ok {
plugs = append(plugs, p)
}
}
return plugs
}
// Name ...
func (Buffalo) PluginName() string {
return "buffalo"
}
func (Buffalo) String() string {
return "buffalo"
}
// Description ...
func (Buffalo) Description() string {
return "Tools for working with Buffalo applications"
}