{"action":"closed","number":149,"pull_request":{"url":"https://api.github.com/repos/opentable/sous/pulls/149","id":83934814,"html_url":"https://github.com/opentable/sous/pull/149","diff_url":"https://github.com/opentable/sous/pull/149.diff","patch_url":"https://github.com/opentable/sous/pull/149.patch","issue_url":"https://api.github.com/repos/opentable/sous/issues/149","number":149,"state":"closed","locked":false,"title":"Flavor implementation.","user":{"login":"samsalisbury","id":111437,"avatar_url":"https://avatars.githubusercontent.com/u/111437?v=3","gravatar_id":"","url":"https://api.github.com/users/samsalisbury","html_url":"https://github.com/samsalisbury","followers_url":"https://api.github.com/users/samsalisbury/followers","following_url":"https://api.github.com/users/samsalisbury/following{/other_user}","gists_url":"https://api.github.com/users/samsalisbury/gists{/gist_id}","starred_url":"https://api.github.com/users/samsalisbury/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samsalisbury/subscriptions","organizations_url":"https://api.github.com/users/samsalisbury/orgs","repos_url":"https://api.github.com/users/samsalisbury/repos","events_url":"https://api.github.com/users/samsalisbury/events{/privacy}","received_events_url":"https://api.github.com/users/samsalisbury/received_events","type":"User","site_admin":false},"body":"Includes #148 \r\n\r\nThis PR implements the concept of \"Flavor\" as part of a manifest's and deployment's ID.\r\n\r\nFlavor is a way to multiply deployments of a single codebase per cluster. The name \"Flavor\" is already in use at OpenTable to describe short strings used for this purpose, so we have kept the name.\r\n\r\nThe original spec we imagined for ManifestID.String was to use a colon to separate the SourceLocation from the Flavor, however this makes for file paths in the GDM that are difficult to work with (colon being the default path list separator on gnu/linux type operating systems). Therefore, the implementation uses tilde `~` to separate the two. This means that tilde is a special character in Sous, and for now will not be usable in repository names. Follow-up PR coming to make sure we validate incoming source locations, tags (versions), and cluster names to ensure none of them make use of tilde or comma, which are both special characters for Sous.\r\n\r\nIt would be possible to use alternative encoding for file paths based on ManifestID, however that would add significant complexity, which we don't need to tackle, at least not yet.\r\n\r\nSimilarly, we originally intended for the comma separator used in SourceIDs to be optional, by specifying an alternative separator at the start of the line. We can still accept this for user input for now, but regardless will validate that source locations and tags do not contain commas or tildes in their particles, to avoid the cost of allowing escape chars. If this becomes a problem later (e.g. we need to support SourceLocations containing commas and tildes), then we can address it by adding escaping at that point. I doubt this will ever become an issue for more than a couple of oddball repositories though.","created_at":"2016-09-04T21:35:45Z","updated_at":"2016-09-06T16:51:58Z","closed_at":"2016-09-06T16:51:58Z","merged_at":"2016-09-06T16:51:58Z","merge_commit_sha":"c473f6b9fcbb9f2decf69dfe6355e03b83137c6d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/opentable/sous/pulls/149/commits","review_comments_url":"https://api.github.com/repos/opentable/sous/pulls/149/comments","review_comment_url":"https://api.github.com/repos/opentable/sous/pulls/comments{/number}","comments_url":"https://api.github.com/repos/opentable/sous/issues/149/comments","statuses_url":"https://api.github.com/repos/opentable/sous/statuses/cffefcc70f5bc822a0742ebaaccef1ec2c2cc9b5","head":{"label":"samsalisbury:flavor-impl","ref":"flavor-impl","sha":"cffefcc70f5bc822a0742ebaaccef1ec2c2cc9b5","user":{"login":"samsalisbury","id":111437,"avatar_url":"https://avatars.githubusercontent.com/u/111437?v=3","gravatar_id":"","url":"https://api.github.com/users/samsalisbury","html_url":"https://github.com/samsalisbury","followers_url":"https://api.github.com/users/samsalisbury/followers","following_url":"https://api.github.com/users/samsalisbury/following{/other_user}","gists_url":"https://api.github.com/users/samsalisbury/gists{/gist_id}","starred_url":"https://api.github.com/users/samsalisbury/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samsalisbury/subscriptions","organizations_url":"https://api.github.com/users/samsalisbury/orgs","repos_url":"https://api.github.com/users/samsalisbury/repos","events_url":"https://api.github.com/users/samsalisbury/events{/privacy}","received_events_url":"https://api.github.com/users/samsalisbury/received_events","type":"User","site_admin":false},"repo":{"id":54999769,"name":"sous","full_name":"samsalisbury/sous","owner":{"login":"samsalisbury","id":111437,"avatar_url":"https://avatars.githubusercontent.com/u/111437?v=3","gravatar_id":"","url":"https://api.github.com/users/samsalisbury","html_url":"https://github.com/samsalisbury","followers_url":"https://api.github.com/users/samsalisbury/followers","following_url":"https://api.github.com/users/samsalisbury/following{/other_user}","gists_url":"https://api.github.com/users/samsalisbury/gists{/gist_id}","starred_url":"https://api.github.com/users/samsalisbury/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samsalisbury/subscriptions","organizations_url":"https://api.github.com/users/samsalisbury/orgs","repos_url":"https://api.github.com/users/samsalisbury/repos","events_url":"https://api.github.com/users/samsalisbury/events{/privacy}","received_events_url":"https://api.github.com/users/samsalisbury/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/samsalisbury/sous","description":"Tools for building, testing, deploying Docker containers","fork":true,"url":"https://api.github.com/repos/samsalisbury/sous","forks_url":"https://api.github.com/repos/samsalisbury/sous/forks","keys_url":"https://api.github.com/repos/samsalisbury/sous/keys{/key_id}","collaborators_url":"https://api.github.com/repos/samsalisbury/sous/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/samsalisbury/sous/teams","hooks_url":"https://api.github.com/repos/samsalisbury/sous/hooks","issue_events_url":"https://api.github.com/repos/samsalisbury/sous/issues/events{/number}","events_url":"https://api.github.com/repos/samsalisbury/sous/events","assignees_url":"https://api.github.com/repos/samsalisbury/sous/assignees{/user}","branches_url":"https://api.github.com/repos/samsalisbury/sous/branches{/branch}","tags_url":"https://api.github.com/repos/samsalisbury/sous/tags","blobs_url":"https://api.github.com/repos/samsalisbury/sous/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/samsalisbury/sous/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/samsalisbury/sous/git/refs{/sha}","trees_url":"https://api.github.com/repos/samsalisbury/sous/git/trees{/sha}","statuses_url":"https://api.github.com/repos/samsalisbury/sous/statuses/{sha}","languages_url":"https://api.github.com/repos/samsalisbury/sous/languages","stargazers_url":"https://api.github.com/repos/samsalisbury/sous/stargazers","contributors_url":"https://api.github.com/repos/samsalisbury/sous/contributors","subscribers_url":"https://api.github.com/repos/samsalisbury/sous/subscribers","subscription_url":"https://api.github.com/repos/samsalisbury/sous/subscription","commits_url":"https://api.github.com/repos/samsalisbury/sous/commits{/sha}","git_commits_url":"https://api.github.com/repos/samsalisbury/sous/git/commits{/sha}","comments_url":"https://api.github.com/repos/samsalisbury/sous/comments{/number}","issue_comment_url":"https://api.github.com/repos/samsalisbury/sous/issues/comments{/number}","contents_url":"https://api.github.com/repos/samsalisbury/sous/contents/{+path}","compare_url":"https://api.github.com/repos/samsalisbury/sous/compare/{base}...{head}","merges_url":"https://api.github.com/repos/samsalisbury/sous/merges","archive_url":"https://api.github.com/repos/samsalisbury/sous/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/samsalisbury/sous/downloads","issues_url":"https://api.github.com/repos/samsalisbury/sous/issues{/number}","pulls_url":"https://api.github.com/repos/samsalisbury/sous/pulls{/number}","milestones_url":"https://api.github.com/repos/samsalisbury/sous/milestones{/number}","notifications_url":"https://api.github.com/repos/samsalisbury/sous/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/samsalisbury/sous/labels{/name}","releases_url":"https://api.github.com/repos/samsalisbury/sous/releases{/id}","deployments_url":"https://api.github.com/repos/samsalisbury/sous/deployments","created_at":"2016-03-29T18:19:12Z","updated_at":"2016-03-29T18:19:13Z","pushed_at":"2016-09-06T16:27:37Z","git_url":"git://github.com/samsalisbury/sous.git","ssh_url":"git@github.com:samsalisbury/sous.git","clone_url":"https://github.com/samsalisbury/sous.git","svn_url":"https://github.com/samsalisbury/sous","homepage":"","size":9356,"stargazers_count":0,"watchers_count":0,"language":"Go","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":"opentable:master","ref":"master","sha":"3c978d729165b047bfb492f2c00eb2c662628d82","user":{"login":"opentable","id":2653541,"avatar_url":"https://avatars.githubusercontent.com/u/2653541?v=3","gravatar_id":"","url":"https://api.github.com/users/opentable","html_url":"https://github.com/opentable","followers_url":"https://api.github.com/users/opentable/followers","following_url":"https://api.github.com/users/opentable/following{/other_user}","gists_url":"https://api.github.com/users/opentable/gists{/gist_id}","starred_url":"https://api.github.com/users/opentable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentable/subscriptions","organizations_url":"https://api.github.com/users/opentable/orgs","repos_url":"https://api.github.com/users/opentable/repos","events_url":"https://api.github.com/users/opentable/events{/privacy}","received_events_url":"https://api.github.com/users/opentable/received_events","type":"Organization","site_admin":false},"repo":{"id":43084873,"name":"sous","full_name":"opentable/sous","owner":{"login":"opentable","id":2653541,"avatar_url":"https://avatars.githubusercontent.com/u/2653541?v=3","gravatar_id":"","url":"https://api.github.com/users/opentable","html_url":"https://github.com/opentable","followers_url":"https://api.github.com/users/opentable/followers","following_url":"https://api.github.com/users/opentable/following{/other_user}","gists_url":"https://api.github.com/users/opentable/gists{/gist_id}","starred_url":"https://api.github.com/users/opentable/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentable/subscriptions","organizations_url":"https://api.github.com/users/opentable/orgs","repos_url":"https://api.github.com/users/opentable/repos","events_url":"https://api.github.com/users/opentable/events{/privacy}","received_events_url":"https://api.github.com/users/opentable/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opentable/sous","description":"Tools for building, testing, deploying Docker containers","fork":false,"url":"https://api.github.com/repos/opentable/sous","forks_url":"https://api.github.com/repos/opentable/sous/forks","keys_url":"https://api.github.com/repos/opentable/sous/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opentable/sous/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opentable/sous/teams","hooks_url":"https://api.github.com/repos/opentable/sous/hooks","issue_events_url":"https://api.github.com/repos/opentable/sous/issues/events{/number}","events_url":"https://api.github.com/repos/opentable/sous/events","assignees_url":"https://api.github.com/repos/opentable/sous/assignees{/user}","branches_url":"https://api.github.com/repos/opentable/sous/branches{/branch}","tags_url":"https://api.github.com/repos/opentable/sous/tags","blobs_url":"https://api.github.com/repos/opentable/sous/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opentable/sous/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opentable/sous/git/refs{/sha}","trees_url":"https://api.github.com/repos/opentable/sous/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opentable/sous/statuses/{sha}","languages_url":"https://api.github.com/repos/opentable/sous/languages","stargazers_url":"https://api.github.com/repos/opentable/sous/stargazers","contributors_url":"https://api.github.com/repos/opentable/sous/contributors","subscribers_url":"https://api.github.com/repos/opentable/sous/subscribers","subscription_url":"https://api.github.com/repos/opentable/sous/subscription","commits_url":"https://api.github.com/repos/opentable/sous/commits{/sha}","git_commits_url":"https://api.github.com/repos/opentable/sous/git/commits{/sha}","comments_url":"https://api.github.com/repos/opentable/sous/comments{/number}","issue_comment_url":"https://api.github.com/repos/opentable/sous/issues/comments{/number}","contents_url":"https://api.github.com/repos/opentable/sous/contents/{+path}","compare_url":"https://api.github.com/repos/opentable/sous/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opentable/sous/merges","archive_url":"https://api.github.com/repos/opentable/sous/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opentable/sous/downloads","issues_url":"https://api.github.com/repos/opentable/sous/issues{/number}","pulls_url":"https://api.github.com/repos/opentable/sous/pulls{/number}","milestones_url":"https://api.github.com/repos/opentable/sous/milestones{/number}","notifications_url":"https://api.github.com/repos/opentable/sous/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opentable/sous/labels{/name}","releases_url":"https://api.github.com/repos/opentable/sous/releases{/id}","deployments_url":"https://api.github.com/repos/opentable/sous/deployments","created_at":"2015-09-24T18:22:46Z","updated_at":"2016-08-23T21:09:16Z","pushed_at":"2016-09-06T16:51:58Z","git_url":"git://github.com/opentable/sous.git","ssh_url":"git@github.com:opentable/sous.git","clone_url":"https://github.com/opentable/sous.git","svn_url":"https://github.com/opentable/sous","homepage":"","size":9277,"stargazers_count":17,"watchers_count":17,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":3,"forks":7,"open_issues":3,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/opentable/sous/pulls/149"},"html":{"href":"https://github.com/opentable/sous/pull/149"},"issue":{"href":"https://api.github.com/repos/opentable/sous/issues/149"},"comments":{"href":"https://api.github.com/repos/opentable/sous/issues/149/comments"},"review_comments":{"href":"https://api.github.com/repos/opentable/sous/pulls/149/comments"},"review_comment":{"href":"https://api.github.com/repos/opentable/sous/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/opentable/sous/pulls/149/commits"},"statuses":{"href":"https://api.github.com/repos/opentable/sous/statuses/cffefcc70f5bc822a0742ebaaccef1ec2c2cc9b5"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"nyarly","id":127548,"avatar_url":"https://avatars.githubusercontent.com/u/127548?v=3","gravatar_id":"","url":"https://api.github.com/users/nyarly","html_url":"https://github.com/nyarly","followers_url":"https://api.github.com/users/nyarly/followers","following_url":"https://api.github.com/users/nyarly/following{/other_user}","gists_url":"https://api.github.com/users/nyarly/gists{/gist_id}","starred_url":"https://api.github.com/users/nyarly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nyarly/subscriptions","organizations_url":"https://api.github.com/users/nyarly/orgs","repos_url":"https://api.github.com/users/nyarly/repos","events_url":"https://api.github.com/users/nyarly/events{/privacy}","received_events_url":"https://api.github.com/users/nyarly/received_events","type":"User","site_admin":false},"comments":2,"review_comments":0,"commits":10,"additions":547,"deletions":134,"changed_files":26}}
{"actor":{"display_login":"nyarly"}}