#2 mark projects as to be moved
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
3a82bf1776
commit
a31cb3d307
5 changed files with 90 additions and 15 deletions
|
@ -2,16 +2,50 @@ package scanner
|
|||
|
||||
import (
|
||||
"git.entr0py.de/garionion/murphy/store"
|
||||
"github.com/go-co-op/gocron"
|
||||
"github.com/hako/durafmt"
|
||||
"github.com/karrick/godirwalk"
|
||||
"github.com/mehdioa/nlog"
|
||||
"github.com/oriser/regroup"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
func scan(p *store.Project) {
|
||||
func CheckProjects(s *store.Store) {
|
||||
wg := new(sync.WaitGroup)
|
||||
for _, source := range s.SourcePath {
|
||||
wg.Add(1)
|
||||
go func(source string) {
|
||||
rootScanner(source, s.GetProjects(), s.Logger, wg)
|
||||
wg.Done()
|
||||
}(source)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
projects := make(map[string]*store.Project)
|
||||
for _, project := range s.GetProjects() {
|
||||
if project.LastChange.Add(s.GracePeriod).Before(time.Now()) {
|
||||
project.Logger.Infof("Project %s was not touched in %v ", project.ProjectName, durafmt.Parse(time.Now().Sub(project.LastChange)).LimitFirstN(2))
|
||||
wg.Add(1)
|
||||
go scan(project, wg)
|
||||
projects[project.ProjectName] = project
|
||||
}
|
||||
}
|
||||
wg.Wait()
|
||||
for _, project := range projects {
|
||||
if project.LastChange.Add(s.GracePeriod).Before(time.Now()) {
|
||||
project.ShouldMove = true
|
||||
project.Logger.Infof("Marked Project to be moved")
|
||||
}
|
||||
}
|
||||
//TODO: inform users that projects will be moved
|
||||
}
|
||||
|
||||
func scan(p *store.Project, group *sync.WaitGroup) {
|
||||
defer group.Done()
|
||||
log := p.Logger
|
||||
log.Infof("Scanning %s", p.ProjectName)
|
||||
lastModified := time.Time{}
|
||||
|
@ -33,25 +67,46 @@ func scan(p *store.Project) {
|
|||
if err != nil {
|
||||
log.Errorf("Error scanning %s: %v", p.ProjectName, err)
|
||||
}
|
||||
log.Infof("Found last modification time %v", lastModified)
|
||||
log.Debugf("Found last modification time %v", lastModified)
|
||||
p.LastChange = lastModified
|
||||
}
|
||||
|
||||
func NewProject(target, projectName string, createdAt time.Time, logger *nlog.Logger) *store.Project {
|
||||
func NewProject(target, projectName string, createdAt time.Time, logger *nlog.Logger, wg *sync.WaitGroup) *store.Project {
|
||||
projectLogger := logger.New("Project", nlog.Data{"Project": projectName})
|
||||
project := &store.Project{TargetPath: target, Created: createdAt, ProjectName: projectName, Logger: projectLogger}
|
||||
go scan(project)
|
||||
wg.Add(1)
|
||||
go scan(project, wg)
|
||||
return project
|
||||
}
|
||||
|
||||
func InitScanner(s *store.Store, sourcePath string) {
|
||||
func InitScanner(s *store.Store) {
|
||||
s.Logger.Infof("Initializing scanner")
|
||||
projects := s.GetProjects()
|
||||
rootScanner(sourcePath, projects, s.Logger)
|
||||
wg := new(sync.WaitGroup)
|
||||
|
||||
for _, source := range s.SourcePath {
|
||||
wg.Add(1)
|
||||
go func(source string) {
|
||||
rootScanner(source, projects, s.Logger, wg)
|
||||
wg.Done()
|
||||
}(source)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
s.Logger.Infof("Found %d projects", len(projects))
|
||||
scheduler := gocron.NewScheduler(time.Local)
|
||||
_, err := scheduler.Every(1).Day().At("08:00:00").Do(func() {
|
||||
CheckProjects(s)
|
||||
})
|
||||
if err != nil {
|
||||
s.Logger.Errorf("Failed to create Scheduler", err)
|
||||
}
|
||||
scheduler.StartImmediately()
|
||||
scheduler.StartAsync()
|
||||
s.Scheduler = scheduler
|
||||
}
|
||||
|
||||
func rootScanner(rootPath string, projects map[string]*store.Project, logger *nlog.Logger) {
|
||||
func rootScanner(rootPath string, projects map[string]*store.Project, logger *nlog.Logger, wg *sync.WaitGroup) {
|
||||
resorts, err := ioutil.ReadDir(rootPath)
|
||||
if err != nil {
|
||||
logger.Errorf("Error reading directory %s: %v", rootPath, err)
|
||||
|
@ -90,7 +145,7 @@ func rootScanner(rootPath string, projects map[string]*store.Project, logger *nl
|
|||
logger.Errorf("Failed to parse date %s: %v, Using Null-Time for %s", createdAtString, err, p.Name())
|
||||
createdAt = time.Time{}
|
||||
}
|
||||
scanner := NewProject(projectPath, projectName, createdAt, logger)
|
||||
scanner := NewProject(projectPath, projectName, createdAt, logger, wg)
|
||||
projects[p.Name()] = scanner
|
||||
} else {
|
||||
logger.Debugf("Ignoring Directory %s", projectPath)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue