package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"gerrit.wikimedia.org/r/blubber/build"
|
|
)
|
|
|
|
// LocalArtifactKeyword defines a special keyword indicating
|
|
// file/directory artifacts to be copied from the local build host context.
|
|
//
|
|
const LocalArtifactKeyword = "local"
|
|
|
|
// CopiesConfig holds configuration for which files to copy into the variant
|
|
// from local and other variant sources.
|
|
//
|
|
type CopiesConfig []ArtifactsConfig
|
|
|
|
// Expand returns a version of this CopiesConfig with its shorthand
|
|
// configurations expanded.
|
|
//
|
|
func (cc *CopiesConfig) Expand(appDirectory string) CopiesConfig {
|
|
expanded := CopiesConfig{}
|
|
|
|
// expand all artifact definitions
|
|
for _, artifact := range *cc {
|
|
expanded = append(expanded, artifact.Expand(appDirectory)...)
|
|
}
|
|
|
|
return expanded
|
|
}
|
|
|
|
// InstructionsForPhase delegates to its member ArtifactsConfig.
|
|
//
|
|
func (cc CopiesConfig) InstructionsForPhase(phase build.Phase) []build.Instruction {
|
|
instructions := []build.Instruction{}
|
|
|
|
for _, artifact := range cc {
|
|
instructions = append(instructions, artifact.InstructionsForPhase(phase)...)
|
|
}
|
|
|
|
return instructions
|
|
}
|
|
|
|
// Merge takes another CopiesConfig and overwrites this struct's fields.
|
|
//
|
|
// Artifacts are merged additively and duplicates are removed. Uniqueness is
|
|
// ensured by taking the latest definition over the previous.
|
|
//
|
|
func (cc *CopiesConfig) Merge(cc2 CopiesConfig) {
|
|
// efficient search of the other CopiesConfig using a map
|
|
newlyDefined := make(map[ArtifactsConfig]bool, len(*cc))
|
|
for _, artifact := range cc2 {
|
|
newlyDefined[artifact] = true
|
|
}
|
|
|
|
dupesRemoved := CopiesConfig{}
|
|
|
|
// omit any previously defined artifacts that are among the new
|
|
for _, artifact := range *cc {
|
|
if !newlyDefined[artifact] {
|
|
dupesRemoved = append(dupesRemoved, artifact)
|
|
}
|
|
}
|
|
|
|
*cc = append(dupesRemoved, cc2...)
|
|
}
|
|
|
|
// UnmarshalJSON implements json.Unmarshaler to handle both shorthand and
|
|
// longhand copies configuration.
|
|
//
|
|
func (cc *CopiesConfig) UnmarshalJSON(unmarshal []byte) error {
|
|
shorthand := []string{}
|
|
|
|
err := json.Unmarshal(unmarshal, &shorthand)
|
|
|
|
if err == nil {
|
|
*cc = make(CopiesConfig, len(shorthand))
|
|
|
|
for i, variant := range shorthand {
|
|
(*cc)[i] = ArtifactsConfig{From: variant}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
longhand := []ArtifactsConfig{}
|
|
|
|
err = json.Unmarshal(unmarshal, &longhand)
|
|
|
|
if err == nil {
|
|
*cc = CopiesConfig(longhand)
|
|
|
|
return nil
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// Variants returns a unique slice of variant names that are referenced by
|
|
// artifact definitions.
|
|
//
|
|
func (cc *CopiesConfig) Variants() []string {
|
|
existing := map[string]bool{}
|
|
variants := []string{}
|
|
|
|
for _, artifact := range *cc {
|
|
if v := artifact.From; v != "" && v != LocalArtifactKeyword && !existing[v] {
|
|
existing[v] = true
|
|
variants = append(variants, v)
|
|
}
|
|
}
|
|
|
|
return variants
|
|
}
|