Skip to content

Commit

Permalink
v1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
snakeice committed Oct 2, 2018
1 parent d8fb698 commit 70667b1
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 167 deletions.
277 changes: 125 additions & 152 deletions .idea/workspace.xml

Large diffs are not rendered by default.

16 changes: 13 additions & 3 deletions cmd/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package cmd
import (
"github.com/hashload/boss/core"
"github.com/hashload/boss/core/gb"
"github.com/hashload/boss/core/paths"
"github.com/hashload/boss/models"
"github.com/hashload/boss/msg"
"github.com/hashload/boss/utils"
"github.com/spf13/cobra"
"strings"
Expand All @@ -18,22 +20,30 @@ var installCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
loadPackage, e := models.LoadPackage(true)
if e != nil {
e.Error()
msg.Die("Fail on open boss.json: %s", e)
}

for e := range args {
dependency := args[e]
split := strings.Split(dependency, ":")
var ver string
if len(split) == 1 {
ver = "^1"
} else {
ver = split[1]
}
if dev {
loadPackage.AddDevDependency(split[0], split[1])

loadPackage.AddDevDependency(split[0], ver)
} else {
loadPackage.AddDependency(split[0], split[1])
loadPackage.AddDependency(split[0], ver)
}
}
if loadPackage.IsNew && len(args) == 0 {
return
}
loadPackage.Save()
paths.EnsureModulesDir()
core.EnsureDependencies(loadPackage)
utils.UpdateLibraryPath()
gb.RunGB()
Expand Down
4 changes: 2 additions & 2 deletions core/git/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ func makeStorageCache(dep models.Dependency) storage.Storer {

func GetRepository(dep models.Dependency) *git.Repository {
cache := makeStorageCache(dep)
mfs := memfs.New()
repository, e := git.Open(cache, mfs)
dir := osfs.New(filepath.Join(env.GetModulesDir(), dep.GetName()))
repository, e := git.Open(cache, dir)
if e != nil {
msg.Err("Error on open repository %s: %s", dep.Repository, e)
}
Expand Down
62 changes: 56 additions & 6 deletions core/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@ import (
"github.com/hashload/boss/msg"
git2 "gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"io/ioutil"
"os"
"path/filepath"
)

var processed = make([]string, 0)

var processedOld = 0

func EnsureDependencies(pkg *models.Package) {
if pkg.Dependencies == nil {
return
Expand All @@ -22,11 +28,12 @@ func EnsureDependencies(pkg *models.Package) {
makeCache(deps)

ensureModules(deps)

processOthers()
}

func makeCache(deps []models.Dependency) {
msg.Info("Building cache files..")

for _, dep := range deps {
GetDependency(dep)
}
Expand All @@ -35,19 +42,20 @@ func makeCache(deps []models.Dependency) {
func ensureModules(deps []models.Dependency) {
msg.Info("Installing modules in project patch")
for _, dep := range deps {
msg.Info("Processing dependency: %s", dep.GetName())
repository := OpenRepository(dep)
versions := git.GetVersions(repository)
constraints, e := semver.NewConstraint(dep.GetVersion())
if e != nil {
msg.Err("Version type not supported! %s", e)
msg.Err("\tVersion type not supported! %s", e)
}
var bestMatch *plumbing.Reference
hasMatch := false
for _, version := range versions {
short := version.Name().Short()
newVersion, err := semver.NewVersion(short)
if err != nil {
msg.Warn("Erro to parse version %s: '%s' in dependency %s", short, err, dep.Repository)
msg.Warn("\tErro to parse version %s: '%s' in dependency %s", short, err, dep.Repository)
continue
}
validate, _ := constraints.Validate(newVersion)
Expand All @@ -58,9 +66,9 @@ func ensureModules(deps []models.Dependency) {
}
}
if !hasMatch {
msg.Die("No candidate to version %s", dep.GetVersion())
msg.Die("\tNo candidate to version %s", dep.GetVersion())
} else {
msg.Info("For %s using version %s", dep.Repository, bestMatch.Name().Short())
msg.Info("\tFor %s using version %s", dep.Repository, bestMatch.Name().Short())
}

worktree, _ := repository.Worktree()
Expand All @@ -70,9 +78,51 @@ func ensureModules(deps []models.Dependency) {
Hash: bestMatch.Hash(),
})
if err != nil {
msg.Die("Error on switch to needed version from dependency: %s", dep.Repository)
msg.Die("\tError on switch to needed version from dependency: %s", dep.Repository)
}
processed = append(processed, dep.GetName())
}
}

func contains(a []string, x string) bool {
for _, n := range a {
if x == n {
return true
}
}
return false
}

func processOthers() {
if len(processed) > processedOld {
processedOld = len(processed)
infos, e := ioutil.ReadDir(env.GetModulesDir())
if e != nil {
msg.Err("Error on try load dir of modules: %s", e)
}

for _, info := range infos {
if !info.IsDir() {
continue
}
if contains(processed, info.Name()) {
continue
}
msg.Info("Proccessing module: %s", info.Name())

fileName := filepath.Join(env.GetModulesDir(), info.Name(), "boss.json")

_, i := os.Stat(fileName)
if os.IsNotExist(i) {
msg.Warn("boss.json not exists in %s", info.Name())
}

if packageOther, e := models.LoadPackageOther(fileName); e != nil {
msg.Err("Error on try load package %s: %s", fileName, e)
} else {
EnsureDependencies(packageOther)
}
}

}
}
6 changes: 4 additions & 2 deletions core/paths/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@ func EnsureCacheDir(dep models.Dependency) {

func EnsureModulesDir() {
cacheDir := env.GetModulesDir()

fi, err := os.Stat(cacheDir)
if err != nil {
if os.IsNotExist(err) {
msg.Debug("Creating %s", cacheDir)
if err := os.MkdirAll(cacheDir, os.ModeDir|0755); err != nil {
msg.Die("Could not create %s: %s", cacheDir, err)
}
} else if !fi.IsDir() {
msg.Die("modules is not a directory")
} else {
os.RemoveAll(cacheDir)
EnsureModulesDir()
}
}
9 changes: 7 additions & 2 deletions models/dep.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ func (d *Dependency) GetURL() string {
}

var re = regexp.MustCompile(`(?m)^(.|)(\d+)\.(\d+)$`)
var re2 = regexp.MustCompile(`(?m)^(.|)(\d+)$`)

func ParseDependency(repo string, info string) Dependency {
parsed := strings.Split(info, ":")
Expand All @@ -61,7 +62,11 @@ func ParseDependency(repo string, info string) Dependency {
dependency.Repository, dependency.version, dependency.version+".0")
dependency.version = dependency.version + ".0"
}

if re2.MatchString(dependency.version) {
msg.Warn("Current version for %s is not semantic (x.y.z), for comparation using %s -> %s",
dependency.Repository, dependency.version, dependency.version+".0.0/")
dependency.version = dependency.version + ".0.0"
}
if len(parsed) > 1 {
dependency.UseSSH = parsed[1] == "ssh"
}
Expand All @@ -77,6 +82,6 @@ func GetDependencies(deps map[string]interface{}) []Dependency {
}

func (d *Dependency) GetName() string {
var re = regexp.MustCompile(`(?m)\w+$`)
var re = regexp.MustCompile(`[^\/]+(:?\/$|$)`)
return re.FindString(d.Repository)
}
12 changes: 12 additions & 0 deletions models/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,15 @@ func LoadPackage(createNew bool) (*Package, error) {
return result, nil
}
}

func LoadPackageOther(path string) (*Package, error) {
if bytes, e := ReadFile(path); e != nil {
return nil, e
} else {
result := getNew(path)
if err := json.Unmarshal(bytes, result); err != nil {
return nil, e
}
return result, nil
}
}

0 comments on commit 70667b1

Please sign in to comment.