github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/container/env.go (about)

     1  package container // import "github.com/demonoid81/moby/container"
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  // ReplaceOrAppendEnvValues returns the defaults with the overrides either
     8  // replaced by env key or appended to the list
     9  func ReplaceOrAppendEnvValues(defaults, overrides []string) []string {
    10  	cache := make(map[string]int, len(defaults))
    11  	for i, e := range defaults {
    12  		index := strings.Index(e, "=")
    13  		cache[e[:index]] = i
    14  	}
    15  
    16  	for _, value := range overrides {
    17  		// Values w/o = means they want this env to be removed/unset.
    18  		index := strings.Index(value, "=")
    19  		if index < 0 {
    20  			// no "=" in value
    21  			if i, exists := cache[value]; exists {
    22  				defaults[i] = "" // Used to indicate it should be removed
    23  			}
    24  			continue
    25  		}
    26  
    27  		if i, exists := cache[value[:index]]; exists {
    28  			defaults[i] = value
    29  		} else {
    30  			defaults = append(defaults, value)
    31  		}
    32  	}
    33  
    34  	// Now remove all entries that we want to "unset"
    35  	for i := 0; i < len(defaults); i++ {
    36  		if defaults[i] == "" {
    37  			defaults = append(defaults[:i], defaults[i+1:]...)
    38  			i--
    39  		}
    40  	}
    41  
    42  	return defaults
    43  }