{"action":"created","comment":{"url":"https://api.github.com/repos/operable/cog/pulls/comments/81346807","pull_request_review_id":2333867,"id":81346807,"diff_hunk":"@@ -631,6 +631,40 @@ defmodule Cog.Repository.Bundles do\n     |> preload\n   end\n \n+  defp update_version!(version, params) do\n+    params = Map.merge(params, Map.take(params[\"config_file\"], [\"author\", \"homepage\"]))\n+\n+    version\n+    |> BundleVersion.changeset(params)\n+    |> Repo.update!\n+    |> preload\n+  end\n+\n+  defp new_or_updated_version!(bundle, params) do\n+    # Check for an old version\n+    version = params[\"config_file\"][\"version\"]\n+    result =\n+      Repo.one(from bv in BundleVersion,\n+               where: bv.bundle_id == ^bundle.id,\n+               where: bv.version == ^version)\n+\n+    case result do\n+      nil ->\n+        # Create a new version if there isn't one\n+        new_version!(bundle, params)\n+      old_version ->\n+        # If there is a version update it and then delete any commands and\n+        # templates associated with it.\n+        new_version = update_version!(old_version, params)\n+        |> Repo.preload(:templates)\n+\n+        Enum.each(new_version.commands, &Repo.delete!/1)\n+        Enum.each(new_version.templates, &Repo.delete!/1)","path":"lib/cog/repository/bundles.ex","position":32,"original_position":32,"commit_id":"5469e698cfe7b315483d5d2b2f6ce0bf20f0accd","original_commit_id":"5469e698cfe7b315483d5d2b2f6ce0bf20f0accd","user":{"login":"mpeck","id":47858,"avatar_url":"https://avatars.githubusercontent.com/u/47858?v=3","gravatar_id":"","url":"https://api.github.com/users/mpeck","html_url":"https://github.com/mpeck","followers_url":"https://api.github.com/users/mpeck/followers","following_url":"https://api.github.com/users/mpeck/following{/other_user}","gists_url":"https://api.github.com/users/mpeck/gists{/gist_id}","starred_url":"https://api.github.com/users/mpeck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpeck/subscriptions","organizations_url":"https://api.github.com/users/mpeck/orgs","repos_url":"https://api.github.com/users/mpeck/repos","events_url":"https://api.github.com/users/mpeck/events{/privacy}","received_events_url":"https://api.github.com/users/mpeck/received_events","type":"User","site_admin":false},"body":"The old commands and templates are removed here and they are reinstalled later in the transaction. We could go through and update all of the associations instead of just reinstalling, but that is a lot more logic and seemed more likely to introduce bugs. With this method bundle installation continues just as it did normally with the exception that we reference the old bundle version instead of a newly created one.","created_at":"2016-09-30T14:15:38Z","updated_at":"2016-09-30T14:15:39Z","html_url":"https://github.com/operable/cog/pull/1006#discussion_r81346807","pull_request_url":"https://api.github.com/repos/operable/cog/pulls/1006","_links":{"self":{"href":"https://api.github.com/repos/operable/cog/pulls/comments/81346807"},"html":{"href":"https://github.com/operable/cog/pull/1006#discussion_r81346807"},"pull_request":{"href":"https://api.github.com/repos/operable/cog/pulls/1006"}}},"pull_request":{"url":"https://api.github.com/repos/operable/cog/pulls/1006","id":87394766,"html_url":"https://github.com/operable/cog/pull/1006","diff_url":"https://github.com/operable/cog/pull/1006.diff","patch_url":"https://github.com/operable/cog/pull/1006.patch","issue_url":"https://api.github.com/repos/operable/cog/issues/1006","number":1006,"state":"open","locked":false,"title":"update bundles in place when in dev mode","user":{"login":"mpeck","id":47858,"avatar_url":"https://avatars.githubusercontent.com/u/47858?v=3","gravatar_id":"","url":"https://api.github.com/users/mpeck","html_url":"https://github.com/mpeck","followers_url":"https://api.github.com/users/mpeck/followers","following_url":"https://api.github.com/users/mpeck/following{/other_user}","gists_url":"https://api.github.com/users/mpeck/gists{/gist_id}","starred_url":"https://api.github.com/users/mpeck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpeck/subscriptions","organizations_url":"https://api.github.com/users/mpeck/orgs","repos_url":"https://api.github.com/users/mpeck/repos","events_url":"https://api.github.com/users/mpeck/events{/privacy}","received_events_url":"https://api.github.com/users/mpeck/received_events","type":"User","site_admin":false},"body":"Was having a hard time explaining what I was thinking so I thought I would just do it. This adds an extra config that causes bundle installation to overwrite the existing version if it already exists.\r\n\r\nresolves #969 ","created_at":"2016-09-29T21:10:48Z","updated_at":"2016-09-30T14:15:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"396a74761bdc4e70d0f1392328156bed9b070f9b","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/operable/cog/pulls/1006/commits","review_comments_url":"https://api.github.com/repos/operable/cog/pulls/1006/comments","review_comment_url":"https://api.github.com/repos/operable/cog/pulls/comments{/number}","comments_url":"https://api.github.com/repos/operable/cog/issues/1006/comments","statuses_url":"https://api.github.com/repos/operable/cog/statuses/5469e698cfe7b315483d5d2b2f6ce0bf20f0accd","head":{"label":"operable:peck/update-config","ref":"peck/update-config","sha":"5469e698cfe7b315483d5d2b2f6ce0bf20f0accd","user":{"login":"operable","id":6070463,"avatar_url":"https://avatars.githubusercontent.com/u/6070463?v=3","gravatar_id":"","url":"https://api.github.com/users/operable","html_url":"https://github.com/operable","followers_url":"https://api.github.com/users/operable/followers","following_url":"https://api.github.com/users/operable/following{/other_user}","gists_url":"https://api.github.com/users/operable/gists{/gist_id}","starred_url":"https://api.github.com/users/operable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/operable/subscriptions","organizations_url":"https://api.github.com/users/operable/orgs","repos_url":"https://api.github.com/users/operable/repos","events_url":"https://api.github.com/users/operable/events{/privacy}","received_events_url":"https://api.github.com/users/operable/received_events","type":"Organization","site_admin":false},"repo":{"id":49292670,"name":"cog","full_name":"operable/cog","owner":{"login":"operable","id":6070463,"avatar_url":"https://avatars.githubusercontent.com/u/6070463?v=3","gravatar_id":"","url":"https://api.github.com/users/operable","html_url":"https://github.com/operable","followers_url":"https://api.github.com/users/operable/followers","following_url":"https://api.github.com/users/operable/following{/other_user}","gists_url":"https://api.github.com/users/operable/gists{/gist_id}","starred_url":"https://api.github.com/users/operable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/operable/subscriptions","organizations_url":"https://api.github.com/users/operable/orgs","repos_url":"https://api.github.com/users/operable/repos","events_url":"https://api.github.com/users/operable/events{/privacy}","received_events_url":"https://api.github.com/users/operable/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/operable/cog","description":"Bringing the power of the command line to chat","fork":false,"url":"https://api.github.com/repos/operable/cog","forks_url":"https://api.github.com/repos/operable/cog/forks","keys_url":"https://api.github.com/repos/operable/cog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/operable/cog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/operable/cog/teams","hooks_url":"https://api.github.com/repos/operable/cog/hooks","issue_events_url":"https://api.github.com/repos/operable/cog/issues/events{/number}","events_url":"https://api.github.com/repos/operable/cog/events","assignees_url":"https://api.github.com/repos/operable/cog/assignees{/user}","branches_url":"https://api.github.com/repos/operable/cog/branches{/branch}","tags_url":"https://api.github.com/repos/operable/cog/tags","blobs_url":"https://api.github.com/repos/operable/cog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/operable/cog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/operable/cog/git/refs{/sha}","trees_url":"https://api.github.com/repos/operable/cog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/operable/cog/statuses/{sha}","languages_url":"https://api.github.com/repos/operable/cog/languages","stargazers_url":"https://api.github.com/repos/operable/cog/stargazers","contributors_url":"https://api.github.com/repos/operable/cog/contributors","subscribers_url":"https://api.github.com/repos/operable/cog/subscribers","subscription_url":"https://api.github.com/repos/operable/cog/subscription","commits_url":"https://api.github.com/repos/operable/cog/commits{/sha}","git_commits_url":"https://api.github.com/repos/operable/cog/git/commits{/sha}","comments_url":"https://api.github.com/repos/operable/cog/comments{/number}","issue_comment_url":"https://api.github.com/repos/operable/cog/issues/comments{/number}","contents_url":"https://api.github.com/repos/operable/cog/contents/{+path}","compare_url":"https://api.github.com/repos/operable/cog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/operable/cog/merges","archive_url":"https://api.github.com/repos/operable/cog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/operable/cog/downloads","issues_url":"https://api.github.com/repos/operable/cog/issues{/number}","pulls_url":"https://api.github.com/repos/operable/cog/pulls{/number}","milestones_url":"https://api.github.com/repos/operable/cog/milestones{/number}","notifications_url":"https://api.github.com/repos/operable/cog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/operable/cog/labels{/name}","releases_url":"https://api.github.com/repos/operable/cog/releases{/id}","deployments_url":"https://api.github.com/repos/operable/cog/deployments","created_at":"2016-01-08T19:45:06Z","updated_at":"2016-09-29T09:25:51Z","pushed_at":"2016-09-30T13:43:32Z","git_url":"git://github.com/operable/cog.git","ssh_url":"git@github.com:operable/cog.git","clone_url":"https://github.com/operable/cog.git","svn_url":"https://github.com/operable/cog","homepage":"http://operable.io","size":2775,"stargazers_count":505,"watchers_count":505,"language":"Elixir","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"open_issues_count":121,"forks":33,"open_issues":121,"watchers":505,"default_branch":"master"}},"base":{"label":"operable:master","ref":"master","sha":"6f2c38aea2d34e7fd9d908d7970f5ffc693c34ad","user":{"login":"operable","id":6070463,"avatar_url":"https://avatars.githubusercontent.com/u/6070463?v=3","gravatar_id":"","url":"https://api.github.com/users/operable","html_url":"https://github.com/operable","followers_url":"https://api.github.com/users/operable/followers","following_url":"https://api.github.com/users/operable/following{/other_user}","gists_url":"https://api.github.com/users/operable/gists{/gist_id}","starred_url":"https://api.github.com/users/operable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/operable/subscriptions","organizations_url":"https://api.github.com/users/operable/orgs","repos_url":"https://api.github.com/users/operable/repos","events_url":"https://api.github.com/users/operable/events{/privacy}","received_events_url":"https://api.github.com/users/operable/received_events","type":"Organization","site_admin":false},"repo":{"id":49292670,"name":"cog","full_name":"operable/cog","owner":{"login":"operable","id":6070463,"avatar_url":"https://avatars.githubusercontent.com/u/6070463?v=3","gravatar_id":"","url":"https://api.github.com/users/operable","html_url":"https://github.com/operable","followers_url":"https://api.github.com/users/operable/followers","following_url":"https://api.github.com/users/operable/following{/other_user}","gists_url":"https://api.github.com/users/operable/gists{/gist_id}","starred_url":"https://api.github.com/users/operable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/operable/subscriptions","organizations_url":"https://api.github.com/users/operable/orgs","repos_url":"https://api.github.com/users/operable/repos","events_url":"https://api.github.com/users/operable/events{/privacy}","received_events_url":"https://api.github.com/users/operable/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/operable/cog","description":"Bringing the power of the command line to chat","fork":false,"url":"https://api.github.com/repos/operable/cog","forks_url":"https://api.github.com/repos/operable/cog/forks","keys_url":"https://api.github.com/repos/operable/cog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/operable/cog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/operable/cog/teams","hooks_url":"https://api.github.com/repos/operable/cog/hooks","issue_events_url":"https://api.github.com/repos/operable/cog/issues/events{/number}","events_url":"https://api.github.com/repos/operable/cog/events","assignees_url":"https://api.github.com/repos/operable/cog/assignees{/user}","branches_url":"https://api.github.com/repos/operable/cog/branches{/branch}","tags_url":"https://api.github.com/repos/operable/cog/tags","blobs_url":"https://api.github.com/repos/operable/cog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/operable/cog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/operable/cog/git/refs{/sha}","trees_url":"https://api.github.com/repos/operable/cog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/operable/cog/statuses/{sha}","languages_url":"https://api.github.com/repos/operable/cog/languages","stargazers_url":"https://api.github.com/repos/operable/cog/stargazers","contributors_url":"https://api.github.com/repos/operable/cog/contributors","subscribers_url":"https://api.github.com/repos/operable/cog/subscribers","subscription_url":"https://api.github.com/repos/operable/cog/subscription","commits_url":"https://api.github.com/repos/operable/cog/commits{/sha}","git_commits_url":"https://api.github.com/repos/operable/cog/git/commits{/sha}","comments_url":"https://api.github.com/repos/operable/cog/comments{/number}","issue_comment_url":"https://api.github.com/repos/operable/cog/issues/comments{/number}","contents_url":"https://api.github.com/repos/operable/cog/contents/{+path}","compare_url":"https://api.github.com/repos/operable/cog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/operable/cog/merges","archive_url":"https://api.github.com/repos/operable/cog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/operable/cog/downloads","issues_url":"https://api.github.com/repos/operable/cog/issues{/number}","pulls_url":"https://api.github.com/repos/operable/cog/pulls{/number}","milestones_url":"https://api.github.com/repos/operable/cog/milestones{/number}","notifications_url":"https://api.github.com/repos/operable/cog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/operable/cog/labels{/name}","releases_url":"https://api.github.com/repos/operable/cog/releases{/id}","deployments_url":"https://api.github.com/repos/operable/cog/deployments","created_at":"2016-01-08T19:45:06Z","updated_at":"2016-09-29T09:25:51Z","pushed_at":"2016-09-30T13:43:32Z","git_url":"git://github.com/operable/cog.git","ssh_url":"git@github.com:operable/cog.git","clone_url":"https://github.com/operable/cog.git","svn_url":"https://github.com/operable/cog","homepage":"http://operable.io","size":2775,"stargazers_count":505,"watchers_count":505,"language":"Elixir","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"open_issues_count":121,"forks":33,"open_issues":121,"watchers":505,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/operable/cog/pulls/1006"},"html":{"href":"https://github.com/operable/cog/pull/1006"},"issue":{"href":"https://api.github.com/repos/operable/cog/issues/1006"},"comments":{"href":"https://api.github.com/repos/operable/cog/issues/1006/comments"},"review_comments":{"href":"https://api.github.com/repos/operable/cog/pulls/1006/comments"},"review_comment":{"href":"https://api.github.com/repos/operable/cog/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/operable/cog/pulls/1006/commits"},"statuses":{"href":"https://api.github.com/repos/operable/cog/statuses/5469e698cfe7b315483d5d2b2f6ce0bf20f0accd"}}}}
{"actor":{"display_login":"mpeck"}}