From 23ab1c59dc5ea1f7db391ea729ed490c74442707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Gul=C3=A1csi?= Date: Wed, 19 Feb 2020 09:12:50 +0100 Subject: [PATCH] client: --remotes flag for reading the list of remotes from a file --- main.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 5ed5e7da..591a3ac4 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,8 @@ package main import ( + "bufio" + "bytes" "flag" "fmt" "io/ioutil" @@ -324,6 +326,8 @@ var clientHelp = ` --hostname, Optionally set the 'Host' header (defaults to the host found in the server url). + + --remotes, a file to read remotes from (one per line). ` + commonHelp func client(args []string, envPrefix string) { @@ -339,6 +343,7 @@ func client(args []string, envPrefix string) { hostname := flags.String("hostname", "", "") pid := flags.Bool("pid", false, "") verbose := flags.Bool("v", false, "") + flagRemotes := flags.String("remotes", "", "") flags.Usage = func() { fmt.Print(clientHelp) os.Exit(1) @@ -347,11 +352,20 @@ func client(args []string, envPrefix string) { flags.Parse(args) //pull out options, put back remaining args args = flags.Args() - if len(args) < 2 { - log.Fatalf("A server and least one remote is required") + switch len(args) { + case 0: + log.Fatalf("A server is required") + case 1: + if *flagRemotes == "" { + log.Fatalf("A server and least one remote is required") + } } config.Server = args[0] - config.Remotes = args[1:] + //read remotes + var err error + if config.Remotes, err = readRemotes(args[1:], *flagRemotes); err != nil { + log.Fatal(err) + } //default auth if config.Auth == "" { config.Auth = os.Getenv("AUTH") @@ -394,3 +408,36 @@ func flagsFromEnv(fs *flag.FlagSet, prefix string) { f.Value.Set(os.Getenv(prefix + strings.ToUpper(envRepl.Replace(k)))) } } + +func readRemotes(remotes []string, fl string) ([]string, error) { + var remotesFn string + if fl != "" { + remotesFn = fl + } else if len(remotes) == 1 && (remotes[0] == "-" || remotes[0] == "") { + remotes = remotes[:0] + remotesFn = "-" + } + if remotesFn == "" { + return remotes, nil + } + fh := os.Stdin + if remotesFn != "-" { + var err error + if fh, err = os.Open(remotesFn); err != nil { + return remotes, nil + } + } + scanner := bufio.NewScanner(fh) + for scanner.Scan() { + line := scanner.Bytes() + if i := bytes.IndexByte(line, '#'); i >= 0 { + line = line[:i] + } + line = bytes.TrimSpace(line) + if len(line) != 0 { + remotes = append(remotes, string(line)) + } + } + fh.Close() + return remotes, nil +}