diff --git a/.goreleaser.yml b/.goreleaser.yml index e1bac2b..9f8d5e6 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -3,6 +3,18 @@ before: - go mod download builds: + - id: git-get + main: ./cmd/get/main.go + binary: git-get + ldflags: + - -s -w + - -X git-get/pkg/cfg.version={{.Version}} + - -X git-get/pkg/cfg.commit={{.Commit}} + - -X git-get/pkg/cfg.date={{.Date}} + goos: + - linux + - darwin + - windows - id: git-list main: ./cmd/list/main.go binary: git-list @@ -19,6 +31,7 @@ builds: archives: - id: archive builds: + - git-get - git-list replacements: darwin: macOS diff --git a/cmd/get/main.go b/cmd/get/main.go new file mode 100644 index 0000000..f38396e --- /dev/null +++ b/cmd/get/main.go @@ -0,0 +1,81 @@ +package main + +import ( + "fmt" + "git-get/pkg/cfg" + "git-get/pkg/git" + "git-get/pkg/path" + "os" + pathpkg "path" + + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var cmd = &cobra.Command{ + Use: "git-get ", + Short: "git get", + Run: Run, + Args: cobra.MaximumNArgs(1), // TODO: add custom validator + Version: cfg.Version(), +} + +func init() { + cmd.PersistentFlags().StringP(cfg.KeyReposRoot, "r", "", "repos root") + cmd.PersistentFlags().StringP(cfg.KeyPrivateKey, "p", "", "SSH private key path") + cmd.PersistentFlags().StringP(cfg.KeyBundle, "u", "", "Bundle file path") + + cmd.PersistentFlags().StringP(cfg.KeyBranch, "b", cfg.DefBranch, "Branch (or tag) to checkout after cloning") + + viper.BindPFlag(cfg.KeyReposRoot, cmd.PersistentFlags().Lookup(cfg.KeyReposRoot)) + viper.BindPFlag(cfg.KeyPrivateKey, cmd.PersistentFlags().Lookup(cfg.KeyReposRoot)) + viper.BindPFlag(cfg.KeyBundle, cmd.PersistentFlags().Lookup(cfg.KeyBundle)) + viper.BindPFlag(cfg.KeyBranch, cmd.PersistentFlags().Lookup(cfg.KeyBranch)) +} + +func Run(cmd *cobra.Command, args []string) { + cfg.InitConfig() + + root := viper.GetString(cfg.KeyReposRoot) + + if bundle := viper.GetString(cfg.KeyBundle); bundle != "" { + opts, err := path.ParseBundleFile(bundle) + exitIfError(err) + + for _, opt := range opts { + path := pathpkg.Join(root, path.URLToPath(opt.URL)) + opt.Path = path + _, _ = git.CloneRepo(opt) + } + os.Exit(0) + } + + url, err := path.ParseURL(args[0]) + exitIfError(err) + + branch := viper.GetString(cfg.KeyBranch) + path := pathpkg.Join(root, path.URLToPath(url)) + + cloneOpts := &git.CloneOpts{ + URL: url, + Path: path, + Branch: branch, + } + + _, err = git.CloneRepo(cloneOpts) + exitIfError(err) +} + +func main() { + if err := cmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func exitIfError(err error) { + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/list/main.go b/cmd/list/main.go index 6842dc3..6f459d5 100644 --- a/cmd/list/main.go +++ b/cmd/list/main.go @@ -3,104 +3,70 @@ package main import ( "fmt" "git-get/pkg/cfg" - "git-get/pkg/git" "git-get/pkg/path" "git-get/pkg/print" "os" - pathpkg "path" "github.com/spf13/cobra" "github.com/spf13/viper" ) var cmd = &cobra.Command{ - Use: "git-get ", - Short: "git get", + Use: "git-list", + Short: "git list", Run: Run, - Args: cobra.MaximumNArgs(1), // TODO: add custom validator + Args: cobra.NoArgs, Version: cfg.Version(), } func init() { - cmd.PersistentFlags().BoolP(cfg.KeyList, "l", false, "Lists all repositories inside git-get root") - cmd.PersistentFlags().BoolP(cfg.KeyFetch, "f", false, "Fetch from remotes when listing repositories") cmd.PersistentFlags().StringP(cfg.KeyReposRoot, "r", "", "repos root") cmd.PersistentFlags().StringP(cfg.KeyPrivateKey, "p", "", "SSH private key path") - cmd.PersistentFlags().StringP(cfg.KeyOutput, "o", cfg.DefOutput, "output format.") - cmd.PersistentFlags().StringP(cfg.KeyBranch, "b", cfg.DefBranch, "Branch (or tag) to checkout after cloning") cmd.PersistentFlags().StringP(cfg.KeyBundle, "u", "", "Bundle file path") - viper.BindPFlag(cfg.KeyList, cmd.PersistentFlags().Lookup(cfg.KeyList)) - viper.BindPFlag(cfg.KeyFetch, cmd.PersistentFlags().Lookup(cfg.KeyFetch)) + cmd.PersistentFlags().BoolP(cfg.KeyFetch, "f", false, "Fetch from remotes when listing repositories") + cmd.PersistentFlags().StringP(cfg.KeyOutput, "o", cfg.DefOutput, "output format.") + viper.BindPFlag(cfg.KeyReposRoot, cmd.PersistentFlags().Lookup(cfg.KeyReposRoot)) viper.BindPFlag(cfg.KeyPrivateKey, cmd.PersistentFlags().Lookup(cfg.KeyReposRoot)) - viper.BindPFlag(cfg.KeyOutput, cmd.PersistentFlags().Lookup(cfg.KeyOutput)) - viper.BindPFlag(cfg.KeyBranch, cmd.PersistentFlags().Lookup(cfg.KeyBranch)) viper.BindPFlag(cfg.KeyBundle, cmd.PersistentFlags().Lookup(cfg.KeyBundle)) + viper.BindPFlag(cfg.KeyFetch, cmd.PersistentFlags().Lookup(cfg.KeyFetch)) + viper.BindPFlag(cfg.KeyOutput, cmd.PersistentFlags().Lookup(cfg.KeyOutput)) } func Run(cmd *cobra.Command, args []string) { cfg.InitConfig() root := viper.GetString(cfg.KeyReposRoot) - if viper.GetBool(cfg.KeyList) { - // TODO: move it to OpenAll and don't export - paths, err := path.FindRepos() - exitIfError(err) - repos, err := path.OpenAll(paths) - exitIfError(err) - - var printer print.Printer - switch viper.GetString(cfg.KeyOutput) { - case cfg.OutFlat: - printer = &print.FlatPrinter{} - case cfg.OutSimple: - printer = &print.SimpleTreePrinter{} - case cfg.OutSmart: - printer = &print.SmartTreePrinter{} - default: - err = fmt.Errorf("invalid --out flag; allowed values: %v", []string{cfg.OutFlat, cfg.OutSimple, cfg.OutSmart}) - } - exitIfError(err) - - fmt.Println(printer.Print(root, repos)) - - os.Exit(0) - } - - bundle := viper.GetString(cfg.KeyBundle) - if bundle != "" { - opts, err := path.ParseBundleFile(bundle) - exitIfError(err) - - for _, opt := range opts { - path := pathpkg.Join(root, path.URLToPath(opt.URL)) - opt.Path = path - _, _ = git.CloneRepo(opt) - } - os.Exit(0) - } - - url, err := path.ParseURL(args[0]) + // TODO: move it to OpenAll and don't export + paths, err := path.FindRepos() exitIfError(err) - branch := viper.GetString(cfg.KeyBranch) - path := pathpkg.Join(root, path.URLToPath(url)) - - cloneOpts := &git.CloneOpts{ - URL: url, - Path: path, - Branch: branch, - } - - _, err = git.CloneRepo(cloneOpts) + repos, err := path.OpenAll(paths) exitIfError(err) + + var printer print.Printer + switch viper.GetString(cfg.KeyOutput) { + case cfg.OutFlat: + printer = &print.FlatPrinter{} + case cfg.OutSimple: + printer = &print.SimpleTreePrinter{} + case cfg.OutSmart: + printer = &print.SmartTreePrinter{} + default: + err = fmt.Errorf("invalid --out flag; allowed values: %v", []string{cfg.OutFlat, cfg.OutSimple, cfg.OutSmart}) + } + exitIfError(err) + + fmt.Println(printer.Print(root, repos)) } func main() { - err := cmd.Execute() - exitIfError(err) + if err := cmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } } func exitIfError(err error) { diff --git a/pkg/cfg/config.go b/pkg/cfg/config.go index 0573062..499fa6f 100644 --- a/pkg/cfg/config.go +++ b/pkg/cfg/config.go @@ -22,9 +22,8 @@ const ( KeyDefaultHost = "defaultHost" DefDefaultHost = "github.com" KeyFetch = "fetch" - KeyList = "list" KeyOutput = "out" - DefOutput = OutFlat + DefOutput = OutSimple KeyPrivateKey = "privateKey" DefPrivateKey = "id_rsa" KeyReposRoot = "reposRoot"