@@ -8,105 +8,40 @@ import (
88 "strings"
99
1010 "github.com/BurntSushi/toml"
11- )
12-
13- // Config holds all application configuration
14- type Config struct {
15- // Paths
16- RootBucket string
17- LockDir string
18- VersionDir string
19- LocalVersionDir string
20- LocalAnchorDir string
21- LocalDBDir string
22-
23- // Environment
24- DiscordWebhookURL string
25-
26- // User Info
27- CurrentUser string
28- Hostname string
29- ProjectRoot string
30-
31- // Tool Info
32- ToolVersion string
33- }
3411
35- var AppConfig = Config {
36- ToolVersion : "v1.0" ,
37- }
38-
39- // Sync Status Constants
40- const (
41- SyncStatusLocalOnly = "+"
42- SyncStatusRemoteOnly = "-"
43- SyncStatusDifferent = "*"
12+ "b2m/model"
4413)
4514
4615// InitializeConfig sets up global configuration variables
4716func InitializeConfig () error {
4817 var err error
4918
50- AppConfig .ProjectRoot , err = findProjectRoot ()
19+ model . AppConfig .ProjectRoot , err = findProjectRoot ()
5120 if err != nil {
5221 fmt .Fprintf (os .Stderr , "⚠️ Could not determine project root: %v. Using CWD.\n " , err )
53- AppConfig .ProjectRoot , _ = os .Getwd ()
54- }
55-
56- // Load config from b2m.toml
57- tomlPath := filepath .Join (AppConfig .ProjectRoot , "b2m.toml" )
58- if _ , err := os .Stat (tomlPath ); os .IsNotExist (err ) {
59- return fmt .Errorf ("couldn't find b2m.toml file at %s: %w" , tomlPath , err )
60- }
61-
62- var tomlConf struct {
63- Discord string `toml:"discord"`
64- RootBucket string `toml:"rootbucket"`
22+ model .AppConfig .ProjectRoot , _ = os .Getwd ()
6523 }
66- if _ , err := toml .DecodeFile (tomlPath , & tomlConf ); err != nil {
67- return fmt .Errorf ("failed to decode b2m.toml: %w" , err )
68- }
69-
70- AppConfig .RootBucket = tomlConf .RootBucket
71- AppConfig .DiscordWebhookURL = tomlConf .Discord
7224
73- if AppConfig .RootBucket == "" {
74- return fmt .Errorf ("rootbucket not defined in b2m.toml file" )
75- }
76- if AppConfig .DiscordWebhookURL == "" {
77- return fmt .Errorf ("discord not defined in b2m.toml file" )
25+ // Load config from fdt-dev.toml
26+ if err := loadTOMLConfig (); err != nil {
27+ return err
7828 }
7929
80- // Derived paths
81- // Ensure RootBucket ends with /
82- if ! strings .HasSuffix (AppConfig .RootBucket , "/" ) {
83- AppConfig .RootBucket += "/"
30+ // Validate and set derived paths
31+ if err := validateAndSetPaths (); err != nil {
32+ return err
8433 }
8534
86- AppConfig . LockDir = AppConfig . RootBucket + "lock/"
87- AppConfig . VersionDir = AppConfig . RootBucket + "version/"
35+ // Fetch user details
36+ fetchUserDetails ()
8837
89- var u * user.User
90- u , err = user .Current ()
91- if err != nil {
92- AppConfig .CurrentUser = "unknown"
93- } else {
94- AppConfig .CurrentUser = u .Username
95- }
96-
97- var h string
98- h , err = os .Hostname ()
99- if err != nil {
100- AppConfig .Hostname = "unknown"
101- } else {
102- AppConfig .Hostname = h
38+ if model .AppConfig .LocalDBDir == "" {
39+ return fmt .Errorf ("LocalDBDir not configured. Please set b2m_db_dir in your config file" )
10340 }
41+ model .AppConfig .LocalB2MDir = filepath .Join (model .AppConfig .ProjectRoot , ".b2m" )
42+ model .AppConfig .LocalVersionDir = filepath .Join (model .AppConfig .LocalB2MDir , "version" )
43+ model .AppConfig .LocalAnchorDir = filepath .Join (model .AppConfig .LocalB2MDir , "local-version" )
10444
105- AppConfig .LocalDBDir = filepath .Join (AppConfig .ProjectRoot , "db" , "all_dbs" )
106- AppConfig .LocalVersionDir = filepath .Join (AppConfig .ProjectRoot , "db" , "all_dbs" , "version" )
107- AppConfig .LocalAnchorDir = filepath .Join (AppConfig .ProjectRoot , "db" , "all_dbs" , "local-version" )
108-
109- // Initialize logging if needed, or other startup tasks
11045 return nil
11146}
11247
@@ -119,13 +54,73 @@ func findProjectRoot() (string, error) {
11954 if info , err := os .Stat (filepath .Join (dir , "db" )); err == nil && info .IsDir () {
12055 return dir , nil
12156 }
122- if _ , err := os .Stat (filepath .Join (dir , "go.mod" )); err == nil {
123- return dir , nil
124- }
12557 parent := filepath .Dir (dir )
12658 if parent == dir {
127- return "" , fmt .Errorf ("root not found (searched for 'db' dir or 'go.mod') " )
59+ return "" , fmt .Errorf ("root not found 'db' dir" )
12860 }
12961 dir = parent
13062 }
13163}
64+
65+ func loadTOMLConfig () error {
66+ tomlPath := filepath .Join (model .AppConfig .ProjectRoot , "fdt-dev.toml" )
67+ if _ , err := os .Stat (tomlPath ); os .IsNotExist (err ) {
68+ return fmt .Errorf ("couldn't find fdt-dev.toml file at %s: %w" , tomlPath , err )
69+ }
70+
71+ var tomlConf struct {
72+ B2M struct {
73+ Discord string `toml:"b2m_discord_webhook"`
74+ RootBucket string `toml:"b2m_remote_root_bucket"`
75+ LocalDBDir string `toml:"b2m_db_dir"`
76+ } `toml:"b2m"`
77+ }
78+ if _ , err := toml .DecodeFile (tomlPath , & tomlConf ); err != nil {
79+ return fmt .Errorf ("failed to decode fdt-dev.toml: %w" , err )
80+ }
81+
82+ model .AppConfig .RootBucket = tomlConf .B2M .RootBucket
83+ model .AppConfig .DiscordWebhookURL = tomlConf .B2M .Discord
84+ if tomlConf .B2M .LocalDBDir != "" {
85+ if filepath .IsAbs (tomlConf .B2M .LocalDBDir ) {
86+ model .AppConfig .LocalDBDir = tomlConf .B2M .LocalDBDir
87+ } else {
88+ model .AppConfig .LocalDBDir = filepath .Join (model .AppConfig .ProjectRoot , tomlConf .B2M .LocalDBDir )
89+ }
90+ }
91+
92+ return nil
93+ }
94+
95+ func validateAndSetPaths () error {
96+ if model .AppConfig .RootBucket == "" {
97+ return fmt .Errorf ("b2m_remote_root_bucket not defined in fdt-dev.toml file" )
98+ }
99+ if model .AppConfig .DiscordWebhookURL == "" {
100+ return fmt .Errorf ("b2m_discord_webhook not defined in fdt-dev.toml file" )
101+ }
102+
103+ if ! strings .HasSuffix (model .AppConfig .RootBucket , "/" ) {
104+ model .AppConfig .RootBucket += "/"
105+ }
106+
107+ model .AppConfig .LockDir = model .AppConfig .RootBucket + "lock/"
108+ model .AppConfig .VersionDir = model .AppConfig .RootBucket + "version/"
109+ return nil
110+ }
111+
112+ func fetchUserDetails () {
113+ u , err := user .Current ()
114+ if err != nil {
115+ model .AppConfig .CurrentUser = "unknown"
116+ } else {
117+ model .AppConfig .CurrentUser = u .Username
118+ }
119+
120+ h , err := os .Hostname ()
121+ if err != nil {
122+ model .AppConfig .Hostname = "unknown"
123+ } else {
124+ model .AppConfig .Hostname = h
125+ }
126+ }
0 commit comments