package cmd import ( "fmt" "log" "os" "strings" "github.com/Jaculabilis/intake/core" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "intake", Short: "Universal and extensible feed aggregator", Long: `intake, the universal and extensible feed aggregator`, } func Execute() { err := rootCmd.Execute() if err != nil { os.Exit(1) } } var dataPath string func init() { // Disable the automatic help command rootCmd.SetHelpCommand(&cobra.Command{Hidden: true}) // All commands need to operate on a database // Setting the env-derived path as the default allows the command line to override the env dbPathFromEnv := core.ResolveEnvDataDir() rootCmd.PersistentFlags().StringVarP(&dataPath, "data-dir", "d", dbPathFromEnv, "Path to the intake data directory containing the database") if dataPath == "" { fmt.Println("error: no database specified") fmt.Println("One of --data-dir, INTAKE_DATA_DIR, XDG_DATA_HOME, or HOME must be defined.") os.Exit(1) } os.Chdir(dataPath) } // // Common logic shared by multiple commands // // Attempt to open the specified database and exit with an error if it fails. func openDb() core.DB { dbPath := core.DatabasePath(dataPath) db, err := core.OpenDb(dbPath) if err != nil { log.Fatalf("error: failed to open %s", dbPath) } return db } // Attempt to open and migrate the specified database and exit with an error if it fails. func openAndMigrateDb() core.DB { db := openDb() if err := core.InitDatabase(db); err != nil { log.Fatalf("error: failed to init database: %v", err) } if err := core.MigrateDatabase(db); err != nil { log.Fatalf("error: failed to migrate database: %v", err) } return db } // Sort "fetch" action ahead of other actions func actionSort(a string, b string) int { if a == "fetch" { return -1 } if b == "fetch" { return 1 } return strings.Compare(a, b) } func makeFormatHelpText() string { text := "Available formats:\n" for format, desc := range core.AvailableFormats { text += fmt.Sprintf(" %-13s %s\n", format, desc) } return text } func formatAs(format string) func(item core.Item) string { formatter, err := core.FormatAs(format) if err != nil { log.Fatalf("error: %v", err) } return formatter }