github.com/n0needt0/glide@v0.0.0-20160325160517-844a77136d85/repo/set_reference.go (about) 1 package repo 2 3 import ( 4 "sync" 5 6 "github.com/Masterminds/glide/cfg" 7 "github.com/Masterminds/glide/msg" 8 gpath "github.com/Masterminds/glide/path" 9 ) 10 11 // SetReference is a command to set the VCS reference (commit id, tag, etc) for 12 // a project. 13 func SetReference(conf *cfg.Config) error { 14 15 cwd, err := gpath.Vendor() 16 if err != nil { 17 return err 18 } 19 20 if len(conf.Imports) == 0 { 21 msg.Info("No references set.\n") 22 return nil 23 } 24 25 done := make(chan struct{}, concurrentWorkers) 26 in := make(chan *cfg.Dependency, concurrentWorkers) 27 var wg sync.WaitGroup 28 29 for i := 0; i < concurrentWorkers; i++ { 30 go func(ch <-chan *cfg.Dependency) { 31 for { 32 select { 33 case dep := <-ch: 34 if err := VcsVersion(dep, cwd); err != nil { 35 msg.Err("Failed to set version on %s to %s: %s\n", dep.Name, dep.Reference, err) 36 } 37 wg.Done() 38 case <-done: 39 return 40 } 41 } 42 }(in) 43 } 44 45 for _, dep := range conf.Imports { 46 if !conf.HasIgnore(dep.Name) { 47 wg.Add(1) 48 in <- dep 49 } 50 } 51 52 wg.Wait() 53 // Close goroutines setting the version 54 for i := 0; i < concurrentWorkers; i++ { 55 done <- struct{}{} 56 } 57 // close(done) 58 // close(in) 59 60 return nil 61 }