Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cmd/gex/errors_go112.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
//go:build !go1.13
// +build !go1.13

package main

import (
"github.com/izumin5210/gex/pkg/tool"
"github.com/x-izumin/gex/pkg/tool"
)

func asBuildErrors(err error) *tool.BuildErrors {
Expand Down
3 changes: 2 additions & 1 deletion cmd/gex/errors_go113.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
//go:build go1.13
// +build go1.13

package main

import (
"errors"

"github.com/izumin5210/gex/pkg/tool"
"github.com/x-izumin/gex/pkg/tool"
)

func asBuildErrors(err error) *tool.BuildErrors {
Expand Down
4 changes: 2 additions & 2 deletions cmd/gex/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import (
"os"
"path/filepath"

"github.com/izumin5210/gex"
"github.com/izumin5210/gex/pkg/tool"
"github.com/pkg/errors"
"github.com/spf13/pflag"
"github.com/x-izumin/gex"
"github.com/x-izumin/gex/pkg/tool"
)

const (
Expand Down
138 changes: 3 additions & 135 deletions config.go
Original file line number Diff line number Diff line change
@@ -1,143 +1,11 @@
package gex

import (
"io"
"io/ioutil"
"log"
"os"

"github.com/izumin5210/execx"
"github.com/pkg/errors"
"github.com/spf13/afero"

"github.com/izumin5210/gex/pkg/manager"
"github.com/izumin5210/gex/pkg/manager/dep"
"github.com/izumin5210/gex/pkg/manager/mod"
"github.com/izumin5210/gex/pkg/tool"
newGex "github.com/x-izumin/gex"
)

// Config specifies the configration for managing development tools.
type Config struct {
OutWriter io.Writer
ErrWriter io.Writer
InReader io.Reader

FS afero.Fs
Exec *execx.Executor

WorkingDir string
RootDir string
ManifestName string
BinDirName string
ManagerType manager.Type

Verbose bool
Logger *log.Logger
}
type Config = newGex.Config

// Default contains default configuration.
var Default = createDefaultConfig()

func createDefaultConfig() *Config {
wd, _ := os.Getwd()
if wd == "" {
wd = "."
}
cfg := &Config{
OutWriter: os.Stdout,
ErrWriter: os.Stderr,
InReader: os.Stdin,
FS: afero.NewOsFs(),
Exec: execx.New(),
WorkingDir: wd,
ManifestName: "tools.go",
BinDirName: "bin",
Logger: log.New(ioutil.Discard, "", 0),
}
cfg.ManagerType, cfg.RootDir = manager.DetectType(cfg.WorkingDir, cfg.FS, cfg.Exec)
return cfg
}

// Create creates a new instance of tool.Repository to manage developemnt tools.
func (c *Config) Create() (tool.Repository, error) {
c.setDefaultsIfNeeded()

manager, executor, err := c.createManager()
if err != nil {
return nil, errors.WithStack(err)
}

return tool.NewRepository(executor, manager, c.ManagerType, &tool.Config{
FS: c.FS,
WorkingDir: c.WorkingDir,
RootDir: c.RootDir,
ManifestName: c.ManifestName,
BinDirName: c.BinDirName,
Verbose: c.Verbose,
Log: c.Logger,
}), nil
}

func (c *Config) setDefaultsIfNeeded() {
d := createDefaultConfig()

if c.OutWriter == nil {
c.OutWriter = d.OutWriter
}
if c.ErrWriter == nil {
c.ErrWriter = d.ErrWriter
}
if c.InReader == nil {
c.InReader = d.InReader
}
if c.FS == nil {
c.FS = d.FS
}
if c.Exec == nil {
c.Exec = d.Exec
}
if c.WorkingDir == "" {
c.WorkingDir = d.WorkingDir
}
if c.ManifestName == "" {
c.ManifestName = d.ManifestName
}
if c.BinDirName == "" {
c.BinDirName = d.BinDirName
}
if c.Logger == nil {
c.Logger = d.Logger
}

if c.ManagerType == manager.TypeUnknown {
c.ManagerType, c.RootDir = manager.DetectType(c.WorkingDir, c.FS, c.Exec)
}

if rootDir, err := manager.FindRoot(c.WorkingDir, c.FS, c.ManifestName); err == nil {
if len(rootDir) > len(c.RootDir) {
c.RootDir = rootDir
}
}
}

func (c *Config) createManager() (
manager.Interface,
manager.Executor,
error,
) {
executor := manager.NewExecutor(c.Exec, c.OutWriter, c.ErrWriter, c.InReader, c.WorkingDir, c.Logger)
var (
m manager.Interface
)

switch c.ManagerType {
case manager.TypeModules:
m = mod.NewManager(executor)
case manager.TypeDep:
m = dep.NewManager(executor, c.RootDir, c.WorkingDir)
default:
return nil, nil, errors.New("failed to detect a dependencies management tool")
}

return m, executor, nil
}
var Default = newGex.Default
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Deprecated: use github.com/x-izumin/gex instead.
module github.com/izumin5210/gex

go 1.11
Expand All @@ -9,4 +10,5 @@ require (
github.com/pkg/errors v0.9.1
github.com/spf13/afero v1.2.2
github.com/spf13/pflag v1.0.5
github.com/x-izumin/gex v0.7.0 // indirect
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/x-izumin/gex v0.7.0 h1:e1CpoOqTWGRG71KhOOHsXYmXG33RT0ddc6QzedFFMgQ=
github.com/x-izumin/gex v0.7.0/go.mod h1:NPllnnJqH5urK0Ikodk3dKjDfCE34atOTV/oRZ3VbU0=
golang.org/x/sys v0.0.0-20191018095205-727590c5006e h1:ZtoklVMHQy6BFRHkbG6JzK+S6rX82//Yeok1vMlizfQ=
golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
Expand Down
116 changes: 2 additions & 114 deletions pkg/manager/dep/manager.go
Original file line number Diff line number Diff line change
@@ -1,120 +1,8 @@
package dep

import (
"context"
"encoding/json"
"path"
"path/filepath"
"strings"

"github.com/pkg/errors"

"github.com/izumin5210/gex/pkg/manager"
newDep "github.com/x-izumin/gex/pkg/manager/dep"
)

// NewManager creates a manager.Interface instance to manage tools vendored with dep.
func NewManager(executor manager.Executor, rootDir, workingDir string) manager.Interface {
return &managerImpl{
executor: executor,
rootDir: rootDir,
workingDir: workingDir,
}
}

type managerImpl struct {
executor manager.Executor
rootDir string
workingDir string
}

func (m *managerImpl) Add(ctx context.Context, pkgs []string, verbose bool) error {
var err error
pkgs, err = m.pickNewPackages(ctx, pkgs)
if err != nil {
return errors.WithStack(err)
}

if len(pkgs) == 0 {
return nil
}

args := []string{"ensure"}
if verbose {
args = append(args, "-v")
}
args = append(args, "-add")
args = append(args, pkgs...)
return errors.WithStack(m.executor.Exec(ctx, "dep", args...))
}

func (m *managerImpl) Build(ctx context.Context, binPath, pkg string, verbose bool) error {
target, err := filepath.Rel(m.workingDir, m.rootDir)
if err != nil {
return errors.WithStack(err)
}
target = filepath.Join(target, "vendor", pkg)
if !strings.HasPrefix(target, "..") {
target = "." + string(filepath.Separator) + target
}
args := []string{"build", "-o", binPath}
if verbose {
args = append(args, "-v")
}
args = append(args, target)
return errors.WithStack(m.executor.Exec(ctx, "go", args...))
}

func (m *managerImpl) Sync(ctx context.Context, verbose bool) error {
args := []string{"ensure"}
if verbose {
args = append(args, "-v")
}
return errors.WithStack(m.executor.Exec(ctx, "dep", args...))
}

func (m *managerImpl) pickNewPackages(ctx context.Context, pkgs []string) ([]string, error) {
pkgSet, err := m.getExistingPackageSet(ctx)
if err != nil {
return nil, errors.WithStack(err)
}

if len(pkgSet) == 0 {
return pkgs, nil
}

result := make([]string, 0, len(pkgs))

for _, pkg := range pkgs {
var skipped bool
for pkg := pkg; pkg != "."; pkg = path.Dir(pkg) {
if _, ok := pkgSet[pkg]; ok {
skipped = true
break
}
}
if !skipped {
result = append(result, pkg)
}
}

return result, nil
}

func (m *managerImpl) getExistingPackageSet(ctx context.Context) (map[string]struct{}, error) {
out, err := m.executor.Output(ctx, "dep", "status", "-json")
if err != nil {
return make(map[string]struct{}), nil
}
pkgs := []struct{ ProjectRoot string }{}
err = json.Unmarshal(out, &pkgs)
if err != nil {
return nil, errors.WithStack(err)
}

pkgRoots := make(map[string]struct{}, len(pkgs))
for _, pkg := range pkgs {
pkgRoots[pkg.ProjectRoot] = struct{}{}
}

return pkgRoots, nil
}
var NewManager = newDep.NewManager
Loading
Loading