func TestRunOrder(t *testing.T) { var m Manifest data := []byte(`web: links: - postgres - redis worker_2: links: - postgres - redis worker_1: links: - postgres - redis redis: image: convox/redis postgres: image: convox/postgres `) _ = yaml.Unmarshal(data, &m) cases := Cases{ {m.runOrder(), []string{"postgres", "redis", "web", "worker_1", "worker_2"}}, } _assert(t, cases) }
func Read(dir string) (*Manifest, error) { data, err := ioutil.ReadFile(filepath.Join(dir, "docker-compose.yml")) if err != nil { return nil, fmt.Errorf("file not found: docker-compose.yml") } var m Manifest err = yaml.Unmarshal(data, &m) if err != nil { return nil, err } if denv := filepath.Join(dir, ".env"); exists(denv) { data, err := ioutil.ReadFile(denv) if err != nil { return nil, err } scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { if strings.Index(scanner.Text(), "=") > -1 { parts := strings.SplitN(scanner.Text(), "=", 2) err := os.Setenv(parts[0], parts[1]) if err != nil { return nil, err } } } if err := scanner.Err(); err != nil { return nil, err } } for name, entry := range m { for i, volume := range entry.Volumes { parts := strings.Split(volume, ":") for j, part := range parts { if !filepath.IsAbs(part) { parts[j] = filepath.Join(dir, part) } } m[name].Volumes[i] = strings.Join(parts, ":") } } return &m, nil }