{"action":"closed","number":16124,"pull_request":{"url":"https://api.github.com/repos/atom/atom/pulls/16124","id":151216539,"html_url":"https://github.com/atom/atom/pull/16124","diff_url":"https://github.com/atom/atom/pull/16124.diff","patch_url":"https://github.com/atom/atom/pull/16124.patch","issue_url":"https://api.github.com/repos/atom/atom/issues/16124","number":16124,"state":"closed","locked":false,"title":"Back filesystem watchers with @atom/watcher","user":{"login":"smashwilson","id":17565,"avatar_url":"https://avatars2.githubusercontent.com/u/17565?v=4","gravatar_id":"","url":"https://api.github.com/users/smashwilson","html_url":"https://github.com/smashwilson","followers_url":"https://api.github.com/users/smashwilson/followers","following_url":"https://api.github.com/users/smashwilson/following{/other_user}","gists_url":"https://api.github.com/users/smashwilson/gists{/gist_id}","starred_url":"https://api.github.com/users/smashwilson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smashwilson/subscriptions","organizations_url":"https://api.github.com/users/smashwilson/orgs","repos_url":"https://api.github.com/users/smashwilson/repos","events_url":"https://api.github.com/users/smashwilson/events{/privacy}","received_events_url":"https://api.github.com/users/smashwilson/received_events","type":"User","site_admin":true},"body":"Add a new \"experimental\" setting for `core.fileSystemWatcher` that backs watchPath with [@atom/watcher](https://github.com/atom/watcher). There should be no changes for API consumers.\r\n\r\n> ⚠️ There's a reason this is marked \"experimental!\" Our intention is to not merge this PR until I'm back from pending paternity leave, then let it percolate its way through master, beta, and stable before we consider flipping the feature flag on for everyone. In the meantime, if you want to see if this fixes a filesystem watching issue that you're having, you'll need to build Atom from this branch. :warning:\r\n\r\n#### Remaining Work\r\n\r\nThese are known issues in @atom/watcher that I'd like to address before this merges. Mostly, these avoid regressing on some edge cases that have been reported with the current watcher.\r\n\r\n- [x] Translate Windows short names to long names (atom/watcher#85)\r\n- [x] Handle symlinks (atom/watcher#19, atom/atom#15966)\r\n- [x] Test for filesystem case sensitivity issues (atom/watcher#16)\r\n- [x] Test for unicode paths (atom/watcher#12)\r\n- [x] Manual \"just poll everything\" setting\r\n- [x] @smashwilson back from paternity leave :baby:\r\n- [x] Complete the testing matrix below :point_down:\r\n- [x] Tag and publish @atom/watcher 1.0.0\r\n\r\n#### Features and Limitations\r\n\r\nIn its current state, the experimental watcher:\r\n\r\n* Uses one or two threads for all watcher threads, rather than two threads per watcher.\r\n* Fails gracefully to polling when (a) more than 451 watch roots are created on MacOS; (b) `ReadDirectoryChangesW()` reports that a directory does not support watching on Windows; or (c) the maximum number of inotify watch descriptors is exceeded on Linux.\r\n* Can log a bunch of diagnostic information to track down edge cases.\r\n* Scales to thousands of watch roots containing tens of thousands of files.\r\n* Watch directories recursively or non-recursively.\r\n* Watch individual files without polling.\r\n\r\nIt cannot currently:\r\n\r\n* Follow symlinks.\r\n* Explicitly include or exclude subpaths of a watched directory.\r\n* Receive notifications on certain network shares.\r\n* Report drive mount and unmount events.\r\n\r\n#### Test Plan\r\n\r\nBefore we merge, I'd like to verify that we handle or fail gracefully in a number of trickier situations. In each scenario, if we:\r\n\r\n* :red_circle: **crash in native code** or **lock up**, I would consider that a blocker for merging this.\r\n* :warning: throw a **JavaScript stack** or **silently fail to deliver any events**, I'd consider merging anyway, with an issue filed against @atom/watcher.\r\n\r\nThese are some of the cases I've thought to try:\r\n\r\n- [x] Open a project directory on a network drive.\r\n  - [x] MacOS: sshfs\r\n  - [x] MacOS: Samba\r\n  - [x] Windows: native Windows-to-Windows network share\r\n  - [x] Windows: Samba\r\n  - [x] Linux: sshfs\r\n  - [x] Linux: Samba\r\n- [x] Open a project directory from a flash drive.\r\n  - [x] MacOS\r\n  - [x] Windows\r\n  - [x] Linux\r\n- [x] Unmount a filesystem that contains an open project directory.\r\n  - [x] MacOS\r\n  - [x] Windows\r\n  - [x] Linux\r\n- [x] Mount a new filesystem beneath a watched directory.\r\n  - [x] MacOS\r\n  - [x] Linux\r\n- [x] Cloning a large git repository beneath a watched directory.\r\n  - [x] MacOS\r\n  - [x] Windows\r\n  - [x] Linux\r\n\r\n#### To Opt In\r\n\r\nIf you want to give this a try before it merges, clone and [build Atom](https://github.com/atom/atom/tree/master/docs/build-instructions) from this branch:\r\n\r\n```sh\r\ngit clone https://github.com/atom/atom.git --branch aw-watcher\r\ncd atom\r\nscript/build --install\r\n```\r\n\r\nLaunch Atom and set `core.fileSystemWatcher` to \"experimental\" in your core settings.\r\n","created_at":"2017-11-07T20:17:43Z","updated_at":"2018-02-14T16:01:38Z","closed_at":"2018-02-14T16:01:38Z","merged_at":"2018-02-14T16:01:38Z","merge_commit_sha":"9f8370ce9294b509318e000bb15231a23dc8dd84","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/atom/atom/pulls/16124/commits","review_comments_url":"https://api.github.com/repos/atom/atom/pulls/16124/comments","review_comment_url":"https://api.github.com/repos/atom/atom/pulls/comments{/number}","comments_url":"https://api.github.com/repos/atom/atom/issues/16124/comments","statuses_url":"https://api.github.com/repos/atom/atom/statuses/73d8471b5c94132b67b3116234058dd1d86954bb","head":{"label":"atom:aw-watcher","ref":"aw-watcher","sha":"73d8471b5c94132b67b3116234058dd1d86954bb","user":{"login":"atom","id":1089146,"avatar_url":"https://avatars2.githubusercontent.com/u/1089146?v=4","gravatar_id":"","url":"https://api.github.com/users/atom","html_url":"https://github.com/atom","followers_url":"https://api.github.com/users/atom/followers","following_url":"https://api.github.com/users/atom/following{/other_user}","gists_url":"https://api.github.com/users/atom/gists{/gist_id}","starred_url":"https://api.github.com/users/atom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atom/subscriptions","organizations_url":"https://api.github.com/users/atom/orgs","repos_url":"https://api.github.com/users/atom/repos","events_url":"https://api.github.com/users/atom/events{/privacy}","received_events_url":"https://api.github.com/users/atom/received_events","type":"Organization","site_admin":false},"repo":{"id":3228505,"name":"atom","full_name":"atom/atom","owner":{"login":"atom","id":1089146,"avatar_url":"https://avatars2.githubusercontent.com/u/1089146?v=4","gravatar_id":"","url":"https://api.github.com/users/atom","html_url":"https://github.com/atom","followers_url":"https://api.github.com/users/atom/followers","following_url":"https://api.github.com/users/atom/following{/other_user}","gists_url":"https://api.github.com/users/atom/gists{/gist_id}","starred_url":"https://api.github.com/users/atom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atom/subscriptions","organizations_url":"https://api.github.com/users/atom/orgs","repos_url":"https://api.github.com/users/atom/repos","events_url":"https://api.github.com/users/atom/events{/privacy}","received_events_url":"https://api.github.com/users/atom/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/atom/atom","description":":atom: The hackable text editor","fork":false,"url":"https://api.github.com/repos/atom/atom","forks_url":"https://api.github.com/repos/atom/atom/forks","keys_url":"https://api.github.com/repos/atom/atom/keys{/key_id}","collaborators_url":"https://api.github.com/repos/atom/atom/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/atom/atom/teams","hooks_url":"https://api.github.com/repos/atom/atom/hooks","issue_events_url":"https://api.github.com/repos/atom/atom/issues/events{/number}","events_url":"https://api.github.com/repos/atom/atom/events","assignees_url":"https://api.github.com/repos/atom/atom/assignees{/user}","branches_url":"https://api.github.com/repos/atom/atom/branches{/branch}","tags_url":"https://api.github.com/repos/atom/atom/tags","blobs_url":"https://api.github.com/repos/atom/atom/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/atom/atom/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/atom/atom/git/refs{/sha}","trees_url":"https://api.github.com/repos/atom/atom/git/trees{/sha}","statuses_url":"https://api.github.com/repos/atom/atom/statuses/{sha}","languages_url":"https://api.github.com/repos/atom/atom/languages","stargazers_url":"https://api.github.com/repos/atom/atom/stargazers","contributors_url":"https://api.github.com/repos/atom/atom/contributors","subscribers_url":"https://api.github.com/repos/atom/atom/subscribers","subscription_url":"https://api.github.com/repos/atom/atom/subscription","commits_url":"https://api.github.com/repos/atom/atom/commits{/sha}","git_commits_url":"https://api.github.com/repos/atom/atom/git/commits{/sha}","comments_url":"https://api.github.com/repos/atom/atom/comments{/number}","issue_comment_url":"https://api.github.com/repos/atom/atom/issues/comments{/number}","contents_url":"https://api.github.com/repos/atom/atom/contents/{+path}","compare_url":"https://api.github.com/repos/atom/atom/compare/{base}...{head}","merges_url":"https://api.github.com/repos/atom/atom/merges","archive_url":"https://api.github.com/repos/atom/atom/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/atom/atom/downloads","issues_url":"https://api.github.com/repos/atom/atom/issues{/number}","pulls_url":"https://api.github.com/repos/atom/atom/pulls{/number}","milestones_url":"https://api.github.com/repos/atom/atom/milestones{/number}","notifications_url":"https://api.github.com/repos/atom/atom/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/atom/atom/labels{/name}","releases_url":"https://api.github.com/repos/atom/atom/releases{/id}","deployments_url":"https://api.github.com/repos/atom/atom/deployments","created_at":"2012-01-20T18:18:21Z","updated_at":"2018-02-14T15:50:59Z","pushed_at":"2018-02-14T16:01:38Z","git_url":"git://github.com/atom/atom.git","ssh_url":"git@github.com:atom/atom.git","clone_url":"https://github.com/atom/atom.git","svn_url":"https://github.com/atom/atom","homepage":"https://atom.io","size":295066,"stargazers_count":43371,"watchers_count":43371,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8571,"mirror_url":null,"archived":false,"open_issues_count":923,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":8571,"open_issues":923,"watchers":43371,"default_branch":"master"}},"base":{"label":"atom:master","ref":"master","sha":"0b59e5fc5e763827c4772cb629ae40086396e504","user":{"login":"atom","id":1089146,"avatar_url":"https://avatars2.githubusercontent.com/u/1089146?v=4","gravatar_id":"","url":"https://api.github.com/users/atom","html_url":"https://github.com/atom","followers_url":"https://api.github.com/users/atom/followers","following_url":"https://api.github.com/users/atom/following{/other_user}","gists_url":"https://api.github.com/users/atom/gists{/gist_id}","starred_url":"https://api.github.com/users/atom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atom/subscriptions","organizations_url":"https://api.github.com/users/atom/orgs","repos_url":"https://api.github.com/users/atom/repos","events_url":"https://api.github.com/users/atom/events{/privacy}","received_events_url":"https://api.github.com/users/atom/received_events","type":"Organization","site_admin":false},"repo":{"id":3228505,"name":"atom","full_name":"atom/atom","owner":{"login":"atom","id":1089146,"avatar_url":"https://avatars2.githubusercontent.com/u/1089146?v=4","gravatar_id":"","url":"https://api.github.com/users/atom","html_url":"https://github.com/atom","followers_url":"https://api.github.com/users/atom/followers","following_url":"https://api.github.com/users/atom/following{/other_user}","gists_url":"https://api.github.com/users/atom/gists{/gist_id}","starred_url":"https://api.github.com/users/atom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atom/subscriptions","organizations_url":"https://api.github.com/users/atom/orgs","repos_url":"https://api.github.com/users/atom/repos","events_url":"https://api.github.com/users/atom/events{/privacy}","received_events_url":"https://api.github.com/users/atom/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/atom/atom","description":":atom: The hackable text editor","fork":false,"url":"https://api.github.com/repos/atom/atom","forks_url":"https://api.github.com/repos/atom/atom/forks","keys_url":"https://api.github.com/repos/atom/atom/keys{/key_id}","collaborators_url":"https://api.github.com/repos/atom/atom/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/atom/atom/teams","hooks_url":"https://api.github.com/repos/atom/atom/hooks","issue_events_url":"https://api.github.com/repos/atom/atom/issues/events{/number}","events_url":"https://api.github.com/repos/atom/atom/events","assignees_url":"https://api.github.com/repos/atom/atom/assignees{/user}","branches_url":"https://api.github.com/repos/atom/atom/branches{/branch}","tags_url":"https://api.github.com/repos/atom/atom/tags","blobs_url":"https://api.github.com/repos/atom/atom/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/atom/atom/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/atom/atom/git/refs{/sha}","trees_url":"https://api.github.com/repos/atom/atom/git/trees{/sha}","statuses_url":"https://api.github.com/repos/atom/atom/statuses/{sha}","languages_url":"https://api.github.com/repos/atom/atom/languages","stargazers_url":"https://api.github.com/repos/atom/atom/stargazers","contributors_url":"https://api.github.com/repos/atom/atom/contributors","subscribers_url":"https://api.github.com/repos/atom/atom/subscribers","subscription_url":"https://api.github.com/repos/atom/atom/subscription","commits_url":"https://api.github.com/repos/atom/atom/commits{/sha}","git_commits_url":"https://api.github.com/repos/atom/atom/git/commits{/sha}","comments_url":"https://api.github.com/repos/atom/atom/comments{/number}","issue_comment_url":"https://api.github.com/repos/atom/atom/issues/comments{/number}","contents_url":"https://api.github.com/repos/atom/atom/contents/{+path}","compare_url":"https://api.github.com/repos/atom/atom/compare/{base}...{head}","merges_url":"https://api.github.com/repos/atom/atom/merges","archive_url":"https://api.github.com/repos/atom/atom/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/atom/atom/downloads","issues_url":"https://api.github.com/repos/atom/atom/issues{/number}","pulls_url":"https://api.github.com/repos/atom/atom/pulls{/number}","milestones_url":"https://api.github.com/repos/atom/atom/milestones{/number}","notifications_url":"https://api.github.com/repos/atom/atom/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/atom/atom/labels{/name}","releases_url":"https://api.github.com/repos/atom/atom/releases{/id}","deployments_url":"https://api.github.com/repos/atom/atom/deployments","created_at":"2012-01-20T18:18:21Z","updated_at":"2018-02-14T15:50:59Z","pushed_at":"2018-02-14T16:01:38Z","git_url":"git://github.com/atom/atom.git","ssh_url":"git@github.com:atom/atom.git","clone_url":"https://github.com/atom/atom.git","svn_url":"https://github.com/atom/atom","homepage":"https://atom.io","size":295066,"stargazers_count":43371,"watchers_count":43371,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8571,"mirror_url":null,"archived":false,"open_issues_count":923,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":8571,"open_issues":923,"watchers":43371,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/atom/atom/pulls/16124"},"html":{"href":"https://github.com/atom/atom/pull/16124"},"issue":{"href":"https://api.github.com/repos/atom/atom/issues/16124"},"comments":{"href":"https://api.github.com/repos/atom/atom/issues/16124/comments"},"review_comments":{"href":"https://api.github.com/repos/atom/atom/pulls/16124/comments"},"review_comment":{"href":"https://api.github.com/repos/atom/atom/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/atom/atom/pulls/16124/commits"},"statuses":{"href":"https://api.github.com/repos/atom/atom/statuses/73d8471b5c94132b67b3116234058dd1d86954bb"}},"author_association":"OWNER","merged":true,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":{"login":"smashwilson","id":17565,"avatar_url":"https://avatars2.githubusercontent.com/u/17565?v=4","gravatar_id":"","url":"https://api.github.com/users/smashwilson","html_url":"https://github.com/smashwilson","followers_url":"https://api.github.com/users/smashwilson/followers","following_url":"https://api.github.com/users/smashwilson/following{/other_user}","gists_url":"https://api.github.com/users/smashwilson/gists{/gist_id}","starred_url":"https://api.github.com/users/smashwilson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smashwilson/subscriptions","organizations_url":"https://api.github.com/users/smashwilson/orgs","repos_url":"https://api.github.com/users/smashwilson/repos","events_url":"https://api.github.com/users/smashwilson/events{/privacy}","received_events_url":"https://api.github.com/users/smashwilson/received_events","type":"User","site_admin":true},"comments":10,"review_comments":0,"maintainer_can_modify":false,"commits":2,"additions":302,"deletions":214,"changed_files":3}}
{"actor":{"display_login":"smashwilson"}}