{"action":"closed","number":448,"pull_request":{"url":"https://api.github.com/repos/smartystreets/goconvey/pulls/448","id":87194822,"html_url":"https://github.com/smartystreets/goconvey/pull/448","diff_url":"https://github.com/smartystreets/goconvey/pull/448.diff","patch_url":"https://github.com/smartystreets/goconvey/pull/448.patch","issue_url":"https://api.github.com/repos/smartystreets/goconvey/issues/448","number":448,"state":"closed","locked":false,"title":"Improve performance by skipping hidden dirs","user":{"login":"akupila","id":540683,"avatar_url":"https://avatars.githubusercontent.com/u/540683?v=3","gravatar_id":"","url":"https://api.github.com/users/akupila","html_url":"https://github.com/akupila","followers_url":"https://api.github.com/users/akupila/followers","following_url":"https://api.github.com/users/akupila/following{/other_user}","gists_url":"https://api.github.com/users/akupila/gists{/gist_id}","starred_url":"https://api.github.com/users/akupila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akupila/subscriptions","organizations_url":"https://api.github.com/users/akupila/orgs","repos_url":"https://api.github.com/users/akupila/repos","events_url":"https://api.github.com/users/akupila/events{/privacy}","received_events_url":"https://api.github.com/users/akupila/received_events","type":"User","site_admin":false},"body":"This PR skips directories starting with `.` to dramatically improve performance if such directories are present. It's a small change but makes a huge impact when there's a directory (such as artifacts from a build tool -- in my case Wercker -- as a hidden directories in the working dir).\r\n\r\nProfiled using [pkg/profile](https://github.com/pkg/profile):\r\n\r\n**Before**\r\n```\r\n$ go tool pprof --text ./goconvey /var/folders/8m/dzjlyrtd3vx3hb0mwfxgswm80000gn/T/profile152855215/cpu.pprof\r\n42.83s of 43.63s total (98.17%)\r\nDropped 105 nodes (cum <= 0.22s)\r\n      flat  flat%   sum%        cum   cum%\r\n    14.42s 33.05% 33.05%     14.42s 33.05%  syscall.Syscall\r\n     9.10s 20.86% 53.91%      9.11s 20.88%  syscall.Syscall6\r\n     6.57s 15.06% 68.97%      6.57s 15.06%  runtime.mach_semaphore_wait\r\n     6.48s 14.85% 83.82%      6.48s 14.85%  runtime.mach_semaphore_signal\r\n     5.25s 12.03% 95.85%      5.25s 12.03%  runtime.usleep\r\n     0.50s  1.15% 97.00%      0.50s  1.15%  path/filepath.Clean\r\n     0.27s  0.62% 97.62%      0.27s  0.62%  runtime.memmove\r\n     0.11s  0.25% 97.87%      0.24s  0.55%  runtime.scanobject\r\n     0.05s  0.11% 97.98%     11.52s 26.40%  runtime.findrunnable\r\n     0.03s 0.069% 98.05%      0.26s   0.6%  runtime.gcFlushBgCredit\r\n     0.01s 0.023% 98.07%      5.21s 11.94%  github.com/smartystreets/goconvey/web/server/watch.YieldFileSystemItems.func1.1\r\n     0.01s 0.023% 98.10%      1.02s  2.34%  runtime.gcDrain\r\n     0.01s 0.023% 98.12%      6.49s 14.88%  runtime.notewakeup\r\n     0.01s 0.023% 98.14%      4.64s 10.63%  runtime.runqgrab\r\n     0.01s 0.023% 98.17%      6.70s 15.36%  runtime.semasleep.func1\r\n         0     0% 98.17%      0.59s  1.35%  github.com/smartystreets/goconvey/web/server/watch.(*Watcher).Listen\r\n         0     0% 98.17%      0.59s  1.35%  github.com/smartystreets/goconvey/web/server/watch.(*Watcher).gather\r\n         0     0% 98.17%      0.59s  1.35%  github.com/smartystreets/goconvey/web/server/watch.(*Watcher).scan\r\n         0     0% 98.17%      0.58s  1.33%  github.com/smartystreets/goconvey/web/server/watch.Categorize\r\n         0     0% 98.17%     29.09s 66.67%  github.com/smartystreets/goconvey/web/server/watch.YieldFileSystemItems.func1\r\n         0     0% 98.17%      0.49s  1.12%  github.com/smartystreets/goconvey/web/server/watch.foundInHiddenDirectory\r\n         0     0% 98.17%      1.76s  4.03%  os.(*File).Close\r\n         0     0% 98.17%      9.20s 21.09%  os.(*File).Readdirnames\r\n         0     0% 98.17%      9.20s 21.09%  os.(*File).readdirnames\r\n         0     0% 98.17%      1.76s  4.03%  os.(*file).close\r\n         0     0% 98.17%     10.53s 24.13%  os.Lstat\r\n...\r\n```\r\n\r\n**After**\r\n```\r\n$ go tool pprof --text ./goconvey /var/folders/8m/dzjlyrtd3vx3hb0mwfxgswm80000gn/T/profile075756739/cpu.pprof\r\n410ms of 410ms total (  100%)\r\n      flat  flat%   sum%        cum   cum%\r\n     100ms 24.39% 24.39%      100ms 24.39%  syscall.Syscall6\r\n      90ms 21.95% 46.34%       90ms 21.95%  runtime.usleep\r\n      80ms 19.51% 65.85%       80ms 19.51%  runtime.mach_semaphore_signal\r\n      60ms 14.63% 80.49%       60ms 14.63%  runtime.mach_semaphore_wait\r\n      60ms 14.63% 95.12%       60ms 14.63%  syscall.Syscall\r\n      10ms  2.44% 97.56%       10ms  2.44%  runtime.runqget\r\n      10ms  2.44%   100%       10ms  2.44%  syscall.ParseDirent\r\n         0     0%   100%       20ms  4.88%  github.com/smartystreets/goconvey/web/server/watch.(*Watcher).Listen\r\n         0     0%   100%      230ms 56.10%  github.com/smartystreets/goconvey/web/server/watch.YieldFileSystemItems.func1\r\n         0     0%   100%       60ms 14.63%  github.com/smartystreets/goconvey/web/server/watch.YieldFileSystemItems.func1.1\r\n         0     0%   100%       20ms  4.88%  os.(*File).Close\r\n         0     0%   100%      110ms 26.83%  os.(*File).Readdirnames\r\n         0     0%   100%      110ms 26.83%  os.(*File).readdirnames\r\n         0     0%   100%       20ms  4.88%  os.(*file).close\r\n         0     0%   100%       20ms  4.88%  os.Lstat\r\n...\r\n```\r\n\r\nBefore:\r\n<img width=\"712\" alt=\"screen shot 2016-09-28 at 22 20 28\" src=\"https://cloud.githubusercontent.com/assets/540683/18930799/cbf556f6-85c9-11e6-93e8-6f15cd005e44.png\">\r\n\r\nAfter:\r\n<img width=\"713\" alt=\"screen shot 2016-09-28 at 22 23 22\" src=\"https://cloud.githubusercontent.com/assets/540683/18930903/3acff9dc-85ca-11e6-9b5d-af39a1719e33.png\">","created_at":"2016-09-28T20:28:20Z","updated_at":"2016-09-28T20:55:24Z","closed_at":"2016-09-28T20:55:24Z","merged_at":"2016-09-28T20:55:23Z","merge_commit_sha":"7befa7fd6e2e8ca28d2b94f2d39111929904b08d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/smartystreets/goconvey/pulls/448/commits","review_comments_url":"https://api.github.com/repos/smartystreets/goconvey/pulls/448/comments","review_comment_url":"https://api.github.com/repos/smartystreets/goconvey/pulls/comments{/number}","comments_url":"https://api.github.com/repos/smartystreets/goconvey/issues/448/comments","statuses_url":"https://api.github.com/repos/smartystreets/goconvey/statuses/ecb8d64d662703d49711121b2ea03f4da8a1cab6","head":{"label":"akupila:master","ref":"master","sha":"ecb8d64d662703d49711121b2ea03f4da8a1cab6","user":{"login":"akupila","id":540683,"avatar_url":"https://avatars.githubusercontent.com/u/540683?v=3","gravatar_id":"","url":"https://api.github.com/users/akupila","html_url":"https://github.com/akupila","followers_url":"https://api.github.com/users/akupila/followers","following_url":"https://api.github.com/users/akupila/following{/other_user}","gists_url":"https://api.github.com/users/akupila/gists{/gist_id}","starred_url":"https://api.github.com/users/akupila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akupila/subscriptions","organizations_url":"https://api.github.com/users/akupila/orgs","repos_url":"https://api.github.com/users/akupila/repos","events_url":"https://api.github.com/users/akupila/events{/privacy}","received_events_url":"https://api.github.com/users/akupila/received_events","type":"User","site_admin":false},"repo":{"id":61806151,"name":"goconvey","full_name":"akupila/goconvey","owner":{"login":"akupila","id":540683,"avatar_url":"https://avatars.githubusercontent.com/u/540683?v=3","gravatar_id":"","url":"https://api.github.com/users/akupila","html_url":"https://github.com/akupila","followers_url":"https://api.github.com/users/akupila/followers","following_url":"https://api.github.com/users/akupila/following{/other_user}","gists_url":"https://api.github.com/users/akupila/gists{/gist_id}","starred_url":"https://api.github.com/users/akupila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akupila/subscriptions","organizations_url":"https://api.github.com/users/akupila/orgs","repos_url":"https://api.github.com/users/akupila/repos","events_url":"https://api.github.com/users/akupila/events{/privacy}","received_events_url":"https://api.github.com/users/akupila/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/akupila/goconvey","description":"Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.","fork":true,"url":"https://api.github.com/repos/akupila/goconvey","forks_url":"https://api.github.com/repos/akupila/goconvey/forks","keys_url":"https://api.github.com/repos/akupila/goconvey/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akupila/goconvey/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akupila/goconvey/teams","hooks_url":"https://api.github.com/repos/akupila/goconvey/hooks","issue_events_url":"https://api.github.com/repos/akupila/goconvey/issues/events{/number}","events_url":"https://api.github.com/repos/akupila/goconvey/events","assignees_url":"https://api.github.com/repos/akupila/goconvey/assignees{/user}","branches_url":"https://api.github.com/repos/akupila/goconvey/branches{/branch}","tags_url":"https://api.github.com/repos/akupila/goconvey/tags","blobs_url":"https://api.github.com/repos/akupila/goconvey/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akupila/goconvey/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akupila/goconvey/git/refs{/sha}","trees_url":"https://api.github.com/repos/akupila/goconvey/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akupila/goconvey/statuses/{sha}","languages_url":"https://api.github.com/repos/akupila/goconvey/languages","stargazers_url":"https://api.github.com/repos/akupila/goconvey/stargazers","contributors_url":"https://api.github.com/repos/akupila/goconvey/contributors","subscribers_url":"https://api.github.com/repos/akupila/goconvey/subscribers","subscription_url":"https://api.github.com/repos/akupila/goconvey/subscription","commits_url":"https://api.github.com/repos/akupila/goconvey/commits{/sha}","git_commits_url":"https://api.github.com/repos/akupila/goconvey/git/commits{/sha}","comments_url":"https://api.github.com/repos/akupila/goconvey/comments{/number}","issue_comment_url":"https://api.github.com/repos/akupila/goconvey/issues/comments{/number}","contents_url":"https://api.github.com/repos/akupila/goconvey/contents/{+path}","compare_url":"https://api.github.com/repos/akupila/goconvey/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akupila/goconvey/merges","archive_url":"https://api.github.com/repos/akupila/goconvey/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akupila/goconvey/downloads","issues_url":"https://api.github.com/repos/akupila/goconvey/issues{/number}","pulls_url":"https://api.github.com/repos/akupila/goconvey/pulls{/number}","milestones_url":"https://api.github.com/repos/akupila/goconvey/milestones{/number}","notifications_url":"https://api.github.com/repos/akupila/goconvey/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akupila/goconvey/labels{/name}","releases_url":"https://api.github.com/repos/akupila/goconvey/releases{/id}","deployments_url":"https://api.github.com/repos/akupila/goconvey/deployments","created_at":"2016-06-23T13:11:45Z","updated_at":"2016-06-23T13:11:46Z","pushed_at":"2016-09-28T20:15:50Z","git_url":"git://github.com/akupila/goconvey.git","ssh_url":"git@github.com:akupila/goconvey.git","clone_url":"https://github.com/akupila/goconvey.git","svn_url":"https://github.com/akupila/goconvey","homepage":"http://goconvey.co","size":3833,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"smartystreets:master","ref":"master","sha":"5db88ed452e937f2fd557de6f4f1af7f2eabed0b","user":{"login":"smartystreets","id":969237,"avatar_url":"https://avatars.githubusercontent.com/u/969237?v=3","gravatar_id":"","url":"https://api.github.com/users/smartystreets","html_url":"https://github.com/smartystreets","followers_url":"https://api.github.com/users/smartystreets/followers","following_url":"https://api.github.com/users/smartystreets/following{/other_user}","gists_url":"https://api.github.com/users/smartystreets/gists{/gist_id}","starred_url":"https://api.github.com/users/smartystreets/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smartystreets/subscriptions","organizations_url":"https://api.github.com/users/smartystreets/orgs","repos_url":"https://api.github.com/users/smartystreets/repos","events_url":"https://api.github.com/users/smartystreets/events{/privacy}","received_events_url":"https://api.github.com/users/smartystreets/received_events","type":"Organization","site_admin":false},"repo":{"id":12261520,"name":"goconvey","full_name":"smartystreets/goconvey","owner":{"login":"smartystreets","id":969237,"avatar_url":"https://avatars.githubusercontent.com/u/969237?v=3","gravatar_id":"","url":"https://api.github.com/users/smartystreets","html_url":"https://github.com/smartystreets","followers_url":"https://api.github.com/users/smartystreets/followers","following_url":"https://api.github.com/users/smartystreets/following{/other_user}","gists_url":"https://api.github.com/users/smartystreets/gists{/gist_id}","starred_url":"https://api.github.com/users/smartystreets/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smartystreets/subscriptions","organizations_url":"https://api.github.com/users/smartystreets/orgs","repos_url":"https://api.github.com/users/smartystreets/repos","events_url":"https://api.github.com/users/smartystreets/events{/privacy}","received_events_url":"https://api.github.com/users/smartystreets/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/smartystreets/goconvey","description":"Go testing in the browser. Integrates with `go test`. Write behavioral tests in Go.","fork":false,"url":"https://api.github.com/repos/smartystreets/goconvey","forks_url":"https://api.github.com/repos/smartystreets/goconvey/forks","keys_url":"https://api.github.com/repos/smartystreets/goconvey/keys{/key_id}","collaborators_url":"https://api.github.com/repos/smartystreets/goconvey/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/smartystreets/goconvey/teams","hooks_url":"https://api.github.com/repos/smartystreets/goconvey/hooks","issue_events_url":"https://api.github.com/repos/smartystreets/goconvey/issues/events{/number}","events_url":"https://api.github.com/repos/smartystreets/goconvey/events","assignees_url":"https://api.github.com/repos/smartystreets/goconvey/assignees{/user}","branches_url":"https://api.github.com/repos/smartystreets/goconvey/branches{/branch}","tags_url":"https://api.github.com/repos/smartystreets/goconvey/tags","blobs_url":"https://api.github.com/repos/smartystreets/goconvey/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/smartystreets/goconvey/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/smartystreets/goconvey/git/refs{/sha}","trees_url":"https://api.github.com/repos/smartystreets/goconvey/git/trees{/sha}","statuses_url":"https://api.github.com/repos/smartystreets/goconvey/statuses/{sha}","languages_url":"https://api.github.com/repos/smartystreets/goconvey/languages","stargazers_url":"https://api.github.com/repos/smartystreets/goconvey/stargazers","contributors_url":"https://api.github.com/repos/smartystreets/goconvey/contributors","subscribers_url":"https://api.github.com/repos/smartystreets/goconvey/subscribers","subscription_url":"https://api.github.com/repos/smartystreets/goconvey/subscription","commits_url":"https://api.github.com/repos/smartystreets/goconvey/commits{/sha}","git_commits_url":"https://api.github.com/repos/smartystreets/goconvey/git/commits{/sha}","comments_url":"https://api.github.com/repos/smartystreets/goconvey/comments{/number}","issue_comment_url":"https://api.github.com/repos/smartystreets/goconvey/issues/comments{/number}","contents_url":"https://api.github.com/repos/smartystreets/goconvey/contents/{+path}","compare_url":"https://api.github.com/repos/smartystreets/goconvey/compare/{base}...{head}","merges_url":"https://api.github.com/repos/smartystreets/goconvey/merges","archive_url":"https://api.github.com/repos/smartystreets/goconvey/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/smartystreets/goconvey/downloads","issues_url":"https://api.github.com/repos/smartystreets/goconvey/issues{/number}","pulls_url":"https://api.github.com/repos/smartystreets/goconvey/pulls{/number}","milestones_url":"https://api.github.com/repos/smartystreets/goconvey/milestones{/number}","notifications_url":"https://api.github.com/repos/smartystreets/goconvey/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/smartystreets/goconvey/labels{/name}","releases_url":"https://api.github.com/repos/smartystreets/goconvey/releases{/id}","deployments_url":"https://api.github.com/repos/smartystreets/goconvey/deployments","created_at":"2013-08-21T04:52:28Z","updated_at":"2016-09-28T16:42:54Z","pushed_at":"2016-09-28T20:55:23Z","git_url":"git://github.com/smartystreets/goconvey.git","ssh_url":"git@github.com:smartystreets/goconvey.git","clone_url":"https://github.com/smartystreets/goconvey.git","svn_url":"https://github.com/smartystreets/goconvey","homepage":"http://goconvey.co","size":4247,"stargazers_count":2391,"watchers_count":2391,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":184,"mirror_url":null,"open_issues_count":54,"forks":184,"open_issues":54,"watchers":2391,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/smartystreets/goconvey/pulls/448"},"html":{"href":"https://github.com/smartystreets/goconvey/pull/448"},"issue":{"href":"https://api.github.com/repos/smartystreets/goconvey/issues/448"},"comments":{"href":"https://api.github.com/repos/smartystreets/goconvey/issues/448/comments"},"review_comments":{"href":"https://api.github.com/repos/smartystreets/goconvey/pulls/448/comments"},"review_comment":{"href":"https://api.github.com/repos/smartystreets/goconvey/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/smartystreets/goconvey/pulls/448/commits"},"statuses":{"href":"https://api.github.com/repos/smartystreets/goconvey/statuses/ecb8d64d662703d49711121b2ea03f4da8a1cab6"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"riannucci","id":133821,"avatar_url":"https://avatars.githubusercontent.com/u/133821?v=3","gravatar_id":"","url":"https://api.github.com/users/riannucci","html_url":"https://github.com/riannucci","followers_url":"https://api.github.com/users/riannucci/followers","following_url":"https://api.github.com/users/riannucci/following{/other_user}","gists_url":"https://api.github.com/users/riannucci/gists{/gist_id}","starred_url":"https://api.github.com/users/riannucci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riannucci/subscriptions","organizations_url":"https://api.github.com/users/riannucci/orgs","repos_url":"https://api.github.com/users/riannucci/repos","events_url":"https://api.github.com/users/riannucci/events{/privacy}","received_events_url":"https://api.github.com/users/riannucci/received_events","type":"User","site_admin":false},"comments":1,"review_comments":0,"commits":1,"additions":5,"deletions":0,"changed_files":1}}
{"actor":{"display_login":"riannucci"}}