{"action":"created","issue":{"url":"https://api.github.com/repos/boennemann/semantic-release/issues/7","labels_url":"https://api.github.com/repos/boennemann/semantic-release/issues/7/labels{/name}","comments_url":"https://api.github.com/repos/boennemann/semantic-release/issues/7/comments","events_url":"https://api.github.com/repos/boennemann/semantic-release/issues/7/events","html_url":"https://github.com/boennemann/semantic-release/issues/7","id":57014223,"number":7,"title":"Breaking change detection","user":{"login":"boennemann","id":908178,"avatar_url":"https://avatars.githubusercontent.com/u/908178?v=3","gravatar_id":"","url":"https://api.github.com/users/boennemann","html_url":"https://github.com/boennemann","followers_url":"https://api.github.com/users/boennemann/followers","following_url":"https://api.github.com/users/boennemann/following{/other_user}","gists_url":"https://api.github.com/users/boennemann/gists{/gist_id}","starred_url":"https://api.github.com/users/boennemann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/boennemann/subscriptions","organizations_url":"https://api.github.com/users/boennemann/orgs","repos_url":"https://api.github.com/users/boennemann/repos","events_url":"https://api.github.com/users/boennemann/events{/privacy}","received_events_url":"https://api.github.com/users/boennemann/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":{"login":"boennemann","id":908178,"avatar_url":"https://avatars.githubusercontent.com/u/908178?v=3","gravatar_id":"","url":"https://api.github.com/users/boennemann","html_url":"https://github.com/boennemann","followers_url":"https://api.github.com/users/boennemann/followers","following_url":"https://api.github.com/users/boennemann/following{/other_user}","gists_url":"https://api.github.com/users/boennemann/gists{/gist_id}","starred_url":"https://api.github.com/users/boennemann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/boennemann/subscriptions","organizations_url":"https://api.github.com/users/boennemann/orgs","repos_url":"https://api.github.com/users/boennemann/repos","events_url":"https://api.github.com/users/boennemann/events{/privacy}","received_events_url":"https://api.github.com/users/boennemann/received_events","type":"User","site_admin":false},"milestone":null,"comments":3,"created_at":"2015-02-09T10:42:35Z","updated_at":"2015-02-09T19:09:27Z","closed_at":null,"body":"This an idea that I wanted to build for a long time and with the latest `npm weekly` I have a proof of concept how it could be done: https://gist.github.com/chrisdickinson/ba532fa0e4e243fb7b44\r\n\r\nHere is my rough idea of how this could work:\r\n\r\n0. Assumptions: All test related files lie in a `tests/` subfolder, `npm test` is the test command, latest tag is pulled, dependencies are installed\r\n1. Checkout the `tests` subfolder and `package.json` of the last release\r\n2. Install only the `devDependencies` of the last release\r\n3. Execute `npm test`; if it fails it's a breaking change\r\n\r\nThis could be executed in the prepublish step. Another idea would be to only execute this when a release is due, but no `breaking change` has been marked. If it fails this doesn't automatically release a new major version, but it fails and tells the user to rewrite the commit messages to correctly mark the breaking change including migration instructions."},"comment":{"url":"https://api.github.com/repos/boennemann/semantic-release/issues/comments/73569534","html_url":"https://github.com/boennemann/semantic-release/issues/7#issuecomment-73569534","issue_url":"https://api.github.com/repos/boennemann/semantic-release/issues/7","id":73569534,"user":{"login":"boennemann","id":908178,"avatar_url":"https://avatars.githubusercontent.com/u/908178?v=3","gravatar_id":"","url":"https://api.github.com/users/boennemann","html_url":"https://github.com/boennemann","followers_url":"https://api.github.com/users/boennemann/followers","following_url":"https://api.github.com/users/boennemann/following{/other_user}","gists_url":"https://api.github.com/users/boennemann/gists{/gist_id}","starred_url":"https://api.github.com/users/boennemann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/boennemann/subscriptions","organizations_url":"https://api.github.com/users/boennemann/orgs","repos_url":"https://api.github.com/users/boennemann/repos","events_url":"https://api.github.com/users/boennemann/events{/privacy}","received_events_url":"https://api.github.com/users/boennemann/received_events","type":"User","site_admin":false},"created_at":"2015-02-09T19:09:27Z","updated_at":"2015-02-09T19:09:27Z","body":"@bcherny Thank you very much for this comment!\r\n\r\nFalse negatives:\r\nI was thinking about this stuff and what it comes down to is that whenever this method fails your test setup isn't optimal. I know that this happens a lot, but I'm not trying to fix these testing problems, but I'm trying to achieve automation for software releases that is better, or at least on par, with what the human would decide. I doubt you would recognize these breaking changes by hand, if your tests are that insufficient.\r\nThe way to make the automation better is to stick to best practices and that's a pretty cool thing actually.\r\n\r\nFalse positives:\r\nSame as above: in your example the tests are the problem. There are probably some scenarios where false positives would still be reported. We should add an option to pass the \"breaking change detection\" for these cases.\r\n\r\nI had a brief look at india, and I really like this as well. I would be more than happy if we could build both strategies, or even a combination into this.\r\n\r\nAlso I should probably make the `breaking-change` detection its own module."}}