|
|
- 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
- }
|