package main import ( "fmt" "log" "os" "strings" "github.com/bmatcuk/doublestar" "github.com/urfave/cli" ) func main() { app := cli.NewApp() app.Commands = []cli.Command{ { Name: "upload", Aliases: []string{"u"}, Usage: "Upload a directory's manifests", Action: func(c *cli.Context) error { return upload(c) }, }, } err := app.Run(os.Args) if err != nil { log.Fatal(err) } } func upload(c *cli.Context) error { directory := c.Args().First() matchingFiles := make([]string, 0) for _, glob := range manifestGlobs() { globPattern := []string{directory, "**", glob} pathGlob := strings.Join(globPattern, "/") files := getManifestMatches(pathGlob) if len(files) > 0 { matchingFiles = append(matchingFiles, files...) } } fmt.Println(strings.Join(matchingFiles, ", ")) return nil } func getManifestMatches(glob string) []string { files, err := doublestar.Glob(glob) if err != nil { log.Fatal(err) } return files } func manifestGlobs() []string { globs := make([]string, 0) // Hackage globs = append(globs, "*.cabal") // npm globs = append(globs, "package.json") globs = append(globs, "package-lock.json") globs = append(globs, "npm-shrinkwrap.json") globs = append(globs, "yarn.lock") // Maven globs = append(globs, "pom.xml") globs = append(globs, "ivy.xml") globs = append(globs, "build.gradle") // RubyGems globs = append(globs, "Gemfile") globs = append(globs, "Gemfile.lock") globs = append(globs, "gems.rb") globs = append(globs, "gems.locked") globs = append(globs, "*.gemspec") // Packagist globs = append(globs, "composer.json") globs = append(globs, "composer.lock") // PyPi globs = append(globs, "setup.py") globs = append(globs, "req*.txt") globs = append(globs, "req*.pip") globs = append(globs, "requirements/*.txt") globs = append(globs, "requirements/*.pip") globs = append(globs, "Pipfile") globs = append(globs, "Pipfile.lock") // Nuget globs = append(globs, "packages.config") globs = append(globs, "Project.json") globs = append(globs, "Project.lock.json") globs = append(globs, "*.nuspec") globs = append(globs, "paket.lock") globs = append(globs, "*.csproj") // Bower globs = append(globs, "bower.json") // CPAN globs = append(globs, "META.json") globs = append(globs, "META.yml") // CocoaPods globs = append(globs, "Podfile") globs = append(globs, "Podfile.lock") globs = append(globs, "*.podspec") // Clojars globs = append(globs, "project.clj") // Meteor globs = append(globs, "versions.json") // CRAN globs = append(globs, "DESCRIPTION") // Cargo globs = append(globs, "Cargo.toml") globs = append(globs, "Cargo.lock") // Hex globs = append(globs, "mix.exs") globs = append(globs, "mix.lock") // Swift globs = append(globs, "Package.swift") // Pub globs = append(globs, "pubspec.yaml") globs = append(globs, "pubspec.lock") // Carthage globs = append(globs, "Cartfile") globs = append(globs, "Cartfile.private") globs = append(globs, "Cartfile.resolved") // Dub globs = append(globs, "dub.json") globs = append(globs, "dub.sdl") // Julia globs = append(globs, "REQUIRE") // Shards globs = append(globs, "shard.yml") globs = append(globs, "shard.lock") // Go globs = append(globs, "glide.yaml") globs = append(globs, "glide.lock") globs = append(globs, "Godeps") globs = append(globs, "Godeps/Godeps.json") globs = append(globs, "vendor/manifest") globs = append(globs, "vendor/vendor.json") globs = append(globs, "Gopkg.toml") globs = append(globs, "Gopkg.lock") // Elm globs = append(globs, "elm-package.json") globs = append(globs, "elm_dependencies.json") globs = append(globs, "elm-stuff/exact-dependencies.json") // Haxelib globs = append(globs, "haxelib.json") // Hackage globs = append(globs, "*.cabal") globs = append(globs, "cabal.config") return globs }