From 60691a6fb610cb7f7290d6ab3a26bc74f95af611 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 23 Jun 2025 17:24:20 +0300 Subject: Add configuration file support with organization list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create config package with JSON parsing support - Define Organization struct with host and name - Add config file auto-detection in common locations - Add --config/-c flag for custom config path - Add --list-orgs flag to display configured organizations - Create example configuration file - Add comprehensive .gitignore Configuration supports multiple git organizations for future sync functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- cmd/gitsyncer/main.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 3 deletions(-) (limited to 'cmd') diff --git a/cmd/gitsyncer/main.go b/cmd/gitsyncer/main.go index 3a38d32..d859747 100644 --- a/cmd/gitsyncer/main.go +++ b/cmd/gitsyncer/main.go @@ -3,23 +3,93 @@ package main import ( "flag" "fmt" + "log" "os" + "path/filepath" + "github.com/paul/gitsyncer/internal/config" "github.com/paul/gitsyncer/internal/version" ) func main() { - var versionFlag bool + var ( + versionFlag bool + configPath string + listOrgs bool + ) + + // Define command line flags flag.BoolVar(&versionFlag, "version", false, "print version information") flag.BoolVar(&versionFlag, "v", false, "print version information (short)") + flag.StringVar(&configPath, "config", "", "path to configuration file") + flag.StringVar(&configPath, "c", "", "path to configuration file (short)") + flag.BoolVar(&listOrgs, "list-orgs", false, "list configured organizations") flag.Parse() + // Handle version flag if versionFlag { fmt.Println(version.GetVersion()) os.Exit(0) } + // Determine config file path + if configPath == "" { + // Try default locations + home, err := os.UserHomeDir() + if err != nil { + log.Fatal("Failed to get home directory:", err) + } + + // Check common config locations + configLocations := []string{ + filepath.Join(".", "gitsyncer.json"), + filepath.Join(home, ".config", "gitsyncer", "config.json"), + filepath.Join(home, ".gitsyncer.json"), + } + + for _, loc := range configLocations { + if _, err := os.Stat(loc); err == nil { + configPath = loc + break + } + } + + if configPath == "" { + fmt.Println("No configuration file found. Please create one of:") + for _, loc := range configLocations { + fmt.Printf(" - %s\n", loc) + } + fmt.Println("\nOr specify a config file with --config flag") + fmt.Println("\nExample configuration:") + fmt.Println(`{ + "organizations": [ + {"host": "git@github.com", "name": "myorg"}, + {"host": "git@codeberg.org", "name": "myorg"} + ] +}`) + os.Exit(1) + } + } + + // Load configuration + cfg, err := config.Load(configPath) + if err != nil { + log.Fatal("Failed to load configuration:", err) + } + + fmt.Printf("Loaded configuration from: %s\n", configPath) + + // Handle list organizations flag + if listOrgs { + fmt.Println("\nConfigured organizations:") + for _, org := range cfg.Organizations { + fmt.Printf(" - %s\n", org.GetGitURL()) + } + os.Exit(0) + } + // TODO: Implement main gitsyncer functionality - fmt.Println("gitsyncer - Git repository synchronization tool") - fmt.Println("Use --version to display version information") + fmt.Println("\ngitsyncer - Git repository synchronization tool") + fmt.Printf("Configured with %d organization(s)\n", len(cfg.Organizations)) + fmt.Println("\nUse --list-orgs to display configured organizations") } \ No newline at end of file -- cgit v1.2.3