glp/projecter/exported.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")
}