89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package projecter
|
|
|
|
import (
|
|
// stdlib
|
|
"log"
|
|
"strings"
|
|
"sync"
|
|
|
|
// local
|
|
"go.dev.pztrn.name/glp/configuration"
|
|
"go.dev.pztrn.name/glp/outputters"
|
|
"go.dev.pztrn.name/glp/structs"
|
|
)
|
|
|
|
var (
|
|
packages []string
|
|
|
|
outputFormat string
|
|
outputFile string
|
|
|
|
projects map[string]*Project
|
|
projectsMutex sync.RWMutex
|
|
)
|
|
|
|
// Initialize initializes package.
|
|
func Initialize(pkgs string, outFormat string, outFile string) {
|
|
log.Println("Initializing projects handler...")
|
|
|
|
packages = strings.Split(pkgs, ",")
|
|
projects = make(map[string]*Project)
|
|
|
|
outputFormat = outFormat
|
|
outputFile = outFile
|
|
|
|
log.Println("Packages list that was passed:", packages)
|
|
}
|
|
|
|
// GetProject returns project by it's path.
|
|
func GetProject(path string) *Project {
|
|
projectsMutex.RLock()
|
|
defer projectsMutex.RUnlock()
|
|
|
|
prj, found := projects[path]
|
|
if !found {
|
|
return nil
|
|
}
|
|
|
|
return prj
|
|
}
|
|
|
|
// Parse starts projects parsing.
|
|
func Parse() {
|
|
// Create project for every passed package.
|
|
// This is done in main goroutine and therefore no mutex is used.
|
|
for _, pkgPath := range packages {
|
|
prj := NewProject(pkgPath)
|
|
projects[pkgPath] = prj
|
|
}
|
|
|
|
if configuration.Cfg.Log.Debug {
|
|
log.Printf("Projects generated: %+v\n", projects)
|
|
}
|
|
|
|
// We should start asynchronous projects parsing.
|
|
var wg sync.WaitGroup
|
|
|
|
for _, prj := range projects {
|
|
wg.Add(1)
|
|
go func(prj *Project) {
|
|
prj.process()
|
|
wg.Done()
|
|
}(prj)
|
|
}
|
|
|
|
// Wait until all projects will be parsed.
|
|
wg.Wait()
|
|
|
|
// Collect dependencies list from all parsed projects.
|
|
var deps []*structs.Dependency
|
|
|
|
for _, prj := range projects {
|
|
deps = append(deps, prj.GetDeps()...)
|
|
}
|
|
|
|
outputters.Write(outputFormat, outputFile, deps)
|
|
|
|
log.Println("Parsing done")
|
|
}
|