Skip to content

Commit 7a513e3

Browse files
authored
fix: resolve file paths in remote config (#3002)
* Update config.go * Update config.go * Update config.go * Update config.go * Update config.go * Update config.go * Update config.go
1 parent e303c41 commit 7a513e3

File tree

1 file changed

+48
-37
lines changed

1 file changed

+48
-37
lines changed

pkg/config/config.go

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,53 @@ func (c *config) Load(path string, fsys fs.FS) error {
492492
if version, err := fs.ReadFile(fsys, builder.PgmetaVersionPath); err == nil && len(version) > 0 {
493493
c.Studio.PgmetaImage = replaceImageTag(pgmetaImage, string(version))
494494
}
495+
// Resolve remote config, then base config
496+
idToName := map[string]string{}
497+
c.Remotes = make(map[string]baseConfig, len(c.Overrides))
498+
for name, remote := range c.Overrides {
499+
base := c.baseConfig.Clone()
500+
// On remotes branches set seed as disabled by default
501+
base.Db.Seed.Enabled = false
502+
// Encode a toml file with only config overrides
503+
var buf bytes.Buffer
504+
if err := toml.NewEncoder(&buf).Encode(remote); err != nil {
505+
return errors.Errorf("failed to encode map to TOML: %w", err)
506+
}
507+
// Decode overrides using base config as defaults
508+
if metadata, err := toml.NewDecoder(&buf).Decode(&base); err != nil {
509+
return errors.Errorf("failed to decode remote config: %w", err)
510+
} else if undecoded := metadata.Undecoded(); len(undecoded) > 0 {
511+
fmt.Fprintf(os.Stderr, "WARN: unknown config fields: %+v\n", undecoded)
512+
}
513+
// Cross validate remote project id
514+
if base.ProjectId == c.baseConfig.ProjectId {
515+
fmt.Fprintf(os.Stderr, "WARN: project_id is missing for [remotes.%s]\n", name)
516+
} else if other, exists := idToName[base.ProjectId]; exists {
517+
return errors.Errorf("duplicate project_id for [remotes.%s] and [remotes.%s]", other, name)
518+
} else {
519+
idToName[base.ProjectId] = name
520+
}
521+
if err := base.resolve(builder, fsys); err != nil {
522+
return err
523+
}
524+
c.Remotes[name] = base
525+
}
526+
if err := c.baseConfig.resolve(builder, fsys); err != nil {
527+
return err
528+
}
529+
// Validate base config, then remote config
530+
if err := c.baseConfig.Validate(fsys); err != nil {
531+
return err
532+
}
533+
for name, base := range c.Remotes {
534+
if err := base.Validate(fsys); err != nil {
535+
return errors.Errorf("invalid config for [remotes.%s]: %w", name, err)
536+
}
537+
}
538+
return nil
539+
}
540+
541+
func (c *baseConfig) resolve(builder pathBuilder, fsys fs.FS) error {
495542
// Update content paths
496543
for name, tmpl := range c.Auth.Email.Template {
497544
// FIXME: only email template is relative to repo directory
@@ -534,43 +581,7 @@ func (c *config) Load(path string, fsys fs.FS) error {
534581
}
535582
c.Functions[slug] = function
536583
}
537-
if err := c.Db.Seed.loadSeedPaths(builder.SupabaseDirPath, fsys); err != nil {
538-
return err
539-
}
540-
if err := c.baseConfig.Validate(fsys); err != nil {
541-
return err
542-
}
543-
idToName := map[string]string{}
544-
c.Remotes = make(map[string]baseConfig, len(c.Overrides))
545-
for name, remote := range c.Overrides {
546-
base := c.baseConfig.Clone()
547-
// On remotes branches set seed as disabled by default
548-
base.Db.Seed.Enabled = false
549-
// Encode a toml file with only config overrides
550-
var buf bytes.Buffer
551-
if err := toml.NewEncoder(&buf).Encode(remote); err != nil {
552-
return errors.Errorf("failed to encode map to TOML: %w", err)
553-
}
554-
// Decode overrides using base config as defaults
555-
if metadata, err := toml.NewDecoder(&buf).Decode(&base); err != nil {
556-
return errors.Errorf("failed to decode remote config: %w", err)
557-
} else if undecoded := metadata.Undecoded(); len(undecoded) > 0 {
558-
fmt.Fprintf(os.Stderr, "WARN: unknown config fields: %+v\n", undecoded)
559-
}
560-
// Cross validate remote project id
561-
if base.ProjectId == c.baseConfig.ProjectId {
562-
fmt.Fprintf(os.Stderr, "WARN: project_id is missing for [remotes.%s]\n", name)
563-
} else if other, exists := idToName[base.ProjectId]; exists {
564-
return errors.Errorf("duplicate project_id for [remotes.%s] and [remotes.%s]", other, name)
565-
} else {
566-
idToName[base.ProjectId] = name
567-
}
568-
if err := base.Validate(fsys); err != nil {
569-
return errors.Errorf("invalid config for [remotes.%s]: %w", name, err)
570-
}
571-
c.Remotes[name] = base
572-
}
573-
return nil
584+
return c.Db.Seed.loadSeedPaths(builder.SupabaseDirPath, fsys)
574585
}
575586

576587
func (c *baseConfig) Validate(fsys fs.FS) error {

0 commit comments

Comments
 (0)