114 lines
2.1 KiB
Go
114 lines
2.1 KiB
Go
|
package jam
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"io"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"time"
|
||
|
|
||
|
"github.com/gobuffalo/packr/v2/jam/parser"
|
||
|
"github.com/gobuffalo/packr/v2/jam/store"
|
||
|
"github.com/gobuffalo/packr/v2/plog"
|
||
|
)
|
||
|
|
||
|
// PackOptions ...
|
||
|
type PackOptions struct {
|
||
|
IgnoreImports bool
|
||
|
Legacy bool
|
||
|
StoreCmd string
|
||
|
Roots []string
|
||
|
RootsOptions *parser.RootsOptions
|
||
|
}
|
||
|
|
||
|
// Pack the roots given + PWD
|
||
|
func Pack(opts PackOptions) error {
|
||
|
pwd, err := os.Getwd()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
opts.Roots = append(opts.Roots, pwd)
|
||
|
if err := Clean(opts.Roots...); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if opts.RootsOptions == nil {
|
||
|
opts.RootsOptions = &parser.RootsOptions{}
|
||
|
}
|
||
|
|
||
|
if opts.IgnoreImports {
|
||
|
opts.RootsOptions.IgnoreImports = true
|
||
|
}
|
||
|
|
||
|
p, err := parser.NewFromRoots(opts.Roots, opts.RootsOptions)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
boxes, err := p.Run()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// reduce boxes - remove ones we don't want
|
||
|
// MB: current assumption is we want all these
|
||
|
// boxes, just adding a comment suggesting they're
|
||
|
// might be a reason to exclude some
|
||
|
|
||
|
plog.Logger.Debugf("found %d boxes", len(boxes))
|
||
|
|
||
|
if len(opts.StoreCmd) != 0 {
|
||
|
return ShellPack(opts, boxes)
|
||
|
}
|
||
|
|
||
|
var st store.Store = store.NewDisk("", "")
|
||
|
|
||
|
if opts.Legacy {
|
||
|
st = store.NewLegacy()
|
||
|
}
|
||
|
|
||
|
for _, b := range boxes {
|
||
|
if b.Name == store.DISK_GLOBAL_KEY {
|
||
|
continue
|
||
|
}
|
||
|
if err := st.Pack(b); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
if cl, ok := st.(io.Closer); ok {
|
||
|
return cl.Close()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ShellPack ...
|
||
|
func ShellPack(opts PackOptions, boxes parser.Boxes) error {
|
||
|
b, err := json.Marshal(boxes)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
|
||
|
defer cancel()
|
||
|
c := exec.CommandContext(ctx, opts.StoreCmd, string(b))
|
||
|
c.Stdout = os.Stdout
|
||
|
c.Stderr = os.Stderr
|
||
|
return c.Run()
|
||
|
|
||
|
}
|
||
|
|
||
|
// Clean ...
|
||
|
func Clean(args ...string) error {
|
||
|
pwd, err := os.Getwd()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
args = append(args, pwd)
|
||
|
for _, root := range args {
|
||
|
if err := store.Clean(root); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|