diff --git a/go.mod b/go.mod index 80ada46..5084c58 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,8 @@ go 1.13 require ( github.com/augmentable-dev/lege v0.0.0-20191028004410-79cb985065a1 github.com/briandowns/spinner v1.11.1 + github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect + github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817 github.com/dustin/go-humanize v1.0.0 github.com/fatih/color v1.9.0 // indirect github.com/go-enry/go-enry/v2 v2.5.2 @@ -13,8 +15,8 @@ require ( github.com/sergi/go-diff v1.1.0 // indirect github.com/spf13/cobra v1.0.0 github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 // indirect - golang.org/x/net v0.0.0-20200528225125-3c3fba18258b // indirect - golang.org/x/sys v0.0.0-20200523222454-059865788121 // indirect + golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 // indirect + golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect + golang.org/x/sys v0.0.0-20200610111108-226ff32320da // indirect gopkg.in/src-d/go-git.v4 v4.13.1 ) diff --git a/go.sum b/go.sum index 1fb629d..ce96a34 100644 --- a/go.sum +++ b/go.sum @@ -25,9 +25,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817 h1:0nsrg//Dc7xC74H/TZ5sYR8uk4UQRNjsw8zejqH5a4Q= +github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817/go.mod h1:C/+sI4IFnEpCn6VQ3GIPEp+FrQnQw+YQP3+n+GdGq7o= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -168,8 +172,8 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -181,8 +185,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200528225125-3c3fba18258b h1:IYiJPiJfzktmDAO1HQiwjMjwjlYKHAL7KzeD544RJPs= -golang.org/x/net v0.0.0-20200528225125-3c3fba18258b/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -202,8 +206,8 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da h1:bGb80FudwxpeucJUjPYJXuJ8Hk91vNtfvrymzwiei38= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= diff --git a/pkg/comments/comments.go b/pkg/comments/comments.go index 8c1f06e..e32c540 100644 --- a/pkg/comments/comments.go +++ b/pkg/comments/comments.go @@ -5,11 +5,13 @@ import ( "io" "io/ioutil" "os" + "path" "path/filepath" "strings" "sync" "github.com/augmentable-dev/lege" + "github.com/denormal/go-gitignore" "github.com/go-enry/go-enry/v2" "github.com/karrick/godirwalk" "gopkg.in/src-d/go-git.v4/plumbing/object" @@ -66,14 +68,33 @@ func SearchFile(filePath string, reader io.Reader, cb func(*Comment)) error { // SearchDir searches a directory for comments func SearchDir(dirPath string, cb func(comment *Comment)) error { + + // TODO this should be done "recursively" in each subdirectory of the directory being searched + // .gitignores can be in sub-directories of a git repo, therefore we should account for *any* not just the one in the root directory + gitignorePath := path.Join(dirPath, ".gitignore") + var ignore gitignore.GitIgnore + if _, err := os.Stat(gitignorePath); err == nil { // if .gitignore exists + ignore, err = gitignore.NewFromFile(gitignorePath) + + if err != nil { + return err + } + + } else if os.IsNotExist(err) { + // if the .gitignore file just doesn't exist, do nothing + } else { + // if there was still an error, return it + return err + } + err := godirwalk.Walk(dirPath, &godirwalk.Options{ - Callback: func(path string, de *godirwalk.Dirent) error { - localPath, err := filepath.Rel(dirPath, path) + Callback: func(p string, de *godirwalk.Dirent) error { + localPath, err := filepath.Rel(dirPath, p) if err != nil { return err } pathComponents := strings.Split(localPath, string(os.PathSeparator)) - // let's ignore git directories TODO: figure out a more generic way to set ignores + matched, err := filepath.Match(".git", pathComponents[0]) if err != nil { return err @@ -82,10 +103,12 @@ func SearchDir(dirPath string, cb func(comment *Comment)) error { return nil } if de.IsRegular() { - p, err := filepath.Abs(path) - if err != nil { - return err + if ignore != nil { + if ignore.Ignore(p) { + return nil + } } + f, err := os.Open(p) if err != nil { return err diff --git a/pkg/comments/comments_test.go b/pkg/comments/comments_test.go index 4d5e6d5..fba30a6 100644 --- a/pkg/comments/comments_test.go +++ b/pkg/comments/comments_test.go @@ -1,9 +1,36 @@ package comments import ( + "io/ioutil" + "os" "testing" ) +func TestGitIgnore(t *testing.T) { + gitignorePath := "testdata/gitignore/.gitignore" + err := ioutil.WriteFile(gitignorePath, []byte("test.go\n"), 0644) + if err != nil { + t.Fatal(err) + } + defer func() { + err := os.Remove(gitignorePath) + if err != nil { + t.Fatal(err) + } + }() + var comments Comments + err = SearchDir("testdata/gitignore", func(comment *Comment) { + comments = append(comments, comment) + }) + if err != nil { + t.Fatal(err) + } + + if len(comments) != 0 { + t.Fail() + } +} + func TestJSFiles(t *testing.T) { var comments Comments err := SearchDir("testdata/javascript", func(comment *Comment) { diff --git a/pkg/comments/testdata/gitignore/test.go b/pkg/comments/testdata/gitignore/test.go new file mode 100644 index 0000000..bfeea70 --- /dev/null +++ b/pkg/comments/testdata/gitignore/test.go @@ -0,0 +1,8 @@ +package main + +import "fmt" + +func main() { + // TODO this should be ignored since this file is in the gitignore + fmt.Println("Hello world") +}