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  }