@@ -492,6 +492,53 @@ func (c *config) Load(path string, fsys fs.FS) error {
492
492
if version , err := fs .ReadFile (fsys , builder .PgmetaVersionPath ); err == nil && len (version ) > 0 {
493
493
c .Studio .PgmetaImage = replaceImageTag (pgmetaImage , string (version ))
494
494
}
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 {
495
542
// Update content paths
496
543
for name , tmpl := range c .Auth .Email .Template {
497
544
// FIXME: only email template is relative to repo directory
@@ -534,43 +581,7 @@ func (c *config) Load(path string, fsys fs.FS) error {
534
581
}
535
582
c .Functions [slug ] = function
536
583
}
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 )
574
585
}
575
586
576
587
func (c * baseConfig ) Validate (fsys fs.FS ) error {
0 commit comments