func Setup() { flag.Parse() AppSettings.BindPFlag("port", flag.Lookup("port")) AppSettings.BindPFlag("address", flag.Lookup("bind")) AppSettings.BindPFlag("config", flag.Lookup("config")) AppSettings.BindPFlag("env", flag.Lookup("env")) S3Settings.BindPFlag("env", flag.Lookup("env")) AppSettings.SetDefault("address", "0.0.0.0") AppSettings.SetDefault("port", "5000") AppSettings.SetDefault("env", "development") AppSettings.SetDefault("config", "./config.yml") S3Settings.SetDefault("env", "development") configPath := filepath.Dir(AppSettings.GetString("config")) configName := strings.Replace(filepath.Base(AppSettings.GetString("config")), filepath.Ext(AppSettings.GetString("config")), "", -1) AppSettings.SetConfigName(configName) AppSettings.AddConfigPath(configPath) err := AppSettings.ReadInConfig() if err != nil { log.Fatal(fmt.Errorf("Fatal error config file: %s \n", err)) } S3Settings.SetConfigName("s3") S3Settings.AddConfigPath("./") err = S3Settings.ReadInConfig() if err != nil { log.Fatal(fmt.Errorf("Fatal error config file: %s \n", err)) } }
func init() { c := viper.New() c.SetEnvPrefix("Q") c.AutomaticEnv() flag.StringVar(&configFile, "config", "", "") flag.Parse() c.BindPFlag("config", flag.Lookup("config")) if c.GetString("config") == "" { // Read from "default" configuration path c.SetConfigName("config") c.AddConfigPath("/etc/qurid") c.AddConfigPath("$HOME/.quarid") c.AddConfigPath(".") } else { c.SetConfigFile(c.GetString("config")) } if err := c.ReadInConfig(); err != nil { panic(fmt.Errorf("Unable to read any configuration file: %s\n", err)) } location, err := time.LoadLocation(c.GetString("timezone")) if err == nil { c.Set("timezone", location) } else { c.Set("timezone", time.UTC) } config = c }
func unsetValues(tt configTest) { var f = pflag.Lookup(tt.Name) f.Value.Set(f.DefValue) f.Changed = false os.Unsetenv(getEnvVarName(tt.Name)) viper.Reset() }
func TestViperAndFlags(t *testing.T) { for _, tt := range configTests { setValues(tt) setupViper() var actual = pflag.Lookup(tt.Name).Value.String() if actual != tt.ExpectedValue { t.Errorf("pflag.Value(%s) => %s, wanted %s [%+v]", tt.Name, actual, tt.ExpectedValue, tt) } unsetValues(tt) } }
// Handle config values for flags used in external packages (e.g. glog) // by setting them directly, using values from viper when not passed in as args func setFlagsUsingViper() { for _, config := range viperWhiteList { var a = pflag.Lookup(config) viper.SetDefault(a.Name, a.DefValue) // If the flag is set, override viper value if a.Changed { viper.Set(a.Name, a.Value.String()) } // Viper will give precedence first to calls to the Set command, // then to values from the config.yml a.Value.Set(viper.GetString(a.Name)) } }
// setDefaultFromEnv constructs a name from the flag passed in and // sets the default from the environment if possible. func setDefaultFromEnv(name string) { key := optionToEnv(name) newValue, found := os.LookupEnv(key) if found { flag := pflag.Lookup(name) if flag == nil { log.Fatalf("Couldn't find flag %q", name) } err := flag.Value.Set(newValue) if err != nil { log.Fatalf("Invalid value for environment variable %q: %v", key, err) } // log.Printf("Set default for %q from %q to %q (%v)", name, key, newValue, flag.Value) flag.DefValue = newValue } }
func TestViperAndFlags(t *testing.T) { restore := hideEnv(t) defer restore(t) for _, tt := range configTests { setValues(t, tt) setupViper() f := pflag.Lookup(tt.Name) if f == nil { t.Fatalf("Could not find flag for %s", tt.Name) } actual := f.Value.String() if actual != tt.ExpectedValue { t.Errorf("pflag.Value(%s) => %s, wanted %s [%+v]", tt.Name, actual, tt.ExpectedValue, tt) } unsetValues(tt) } }
func main() { options := &gbuild.Options{CreateMapFile: true} var pkgObj string pflag.BoolVarP(&options.Verbose, "verbose", "v", false, "print the names of packages as they are compiled") flagVerbose := pflag.Lookup("verbose") pflag.BoolVarP(&options.Quiet, "quiet", "q", false, "suppress non-fatal warnings") flagQuiet := pflag.Lookup("quiet") pflag.BoolVarP(&options.Watch, "watch", "w", false, "watch for changes to the source files") flagWatch := pflag.Lookup("watch") pflag.BoolVarP(&options.Minify, "minify", "m", false, "minify generated code") flagMinify := pflag.Lookup("minify") pflag.BoolVar(&options.Color, "color", terminal.IsTerminal(int(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb", "colored output") flagColor := pflag.Lookup("color") tags := pflag.String("tags", "", "a list of build tags to consider satisfied during the build") flagTags := pflag.Lookup("tags") cmdBuild := &cobra.Command{ Use: "build [packages]", Short: "compile packages and dependencies", } cmdBuild.Flags().StringVarP(&pkgObj, "output", "o", "", "output file") cmdBuild.Flags().AddFlag(flagVerbose) cmdBuild.Flags().AddFlag(flagQuiet) cmdBuild.Flags().AddFlag(flagWatch) cmdBuild.Flags().AddFlag(flagMinify) cmdBuild.Flags().AddFlag(flagColor) cmdBuild.Flags().AddFlag(flagTags) cmdBuild.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) for { s := gbuild.NewSession(options) exitCode := handleError(func() error { if len(args) == 0 { return s.BuildDir(currentDirectory, currentDirectory, pkgObj) } if strings.HasSuffix(args[0], ".go") || strings.HasSuffix(args[0], ".inc.js") { for _, arg := range args { if !strings.HasSuffix(arg, ".go") && !strings.HasSuffix(arg, ".inc.js") { return fmt.Errorf("named files must be .go or .inc.js files") } } if pkgObj == "" { basename := filepath.Base(args[0]) pkgObj = basename[:len(basename)-3] + ".js" } names := make([]string, len(args)) for i, name := range args { name = filepath.ToSlash(name) names[i] = name } if err := s.BuildFiles(args, pkgObj, currentDirectory); err != nil { return err } return nil } for _, pkgPath := range args { pkgPath = filepath.ToSlash(pkgPath) pkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags) if err != nil { return err } archive, err := s.BuildPackage(pkg) if err != nil { return err } if pkgObj == "" { pkgObj = filepath.Base(args[0]) + ".js" } if pkg.IsCommand() && !pkg.UpToDate { if err := s.WriteCommandPackage(archive, pkgObj); err != nil { return err } } } return nil }, options, nil) os.Exit(exitCode) } } cmdInstall := &cobra.Command{ Use: "install [packages]", Short: "compile and install packages and dependencies", } cmdInstall.Flags().AddFlag(flagVerbose) cmdInstall.Flags().AddFlag(flagQuiet) cmdInstall.Flags().AddFlag(flagWatch) cmdInstall.Flags().AddFlag(flagMinify) cmdInstall.Flags().AddFlag(flagColor) cmdInstall.Flags().AddFlag(flagTags) cmdInstall.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) for { s := gbuild.NewSession(options) exitCode := handleError(func() error { pkgs := args if len(pkgs) == 0 { firstGopathWorkspace := filepath.SplitList(build.Default.GOPATH)[0] // TODO: The GOPATH workspace that contains the package source should be chosen. srcDir, err := filepath.EvalSymlinks(filepath.Join(firstGopathWorkspace, "src")) if err != nil { return err } if !strings.HasPrefix(currentDirectory, srcDir) { return fmt.Errorf("gopherjs install: no install location for directory %s outside GOPATH", currentDirectory) } pkgPath, err := filepath.Rel(srcDir, currentDirectory) if err != nil { return err } pkgs = []string{pkgPath} } if cmd.Name() == "get" { goGet := exec.Command("go", append([]string{"get", "-d", "-tags=js"}, pkgs...)...) goGet.Stdout = os.Stdout goGet.Stderr = os.Stderr if err := goGet.Run(); err != nil { return err } } for _, pkgPath := range pkgs { pkgPath = filepath.ToSlash(pkgPath) pkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags) if err != nil { return err } archive, err := s.BuildPackage(pkg) if err != nil { return err } if pkg.IsCommand() && !pkg.UpToDate { if err := s.WriteCommandPackage(archive, pkg.PkgObj); err != nil { return err } } } return nil }, options, nil) os.Exit(exitCode) } } cmdGet := &cobra.Command{ Use: "get [packages]", Short: "download and install packages and dependencies", } cmdGet.Flags().AddFlag(flagVerbose) cmdGet.Flags().AddFlag(flagQuiet) cmdGet.Flags().AddFlag(flagWatch) cmdGet.Flags().AddFlag(flagMinify) cmdGet.Flags().AddFlag(flagColor) cmdGet.Flags().AddFlag(flagTags) cmdGet.Run = cmdInstall.Run cmdRun := &cobra.Command{ Use: "run [gofiles...] [arguments...]", Short: "compile and run Go program", } cmdRun.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { lastSourceArg := 0 for { if lastSourceArg == len(args) || !(strings.HasSuffix(args[lastSourceArg], ".go") || strings.HasSuffix(args[lastSourceArg], ".inc.js")) { break } lastSourceArg++ } if lastSourceArg == 0 { return fmt.Errorf("gopherjs run: no go files listed") } tempfile, err := ioutil.TempFile(currentDirectory, filepath.Base(args[0])+".") if err != nil && strings.HasPrefix(currentDirectory, runtime.GOROOT()) { tempfile, err = ioutil.TempFile("", filepath.Base(args[0])+".") } if err != nil { return err } defer func() { tempfile.Close() os.Remove(tempfile.Name()) os.Remove(tempfile.Name() + ".map") }() s := gbuild.NewSession(options) if err := s.BuildFiles(args[:lastSourceArg], tempfile.Name(), currentDirectory); err != nil { return err } if err := runNode(tempfile.Name(), args[lastSourceArg:], "", options.Quiet); err != nil { return err } return nil }, options, nil)) } cmdTest := &cobra.Command{ Use: "test [packages]", Short: "test packages", } bench := cmdTest.Flags().String("bench", "", "Run benchmarks matching the regular expression. By default, no benchmarks run. To run all benchmarks, use '--bench=.'.") run := cmdTest.Flags().String("run", "", "Run only those tests and examples matching the regular expression.") short := cmdTest.Flags().Bool("short", false, "Tell long-running tests to shorten their run time.") verbose := cmdTest.Flags().BoolP("verbose", "v", false, "Log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.") compileOnly := cmdTest.Flags().BoolP("compileonly", "c", false, "Compile the test binary to pkg.test.js but do not run it (where pkg is the last element of the package's import path). The file name can be changed with the -o flag.") outputFilename := cmdTest.Flags().StringP("output", "o", "", "Compile the test binary to the named file. The test still runs (unless -c is specified).") cmdTest.Flags().AddFlag(flagMinify) cmdTest.Flags().AddFlag(flagColor) cmdTest.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { pkgs := make([]*gbuild.PackageData, len(args)) for i, pkgPath := range args { pkgPath = filepath.ToSlash(pkgPath) var err error pkgs[i], err = gbuild.Import(pkgPath, 0, "", nil) if err != nil { return err } } if len(pkgs) == 0 { firstGopathWorkspace := filepath.SplitList(build.Default.GOPATH)[0] srcDir, err := filepath.EvalSymlinks(filepath.Join(firstGopathWorkspace, "src")) if err != nil { return err } var pkg *gbuild.PackageData if strings.HasPrefix(currentDirectory, srcDir) { pkgPath, err := filepath.Rel(srcDir, currentDirectory) if err != nil { return err } if pkg, err = gbuild.Import(pkgPath, 0, "", nil); err != nil { return err } } if pkg == nil { if pkg, err = gbuild.ImportDir(currentDirectory, 0); err != nil { return err } pkg.ImportPath = "_" + currentDirectory } pkgs = []*gbuild.PackageData{pkg} } var exitErr error for _, pkg := range pkgs { if len(pkg.TestGoFiles) == 0 && len(pkg.XTestGoFiles) == 0 { fmt.Printf("? \t%s\t[no test files]\n", pkg.ImportPath) continue } s := gbuild.NewSession(options) tests := &testFuncs{Package: pkg.Package} collectTests := func(testPkg *gbuild.PackageData, testPkgName string, needVar *bool) error { archive, err := s.BuildPackage(testPkg) if err != nil { return err } for _, decl := range archive.Declarations { if strings.HasPrefix(decl.FullName, testPkg.ImportPath+".Test") { tests.Tests = append(tests.Tests, testFunc{Package: testPkgName, Name: decl.FullName[len(testPkg.ImportPath)+1:]}) *needVar = true } if strings.HasPrefix(decl.FullName, testPkg.ImportPath+".Benchmark") { tests.Benchmarks = append(tests.Benchmarks, testFunc{Package: testPkgName, Name: decl.FullName[len(testPkg.ImportPath)+1:]}) *needVar = true } } return nil } if err := collectTests(&gbuild.PackageData{ Package: &build.Package{ ImportPath: pkg.ImportPath, Dir: pkg.Dir, GoFiles: append(pkg.GoFiles, pkg.TestGoFiles...), Imports: append(pkg.Imports, pkg.TestImports...), }, IsTest: true, JSFiles: pkg.JSFiles, }, "_test", &tests.NeedTest); err != nil { return err } if err := collectTests(&gbuild.PackageData{ Package: &build.Package{ ImportPath: pkg.ImportPath + "_test", Dir: pkg.Dir, GoFiles: pkg.XTestGoFiles, Imports: pkg.XTestImports, }, IsTest: true, }, "_xtest", &tests.NeedXtest); err != nil { return err } buf := bytes.NewBuffer(nil) if err := testmainTmpl.Execute(buf, tests); err != nil { return err } fset := token.NewFileSet() mainFile, err := parser.ParseFile(fset, "_testmain.go", buf, 0) if err != nil { return err } importContext := &compiler.ImportContext{ Packages: s.Types, Import: func(path string) (*compiler.Archive, error) { if path == pkg.ImportPath || path == pkg.ImportPath+"_test" { return s.Archives[path], nil } return s.BuildImportPath(path) }, } mainPkgArchive, err := compiler.Compile("main", []*ast.File{mainFile}, fset, importContext, options.Minify) if err != nil { return err } if *compileOnly && *outputFilename == "" { *outputFilename = pkg.Package.Name + "_test.js" } var outfile *os.File if *outputFilename != "" { outfile, err = os.Create(*outputFilename) if err != nil { return err } } else { outfile, err = ioutil.TempFile(currentDirectory, "test.") if err != nil { return err } } defer func() { outfile.Close() if *outputFilename == "" { os.Remove(outfile.Name()) os.Remove(outfile.Name() + ".map") } }() if err := s.WriteCommandPackage(mainPkgArchive, outfile.Name()); err != nil { return err } if *compileOnly { continue } var args []string if *bench != "" { args = append(args, "-test.bench", *bench) } if *run != "" { args = append(args, "-test.run", *run) } if *short { args = append(args, "-test.short") } if *verbose { args = append(args, "-test.v") } status := "ok " start := time.Now() if err := runNode(outfile.Name(), args, pkg.Dir, options.Quiet); err != nil { if _, ok := err.(*exec.ExitError); !ok { return err } exitErr = err status = "FAIL" } fmt.Printf("%s\t%s\t%.3fs\n", status, pkg.ImportPath, time.Now().Sub(start).Seconds()) } return exitErr }, options, nil)) } cmdTool := &cobra.Command{ Use: "tool [command] [args...]", Short: "run specified go tool", } cmdTool.Flags().BoolP("e", "e", false, "") cmdTool.Flags().BoolP("l", "l", false, "") cmdTool.Flags().StringP("o", "o", "", "") cmdTool.Flags().StringP("D", "D", "", "") cmdTool.Flags().StringP("I", "I", "", "") cmdTool.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { if len(args) == 2 { switch args[0][1] { case 'g': basename := filepath.Base(args[1]) s := gbuild.NewSession(options) if err := s.BuildFiles([]string{args[1]}, basename[:len(basename)-3]+".js", currentDirectory); err != nil { return err } return nil } } cmdTool.Help() return nil }, options, nil)) } cmdServe := &cobra.Command{ Use: "serve [root]", Short: "compile on-the-fly and serve", } cmdServe.Flags().AddFlag(flagVerbose) cmdServe.Flags().AddFlag(flagQuiet) cmdServe.Flags().AddFlag(flagMinify) cmdServe.Flags().AddFlag(flagColor) cmdServe.Flags().AddFlag(flagTags) var addr string cmdServe.Flags().StringVarP(&addr, "http", "", ":8080", "HTTP bind address to serve") cmdServe.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) dirs := append(filepath.SplitList(build.Default.GOPATH), build.Default.GOROOT) var root string if len(args) > 1 { cmdServe.Help() return } if len(args) == 1 { root = args[0] } sourceFiles := http.FileServer(serveCommandFileSystem{ serveRoot: root, options: options, dirs: dirs, sourceMaps: make(map[string][]byte), }) ln, err := net.Listen("tcp", addr) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } if tcpAddr := ln.Addr().(*net.TCPAddr); tcpAddr.IP.Equal(net.IPv4zero) || tcpAddr.IP.Equal(net.IPv6zero) { // Any available addresses. fmt.Printf("serving at http://localhost:%d and on port %d of any available addresses\n", tcpAddr.Port, tcpAddr.Port) } else { // Specific address. fmt.Printf("serving at http://%s\n", tcpAddr) } fmt.Fprintln(os.Stderr, http.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}, sourceFiles)) } rootCmd := &cobra.Command{ Use: "gopherjs", Long: "GopherJS is a tool for compiling Go source code to JavaScript.", } rootCmd.AddCommand(cmdBuild, cmdGet, cmdInstall, cmdRun, cmdTest, cmdTool, cmdServe) rootCmd.Execute() }
func VersionVar(p *versionValue, name string, value versionValue, usage string) { *p = value flag.Var(p, name, usage) // "--version" will be treated as "--version=true" flag.Lookup(name).NoOptDefVal = "true" }
func init() { pflag.Lookup(durationRandom).Hidden = true }
func main() { options := &gbuild.Options{CreateMapFile: true} var pkgObj string pflag.BoolVarP(&options.Verbose, "verbose", "v", false, "print the names of packages as they are compiled") flagVerbose := pflag.Lookup("verbose") pflag.BoolVarP(&options.Watch, "watch", "w", false, "watch for changes to the source files") flagWatch := pflag.Lookup("watch") pflag.BoolVarP(&options.Minify, "minify", "m", false, "minify generated code") flagMinify := pflag.Lookup("minify") pflag.BoolVar(&options.Color, "color", terminal.IsTerminal(int(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb", "colored output") flagColor := pflag.Lookup("color") tags := pflag.String("tags", "", "a list of build tags to consider satisfied during the build") flagTags := pflag.Lookup("tags") cmdBuild := &cobra.Command{ Use: "build [packages]", Short: "compile packages and dependencies", } cmdBuild.Flags().StringVarP(&pkgObj, "output", "o", "", "output file") cmdBuild.Flags().AddFlag(flagVerbose) cmdBuild.Flags().AddFlag(flagWatch) cmdBuild.Flags().AddFlag(flagMinify) cmdBuild.Flags().AddFlag(flagColor) cmdBuild.Flags().AddFlag(flagTags) cmdBuild.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) for { s := gbuild.NewSession(options) exitCode := handleError(func() error { if len(args) == 0 { return s.BuildDir(currentDirectory, currentDirectory, pkgObj) } if strings.HasSuffix(args[0], ".go") || strings.HasSuffix(args[0], ".inc.js") { for _, arg := range args { if !strings.HasSuffix(arg, ".go") && !strings.HasSuffix(arg, ".inc.js") { return fmt.Errorf("named files must be .go or .inc.js files") } } if pkgObj == "" { basename := filepath.Base(args[0]) pkgObj = basename[:len(basename)-3] + ".js" } names := make([]string, len(args)) for i, name := range args { name = filepath.ToSlash(name) names[i] = name if s.Watcher != nil { s.Watcher.Add(name) } } if err := s.BuildFiles(args, pkgObj, currentDirectory); err != nil { return err } return nil } for _, pkgPath := range args { pkgPath = filepath.ToSlash(pkgPath) if s.Watcher != nil { s.Watcher.Add(pkgPath) } buildPkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags) if err != nil { return err } pkg := &gbuild.PackageData{Package: buildPkg} if err := s.BuildPackage(pkg); err != nil { return err } if pkgObj == "" { pkgObj = filepath.Base(args[0]) + ".js" } if err := s.WriteCommandPackage(pkg, pkgObj); err != nil { return err } } return nil }, options, nil) if s.Watcher == nil { os.Exit(exitCode) } s.WaitForChange() } } cmdInstall := &cobra.Command{ Use: "install [packages]", Short: "compile and install packages and dependencies", } cmdInstall.Flags().AddFlag(flagVerbose) cmdInstall.Flags().AddFlag(flagWatch) cmdInstall.Flags().AddFlag(flagMinify) cmdInstall.Flags().AddFlag(flagColor) cmdInstall.Flags().AddFlag(flagTags) cmdInstall.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) for { s := gbuild.NewSession(options) exitCode := handleError(func() error { pkgs := args if len(pkgs) == 0 { firstGopathWorkspace := filepath.SplitList(build.Default.GOPATH)[0] // TODO: The GOPATH workspace that contains the package source should be chosen. srcDir, err := filepath.EvalSymlinks(filepath.Join(firstGopathWorkspace, "src")) if err != nil { return err } if !strings.HasPrefix(currentDirectory, srcDir) { return fmt.Errorf("gopherjs install: no install location for directory %s outside GOPATH", currentDirectory) } pkgPath, err := filepath.Rel(srcDir, currentDirectory) if err != nil { return err } pkgs = []string{pkgPath} } if cmd.Name() == "get" { goGet := exec.Command("go", append([]string{"get", "-d"}, pkgs...)...) goGet.Stdout = os.Stdout goGet.Stderr = os.Stderr if err := goGet.Run(); err != nil { return err } } for _, pkgPath := range pkgs { pkgPath = filepath.ToSlash(pkgPath) if _, err := s.ImportPackage(pkgPath); err != nil { return err } pkg := s.Packages[pkgPath] if err := s.WriteCommandPackage(pkg, pkg.PkgObj); err != nil { return err } } return nil }, options, nil) if s.Watcher == nil { os.Exit(exitCode) } s.WaitForChange() } } cmdGet := &cobra.Command{ Use: "get [packages]", Short: "download and install packages and dependencies", } cmdGet.Flags().AddFlag(flagVerbose) cmdGet.Flags().AddFlag(flagWatch) cmdGet.Flags().AddFlag(flagMinify) cmdGet.Flags().AddFlag(flagColor) cmdGet.Flags().AddFlag(flagTags) cmdGet.Run = cmdInstall.Run cmdRun := &cobra.Command{ Use: "run [gofiles...] [arguments...]", Short: "compile and run Go program", } cmdRun.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { lastSourceArg := 0 for { if lastSourceArg == len(args) || !(strings.HasSuffix(args[lastSourceArg], ".go") || strings.HasSuffix(args[lastSourceArg], ".inc.js")) { break } lastSourceArg++ } if lastSourceArg == 0 { return fmt.Errorf("gopherjs run: no go files listed") } tempfile, err := ioutil.TempFile("", filepath.Base(args[0])+".") if err != nil { return err } defer func() { tempfile.Close() os.Remove(tempfile.Name()) os.Remove(tempfile.Name() + ".map") }() s := gbuild.NewSession(options) if err := s.BuildFiles(args[:lastSourceArg], tempfile.Name(), currentDirectory); err != nil { return err } if err := runNode(tempfile.Name(), args[lastSourceArg:], ""); err != nil { return err } return nil }, options, nil)) } cmdTest := &cobra.Command{ Use: "test [packages]", Short: "test packages", } bench := cmdTest.Flags().String("bench", "", "Run benchmarks matching the regular expression. By default, no benchmarks run. To run all benchmarks, use '--bench=.'.") run := cmdTest.Flags().String("run", "", "Run only those tests and examples matching the regular expression.") short := cmdTest.Flags().Bool("short", false, "Tell long-running tests to shorten their run time.") verbose := cmdTest.Flags().BoolP("verbose", "v", false, "Log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.") cmdTest.Flags().AddFlag(flagMinify) cmdTest.Flags().AddFlag(flagColor) cmdTest.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { pkgs := make([]*build.Package, len(args)) for i, pkgPath := range args { pkgPath = filepath.ToSlash(pkgPath) var err error pkgs[i], err = gbuild.Import(pkgPath, 0, "", nil) if err != nil { return err } } if len(pkgs) == 0 { firstGopathWorkspace := filepath.SplitList(build.Default.GOPATH)[0] srcDir, err := filepath.EvalSymlinks(filepath.Join(firstGopathWorkspace, "src")) if err != nil { return err } var pkg *build.Package if strings.HasPrefix(currentDirectory, srcDir) { pkgPath, err := filepath.Rel(srcDir, currentDirectory) if err != nil { return err } if pkg, err = gbuild.Import(pkgPath, 0, "", nil); err != nil { return err } } if pkg == nil { if pkg, err = build.ImportDir(currentDirectory, 0); err != nil { return err } pkg.ImportPath = "_" + currentDirectory } pkgs = []*build.Package{pkg} } var exitErr error for _, pkg := range pkgs { if len(pkg.TestGoFiles) == 0 && len(pkg.XTestGoFiles) == 0 { fmt.Printf("? \t%s\t[no test files]\n", pkg.ImportPath) continue } s := gbuild.NewSession(options) tests := &testFuncs{Package: pkg} collectTests := func(buildPkg *build.Package, testPkgName string, needVar *bool) error { testPkg := &gbuild.PackageData{Package: buildPkg} if err := s.BuildPackage(testPkg); err != nil { return err } for _, decl := range testPkg.Archive.Declarations { if strings.HasPrefix(decl.FullName, testPkg.ImportPath+".Test") { tests.Tests = append(tests.Tests, testFunc{Package: testPkgName, Name: decl.FullName[len(testPkg.ImportPath)+1:]}) *needVar = true } if strings.HasPrefix(decl.FullName, testPkg.ImportPath+".Benchmark") { tests.Benchmarks = append(tests.Benchmarks, testFunc{Package: testPkgName, Name: decl.FullName[len(testPkg.ImportPath)+1:]}) *needVar = true } } return nil } if err := collectTests(&build.Package{ ImportPath: pkg.ImportPath, Dir: pkg.Dir, GoFiles: append(pkg.GoFiles, pkg.TestGoFiles...), Imports: append(pkg.Imports, pkg.TestImports...), }, "_test", &tests.NeedTest); err != nil { return err } if err := collectTests(&build.Package{ ImportPath: pkg.ImportPath + "_test", Dir: pkg.Dir, GoFiles: pkg.XTestGoFiles, Imports: pkg.XTestImports, }, "_xtest", &tests.NeedXtest); err != nil { return err } buf := bytes.NewBuffer(nil) if err := testmainTmpl.Execute(buf, tests); err != nil { return err } fset := token.NewFileSet() mainFile, err := parser.ParseFile(fset, "_testmain.go", buf, 0) if err != nil { return err } mainPkg := &gbuild.PackageData{ Package: &build.Package{ Name: "main", ImportPath: "main", }, } mainPkg.Archive, err = compiler.Compile("main", []*ast.File{mainFile}, fset, s.ImportContext, options.Minify) if err != nil { return err } tempfile, err := ioutil.TempFile("", "test.") if err != nil { return err } defer func() { tempfile.Close() os.Remove(tempfile.Name()) os.Remove(tempfile.Name() + ".map") }() if err := s.WriteCommandPackage(mainPkg, tempfile.Name()); err != nil { return err } var args []string if *bench != "" { args = append(args, "-test.bench", *bench) } if *run != "" { args = append(args, "-test.run", *run) } if *short { args = append(args, "-test.short") } if *verbose { args = append(args, "-test.v") } status := "ok " start := time.Now() if err := runNode(tempfile.Name(), args, pkg.Dir); err != nil { if _, ok := err.(*exec.ExitError); !ok { return err } exitErr = err status = "FAIL" } fmt.Printf("%s\t%s\t%.3fs\n", status, pkg.ImportPath, time.Now().Sub(start).Seconds()) } return exitErr }, options, nil)) } cmdTool := &cobra.Command{ Use: "tool [command] [args...]", Short: "run specified go tool", } cmdTool.Flags().BoolP("e", "e", false, "") cmdTool.Flags().BoolP("l", "l", false, "") cmdTool.Flags().BoolP("m", "m", false, "") cmdTool.Flags().StringP("o", "o", "", "") cmdTool.Flags().StringP("D", "D", "", "") cmdTool.Flags().StringP("I", "I", "", "") cmdTool.Run = func(cmd *cobra.Command, args []string) { os.Exit(handleError(func() error { if len(args) == 2 { switch args[0][1] { case 'g': basename := filepath.Base(args[1]) s := gbuild.NewSession(options) if err := s.BuildFiles([]string{args[1]}, basename[:len(basename)-3]+".js", currentDirectory); err != nil { return err } return nil } } cmdTool.Help() return nil }, options, nil)) } cmdServe := &cobra.Command{ Use: "serve", Short: "compile on-the-fly and serve", } cmdServe.Flags().AddFlag(flagVerbose) cmdServe.Flags().AddFlag(flagMinify) cmdServe.Flags().AddFlag(flagColor) cmdServe.Flags().AddFlag(flagTags) var port int cmdServe.Flags().IntVarP(&port, "port", "p", 8080, "HTTP port") cmdServe.Run = func(cmd *cobra.Command, args []string) { options.BuildTags = strings.Fields(*tags) dirs := append(filepath.SplitList(build.Default.GOPATH), build.Default.GOROOT) sourceFiles := http.FileServer(serveCommandFileSystem{options: options, dirs: dirs, sourceMaps: make(map[string][]byte)}) fmt.Printf("serving at http://localhost:%d\n", port) fmt.Println(http.ListenAndServe(fmt.Sprintf(":%d", port), sourceFiles)) } rootCmd := &cobra.Command{ Use: "gopherjs", Long: "GopherJS is a tool for compiling Go source code to JavaScript.", } rootCmd.AddCommand(cmdBuild, cmdGet, cmdInstall, cmdRun, cmdTest, cmdTool, cmdServe) rootCmd.Execute() }
// Lookup returns a flag value, or nil if it does not exist func Lookup(name string) *pflag.Flag { return pflag.Lookup(name) }
// ShowStats returns true if the user added a `--stats` flag to the command line. // // This is called by Run to override the default value of the // showStats passed in. func ShowStats() bool { statsIntervalFlag := pflag.Lookup("stats") return statsIntervalFlag != nil && statsIntervalFlag.Changed }
func main() { conf = viper.New() conf.SetEnvPrefix("FIFO2KINESIS") conf.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) conf.AutomaticEnv() viper.SetConfigName("fifo2kinesis") pflag.IntP("buffer-queue-limit", "l", 500, "The maximum number of items in the buffer before it is flushed") conf.BindPFlag("buffer-queue-limit", pflag.Lookup("buffer-queue-limit")) conf.SetDefault("buffer-queue-limit", 500) pflag.BoolP("debug", "d", false, "Show debug level log messages") conf.BindPFlag("debug", pflag.Lookup("debug")) conf.SetDefault("debug", "") pflag.StringP("failed-attempts-dir", "D", "", "The path to the directory containing failed attempts") conf.BindPFlag("failed-attempts-dir", pflag.Lookup("failed-attempts-dir")) conf.SetDefault("failed-attempts-dir", "") pflag.StringP("fifo-name", "f", "", "The absolute path of the named pipe, e.g. /var/test.pipe") conf.BindPFlag("fifo-name", pflag.Lookup("fifo-name")) conf.SetDefault("fifo-name", "") pflag.StringP("flush-handler", "h", "kinesis", "Defaults to \"kinesis\", use \"logger\" for debugging") conf.BindPFlag("flush-handler", pflag.Lookup("flush-handler")) conf.SetDefault("flush-handler", "kinesis") pflag.IntP("flush-interval", "i", 5, "The number of seconds before the buffer is flushed and written to Kinesis") conf.BindPFlag("flush-interval", pflag.Lookup("flush-interval")) conf.SetDefault("flush-interval", 5) pflag.StringP("partition-key", "p", "", "The partition key, defaults to a 12 character random string if omitted") conf.BindPFlag("partition-key", pflag.Lookup("partition-key")) conf.SetDefault("partition-key", "") pflag.StringP("region", "R", "", "The AWS region that the Kinesis stream is provisioned in") conf.BindPFlag("region", pflag.Lookup("region")) conf.SetDefault("region", "") pflag.StringP("role-arn", "r", "", "The ARN of the AWS role being assumed.") conf.BindPFlag("role-arn", pflag.Lookup("role-arn")) conf.SetDefault("role-arn", "") pflag.StringP("role-session-name", "S", "", "The session name used when assuming a role.") conf.BindPFlag("role-session-name", pflag.Lookup("role-session-name")) conf.SetDefault("role-session-name", "") pflag.StringP("stream-name", "s", "", "The name of the Kinesis stream") conf.BindPFlag("stream-name", pflag.Lookup("stream-name")) conf.SetDefault("stream-name", "") pflag.Parse() if conf.GetBool("debug") { logger = NewLogger(LOG_DEBUG) } else { logger = NewLogger(LOG_INFO) } logger.Debug("configuration parsed") h := conf.GetString("flush-handler") if h != "kinesis" && h != "logger" { logger.Fatalf("flush handler not valid: %s", h) } fn := conf.GetString("fifo-name") if fn == "" { logger.Fatal("missing required option: fifo-name") } sn := conf.GetString("stream-name") if h == "kinesis" && sn == "" { logger.Fatal("missing required option: stream-name") } ql := conf.GetInt("buffer-queue-limit") if ql < 1 { logger.Fatal("buffer queue limit must be greater than 0") } else if h == "kinesis" && ql > 500 { logger.Fatal("buffer queue cannot exceed 500 items when using the kinesis handler") } fifo := &Fifo{fn} bw := &MemoryBufferWriter{ Fifo: fifo, FlushInterval: conf.GetInt("flush-interval"), QueueLimit: ql, } var bf BufferFlusher if h == "kinesis" { pk := conf.GetString("partition-key") bf = NewKinesisBufferFlusher(sn, pk) } else { bf = &LoggerBufferFlusher{} } var fh FailedAttemptHandler dir := conf.GetString("failed-attempts-dir") if dir == "" { fh = &NullFailedAttemptHandler{} } else { stat, err := os.Stat(dir) if os.IsNotExist(err) { logger.Fatal("failed attempts directory does not exist") } else if !stat.IsDir() { logger.Fatal("failed attempts directory is not a directory") } else if unix.Access(dir, unix.R_OK) != nil { logger.Fatal("failed attempts directory is not readable") } else { fh = &FileFailedAttemptHandler{dir, fifo} } } shutdown := EventListener() RunPipeline(fifo, &Buffer{bw, bf, fh}, shutdown) }