Support multiple packages and directories Signed-off-by: Joe Tsai <joetsai@google.com>
diff --git a/README.md b/README.md index 2906b68..6ab8c11 100644 --- a/README.md +++ b/README.md
@@ -10,7 +10,7 @@ ## Usage -Invoke `golint` with one or more filenames, a directory, or a package named +Invoke `golint` with one or more filenames, a directories, or packages named by its import path. Golint uses the same [import path syntax](https://golang.org/cmd/go/#hdr-Import_path_syntax) as the `go` command and therefore
diff --git a/golint/golint.go b/golint/golint.go index 83b0e26..d8360ad 100644 --- a/golint/golint.go +++ b/golint/golint.go
@@ -28,9 +28,9 @@ func usage() { fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) fmt.Fprintf(os.Stderr, "\tgolint [flags] # runs on package in current directory\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] package\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] directory\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] files... # must be a single package\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [packages]\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [directories] # where a '/...' suffix includes all sub-directories\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [files] # all must belong to a single package\n") fmt.Fprintf(os.Stderr, "Flags:\n") flag.PrintDefaults() } @@ -39,26 +39,48 @@ flag.Usage = usage flag.Parse() - switch flag.NArg() { - case 0: + if flag.NArg() == 0 { lintDir(".") - case 1: - arg := flag.Arg(0) - if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-4]) { - for _, dirname := range allPackagesInFS(arg) { - lintDir(dirname) - } - } else if isDir(arg) { - lintDir(arg) - } else if exists(arg) { - lintFiles(arg) - } else { - for _, pkgname := range importPaths([]string{arg}) { - lintPackage(pkgname) + } else { + // dirsRun, filesRun, and pkgsRun indicate whether golint is applied to + // directory, file or package targets. The distinction affects which + // checks are run. It is no valid to mix target types. + var dirsRun, filesRun, pkgsRun int + var args []string + for _, arg := range flag.Args() { + if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) { + dirsRun = 1 + for _, dirname := range allPackagesInFS(arg) { + args = append(args, dirname) + } + } else if isDir(arg) { + dirsRun = 1 + args = append(args, arg) + } else if exists(arg) { + filesRun = 1 + args = append(args, arg) + } else { + pkgsRun = 1 + args = append(args, arg) } } - default: - lintFiles(flag.Args()...) + + if dirsRun+filesRun+pkgsRun != 1 { + usage() + os.Exit(2) + } + switch { + case dirsRun == 1: + for _, dir := range args { + lintDir(dir) + } + case filesRun == 1: + lintFiles(args...) + case pkgsRun == 1: + for _, pkg := range importPaths(args) { + lintPackage(pkg) + } + } } if *setExitStatus && suggestions > 0 {