{"action":"created","comment":{"url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/comments/133684033","pull_request_review_id":56892514,"id":133684033,"diff_hunk":"@@ -0,0 +1,871 @@\n+/*\n+Copyright 2017 Resin.io\n+\n+Licensed under the Apache License, Version 2.0 (the \"License\");\n+you may not use this file except in compliance with the License.\n+You may obtain a copy of the License at\n+\n+   http://www.apache.org/licenses/LICENSE-2.0\n+\n+Unless required by applicable law or agreed to in writing, software\n+distributed under the License is distributed on an \"AS IS\" BASIS,\n+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+See the License for the specific language governing permissions and\n+limitations under the License.\n+*/\n+import * as Promise from 'bluebird';\n+import { Front, TopicConversations } from 'front-sdk';\n+import * as GithubApi from 'github';\n+import * as yaml from 'js-yaml';\n+import * as _ from 'lodash';\n+import * as GithubApiTypes from '../apis/githubapi-types';\n+import { ProcBot } from '../framework/procbot';\n+import { FrontHandle } from '../services/front-types';\n+import { GithubHandle, GithubLogin, GithubRegistration } from '../services/github-types';\n+import { ServiceEvent, ServiceType } from '../services/service-types';\n+import { AlertLevel, LogLevel } from '../utils/logger';\n+\n+/** Interface to hold details on owner and name of a repository. */\n+interface RepoDetails {\n+\t/** Owner of the repository. */\n+\towner: string;\n+\t/** Name of the repository. */\n+\trepo: string;\n+}\n+\n+/** Contains all the information for a component deployment in an environment. */\n+interface DeployedPR {\n+\t/** Name of the environment (the name of the environment repository). */\n+\tenvironment: string;\n+\t/** The full name (owner/name) of the component's respository. */\n+\trepo: string;\n+\t/** Version of the component the PR was deployed in. */\n+\tversion: string;\n+\t/** Version of the component being deployed. */\n+\tdeployedVersion: string;\n+\t/** All of the PRs associated with the deployed component version. */\n+\tprs: string[];\n+\t/** Whether the deployed component version is being incremented or decremented. */\n+\tincrementing: boolean;\n+}\n+\n+/** Holds data for retrieving a version of a specific file based on its hash. */\n+interface HashedFileRequest {\n+\t/** Full intra-repository path of the file to retrieve. */\n+\tfilepath: string;\n+\t/** Hash of the file to retrieve. */\n+\thash: string;\n+\t/** Owner of the repository the file exists in. */\n+\towner: string;\n+\t/** Name of the repository the file exists in. */\n+\trepo: string;\n+}\n+\n+/** Error object for passing to notification method. */\n+interface NotifyBotError {\n+\t/** A brief overview of the error. */\n+\tbrief: string;\n+\t/** A full error message. */\n+\tmessage: string;\n+\t/** Owner of the repository that originated the message. */\n+\towner: string;\n+\t/** Name of the respository that originated the message. */\n+\trepo: string;\n+\t/** Component version. */\n+\tversion: string;\n+}\n+\n+/** Interface for storing the PRs for each version of a component. */\n+interface VersionPRTracker {\n+\t[version: string]: string[];\n+}\n+\n+/** Tracks a component from the keyframe file. */\n+interface ComponentTracker {\n+\t/** Name of the component. */\n+\tname: string;\n+\t/** Old version (if any) of the component from previous iteration of keyframe file. */\n+\toldVersion: string | null;\n+\t/** New version of component from current iteration of keyframe file. */\n+\tnewVersion: string;\n+\t/** Full repository name of the component. */\n+\trepo: string;\n+\t/** Whether the version is incrementing or decrementing. */\n+\tincrementing: boolean;\n+\t/** All the PRs for each version of the component.  */\n+\tversions?: VersionPRTracker;\n+}\n+\n+/** Configuration interface for initialising NotifyBot. */\n+export interface NotifyBotConfig {\n+\t/** The name of the bot. */\n+\tbotName: string;\n+\t/** The Github App ID to use. */\n+\tgithubApp: string;\n+\t/** The PEM for communicating with Github. */\n+\tgithubPEM: string;\n+\t/** The secret webhook key for validating messages from Github. */\n+\tgithubSecret: string;\n+\t/** The API key for communicating with Front. */\n+\tfrontApiKey: string;\n+\t/** The username to use in Front comments (this should be a unique username for NotifyBot use). */\n+\tfrontUser: string;\n+}\n+\n+/** Stores Front topic information relating to component issues for a PR. */\n+interface TopicIssues {\n+\t/** A full description of each issue along with their location in the component repository. */\n+\trelatedIssues: string[];\n+\t/** The Front topic IDs that should be commented on for these issues. */\n+\ttopics: string[];\n+}\n+\n+/** The port that Github attempts to send events on. */\n+const NotifyBotPort = 8399; // Not a listed registered port\n+\n+/**\n+ * The RegExp to use to determine if a PR/Issue is connected to another. See the following links:\n+ *   * https://help.github.com/articles/closing-issues-via-commit-messages/\n+ *   * https://help.waffle.io/faq/waffle-workflow/use-waffles-connect-keyword-to-connect-prs-to-issues\n+ */\n+const IssueRefRE = new RegExp('(?:close[sd]?:?|fix(?:e[sd]{1})?:?|resolve[sd]?:?|' +\n+\t'connect(?:s|ed)?[\\\\s]+(?:to)?|connects-to?:?)[\\\\s]+(#[0-9]+)', 'i');\n+/** The RegExp used to determine if an HQ issue is linked to from a component issue. */\n+const HqRE = /hq:[\\s]+https:\\/\\/github.com\\/resin-io\\/hq\\/issues\\/([0-9]+)/i;\n+\n+/** Name of the keyframe file to search for in an environment repository. */\n+const KeyframeFile = 'keyframe.yml';\n+/** Name of the changelog file in every component repository to scan for versions. */\n+const ChangelogFile = 'CHANGELOG.md';\n+/** The virgin reference from a push, denotes that we should not work on the keyframe.  */\n+const VirginRef = '0000000000000000000000000000000000000000';\n+/** Owner of the HQ repository. */\n+const HqOwner = 'resin-io';\n+/** The HQ repository name. */\n+const HqRepo = 'hq';\n+\n+/**\n+ * NotifyBot tracks the deployment of component versions to an environment, by comparing a pushed keyframe\n+ * file with its previous iteration in the environment's repository. For every component whose version has\n+ * altered, it gathers the PRs that were merged between the versions, and then comments on those PRs.\n+ *\n+ * Should a component's version have *incremented* in a keyframe update, then:\n+ *   * Every PR which has now been deployed with this version is commented upon, informing the author that\n+ *     the PR is now live on the specific environment the keyframe was modified in.\n+ *   * For every issue linked to that PR, and for any Front conversations that have been tagged in those\n+ *     issues, a comment is made on the Front conversation that allows an agent to report to customers that\n+ *     the issue/feature is now live on the specific environment.\n+ *     HQ issues are followed, if they have been embedded in an PR's Issue, allowing Front conversations\n+ *     that occur in those HQ Issues to also be commented upon.\n+ *\n+ * Should a component's version have *decremented* in a keyframe update, then:\n+ *   * Every PR which has now been regressed with this version is commented upon, informing the author that\n+ *     the PR has now been removed on the specific environment the keyframe was modified in.\n+ *   * For every issue linked to that PR, and for any Front conversations that have been tagged in those\n+ *     issues, a comment is made on the Front conversation that allows an agent to report to customers that\n+ *     the issue/feature is has been removed from the specific environment.\n+ *     HQ issues are followed, if they have been embedded in an PR's Issue, allowing Front conversations\n+ *     that occur in those HQ Issues to also be commented upon.\n+ */\n+export class NotifyBot extends ProcBot {\n+\t/** Github ServiceListener name. */\n+\tprivate githubListenerName: string;\n+\t/** Github ServiceEmitter name. */\n+\tprivate githubEmitterName: string;\n+\t/** Front ServiceEmitter name. */\n+\tprivate frontEmitterName: string;\n+\t/** Front user to use when commenting on Front conversations. */\n+\tprivate frontUser: string;\n+\t/** Front API key for access to a specific Front service. */\n+\tprivate frontApiKey: string;\n+\t/** Instance of the Front API retrieved from the Front ServiceEmitter. */\n+\tprivate frontApi: Front;\n+\t/** Instance of the Github API retrieved from the Github ServiceEmitter. */\n+\tprivate githubApi: GithubApi;\n+\n+\t/**\n+\t * Constructor.\n+\t *\n+\t * @param config  Configuration object for initialising the bot.\n+\t */\n+\tconstructor(config: NotifyBotConfig) {\n+\t\tsuper(config.botName);\n+\n+\t\t// Create a new listener for Github with the right Integration ID.\n+\t\tconst ghListener = this.addServiceListener('github', {\n+\t\t\tclient: config.botName,\n+\t\t\tauthentication: {\n+\t\t\t\tappId: config.githubApp,\n+\t\t\t\tpem: config.githubPEM,\n+\t\t\t\ttype: GithubLogin.App\n+\t\t\t},\n+\t\t\tpath: '/notifyhooks',","path":"lib/bots/notifybot.ts","position":202,"original_position":202,"commit_id":"1848dc51ad670d18f7bf1cd43120656fecfc417b","original_commit_id":"1848dc51ad670d18f7bf1cd43120656fecfc417b","user":{"login":"hedss","id":8259026,"avatar_url":"https://avatars0.githubusercontent.com/u/8259026?v=4","gravatar_id":"","url":"https://api.github.com/users/hedss","html_url":"https://github.com/hedss","followers_url":"https://api.github.com/users/hedss/followers","following_url":"https://api.github.com/users/hedss/following{/other_user}","gists_url":"https://api.github.com/users/hedss/gists{/gist_id}","starred_url":"https://api.github.com/users/hedss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hedss/subscriptions","organizations_url":"https://api.github.com/users/hedss/orgs","repos_url":"https://api.github.com/users/hedss/repos","events_url":"https://api.github.com/users/hedss/events{/privacy}","received_events_url":"https://api.github.com/users/hedss/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2017-08-17T11:11:47Z","updated_at":"2017-08-17T11:11:47Z","html_url":"https://github.com/resin-io-modules/resin-procbots/pull/243#discussion_r133684033","pull_request_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243","_links":{"self":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/comments/133684033"},"html":{"href":"https://github.com/resin-io-modules/resin-procbots/pull/243#discussion_r133684033"},"pull_request":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243"}}},"pull_request":{"url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243","id":135179691,"html_url":"https://github.com/resin-io-modules/resin-procbots/pull/243","diff_url":"https://github.com/resin-io-modules/resin-procbots/pull/243.diff","patch_url":"https://github.com/resin-io-modules/resin-procbots/pull/243.patch","issue_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/243","number":243,"state":"open","locked":false,"title":"NotifyBot: Implement NotifyBot, a bot for tracking PR issues and commenting on them come deployment","user":{"login":"hedss","id":8259026,"avatar_url":"https://avatars0.githubusercontent.com/u/8259026?v=4","gravatar_id":"","url":"https://api.github.com/users/hedss","html_url":"https://github.com/hedss","followers_url":"https://api.github.com/users/hedss/followers","following_url":"https://api.github.com/users/hedss/following{/other_user}","gists_url":"https://api.github.com/users/hedss/gists{/gist_id}","starred_url":"https://api.github.com/users/hedss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hedss/subscriptions","organizations_url":"https://api.github.com/users/hedss/orgs","repos_url":"https://api.github.com/users/hedss/repos","events_url":"https://api.github.com/users/hedss/events{/privacy}","received_events_url":"https://api.github.com/users/hedss/received_events","type":"User","site_admin":false},"body":"* Triggered on commit of Keyframe change to a relevant repo, diffs previous Keyframe to find versions\r\n* Altered versions of a component are tracked, and PRs for all changed versions are followed\r\n* For every PR, connected issues are tracked, as well as linked HQ issues, and any Front conversation for the issue is gathered\r\n* For every PR, a comment is made addressing the author, informing them of the version deployed that the PR is in\r\n* For every Front topic found in an issue (or associated HQ issue), post a comment on all Front conversations that the feature is deployed\r\n\r\nThis includes work that is being carried out for refactoring the MessengerService, as such the\r\n`front-types.d.ts`, `front.ts`, `service-utilities-types.d.ts` and `service-utilities.ts` are\r\nfunctional, but not documented fully because this will go in a separate PR.\r\n\r\nConnects-to: #70\r\n\r\nChange-Type: minor\n---- Autogenerated Waffleboard Connection: Connects to #70","created_at":"2017-08-10T17:26:47Z","updated_at":"2017-08-17T11:11:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"06314f514d9e337da902c436619e823f7fba5975","assignee":null,"assignees":[],"requested_reviewers":[{"login":"brownjohnf","id":1001049,"avatar_url":"https://avatars2.githubusercontent.com/u/1001049?v=4","gravatar_id":"","url":"https://api.github.com/users/brownjohnf","html_url":"https://github.com/brownjohnf","followers_url":"https://api.github.com/users/brownjohnf/followers","following_url":"https://api.github.com/users/brownjohnf/following{/other_user}","gists_url":"https://api.github.com/users/brownjohnf/gists{/gist_id}","starred_url":"https://api.github.com/users/brownjohnf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brownjohnf/subscriptions","organizations_url":"https://api.github.com/users/brownjohnf/orgs","repos_url":"https://api.github.com/users/brownjohnf/repos","events_url":"https://api.github.com/users/brownjohnf/events{/privacy}","received_events_url":"https://api.github.com/users/brownjohnf/received_events","type":"User","site_admin":false},{"login":"pimterry","id":1526883,"avatar_url":"https://avatars0.githubusercontent.com/u/1526883?v=4","gravatar_id":"","url":"https://api.github.com/users/pimterry","html_url":"https://github.com/pimterry","followers_url":"https://api.github.com/users/pimterry/followers","following_url":"https://api.github.com/users/pimterry/following{/other_user}","gists_url":"https://api.github.com/users/pimterry/gists{/gist_id}","starred_url":"https://api.github.com/users/pimterry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pimterry/subscriptions","organizations_url":"https://api.github.com/users/pimterry/orgs","repos_url":"https://api.github.com/users/pimterry/repos","events_url":"https://api.github.com/users/pimterry/events{/privacy}","received_events_url":"https://api.github.com/users/pimterry/received_events","type":"User","site_admin":false},{"login":"lekkas","id":5211478,"avatar_url":"https://avatars3.githubusercontent.com/u/5211478?v=4","gravatar_id":"","url":"https://api.github.com/users/lekkas","html_url":"https://github.com/lekkas","followers_url":"https://api.github.com/users/lekkas/followers","following_url":"https://api.github.com/users/lekkas/following{/other_user}","gists_url":"https://api.github.com/users/lekkas/gists{/gist_id}","starred_url":"https://api.github.com/users/lekkas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lekkas/subscriptions","organizations_url":"https://api.github.com/users/lekkas/orgs","repos_url":"https://api.github.com/users/lekkas/repos","events_url":"https://api.github.com/users/lekkas/events{/privacy}","received_events_url":"https://api.github.com/users/lekkas/received_events","type":"User","site_admin":false},{"login":"sqweelygig","id":20857369,"avatar_url":"https://avatars0.githubusercontent.com/u/20857369?v=4","gravatar_id":"","url":"https://api.github.com/users/sqweelygig","html_url":"https://github.com/sqweelygig","followers_url":"https://api.github.com/users/sqweelygig/followers","following_url":"https://api.github.com/users/sqweelygig/following{/other_user}","gists_url":"https://api.github.com/users/sqweelygig/gists{/gist_id}","starred_url":"https://api.github.com/users/sqweelygig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sqweelygig/subscriptions","organizations_url":"https://api.github.com/users/sqweelygig/orgs","repos_url":"https://api.github.com/users/sqweelygig/repos","events_url":"https://api.github.com/users/sqweelygig/events{/privacy}","received_events_url":"https://api.github.com/users/sqweelygig/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243/commits","review_comments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243/comments","review_comment_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/comments{/number}","comments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/243/comments","statuses_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/statuses/1848dc51ad670d18f7bf1cd43120656fecfc417b","head":{"label":"resin-io-modules:70-notifybot","ref":"70-notifybot","sha":"1848dc51ad670d18f7bf1cd43120656fecfc417b","user":{"login":"resin-io-modules","id":17724750,"avatar_url":"https://avatars0.githubusercontent.com/u/17724750?v=4","gravatar_id":"","url":"https://api.github.com/users/resin-io-modules","html_url":"https://github.com/resin-io-modules","followers_url":"https://api.github.com/users/resin-io-modules/followers","following_url":"https://api.github.com/users/resin-io-modules/following{/other_user}","gists_url":"https://api.github.com/users/resin-io-modules/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io-modules/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io-modules/subscriptions","organizations_url":"https://api.github.com/users/resin-io-modules/orgs","repos_url":"https://api.github.com/users/resin-io-modules/repos","events_url":"https://api.github.com/users/resin-io-modules/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io-modules/received_events","type":"Organization","site_admin":false},"repo":{"id":76547744,"name":"resin-procbots","full_name":"resin-io-modules/resin-procbots","owner":{"login":"resin-io-modules","id":17724750,"avatar_url":"https://avatars0.githubusercontent.com/u/17724750?v=4","gravatar_id":"","url":"https://api.github.com/users/resin-io-modules","html_url":"https://github.com/resin-io-modules","followers_url":"https://api.github.com/users/resin-io-modules/followers","following_url":"https://api.github.com/users/resin-io-modules/following{/other_user}","gists_url":"https://api.github.com/users/resin-io-modules/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io-modules/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io-modules/subscriptions","organizations_url":"https://api.github.com/users/resin-io-modules/orgs","repos_url":"https://api.github.com/users/resin-io-modules/repos","events_url":"https://api.github.com/users/resin-io-modules/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io-modules/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/resin-io-modules/resin-procbots","description":"Process bots used for automating the development and deployment CI pipeline","fork":false,"url":"https://api.github.com/repos/resin-io-modules/resin-procbots","forks_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/forks","keys_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/keys{/key_id}","collaborators_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/teams","hooks_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/hooks","issue_events_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/events{/number}","events_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/events","assignees_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/assignees{/user}","branches_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/branches{/branch}","tags_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/tags","blobs_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/refs{/sha}","trees_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/trees{/sha}","statuses_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/statuses/{sha}","languages_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/languages","stargazers_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/stargazers","contributors_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/contributors","subscribers_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/subscribers","subscription_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/subscription","commits_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/commits{/sha}","git_commits_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/commits{/sha}","comments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/comments{/number}","issue_comment_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/comments{/number}","contents_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/contents/{+path}","compare_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/compare/{base}...{head}","merges_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/merges","archive_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/downloads","issues_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues{/number}","pulls_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls{/number}","milestones_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/milestones{/number}","notifications_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/labels{/name}","releases_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/releases{/id}","deployments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/deployments","created_at":"2016-12-15T09:58:14Z","updated_at":"2017-08-10T14:23:54Z","pushed_at":"2017-08-11T17:30:24Z","git_url":"git://github.com/resin-io-modules/resin-procbots.git","ssh_url":"git@github.com:resin-io-modules/resin-procbots.git","clone_url":"https://github.com/resin-io-modules/resin-procbots.git","svn_url":"https://github.com/resin-io-modules/resin-procbots","homepage":"https://resin-io-modules.github.io/resin-procbots","size":3591,"stargazers_count":2,"watchers_count":2,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":77,"forks":3,"open_issues":77,"watchers":2,"default_branch":"master"}},"base":{"label":"resin-io-modules:master","ref":"master","sha":"a601a75ced3d83d106f0744dca79275f93a651bf","user":{"login":"resin-io-modules","id":17724750,"avatar_url":"https://avatars0.githubusercontent.com/u/17724750?v=4","gravatar_id":"","url":"https://api.github.com/users/resin-io-modules","html_url":"https://github.com/resin-io-modules","followers_url":"https://api.github.com/users/resin-io-modules/followers","following_url":"https://api.github.com/users/resin-io-modules/following{/other_user}","gists_url":"https://api.github.com/users/resin-io-modules/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io-modules/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io-modules/subscriptions","organizations_url":"https://api.github.com/users/resin-io-modules/orgs","repos_url":"https://api.github.com/users/resin-io-modules/repos","events_url":"https://api.github.com/users/resin-io-modules/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io-modules/received_events","type":"Organization","site_admin":false},"repo":{"id":76547744,"name":"resin-procbots","full_name":"resin-io-modules/resin-procbots","owner":{"login":"resin-io-modules","id":17724750,"avatar_url":"https://avatars0.githubusercontent.com/u/17724750?v=4","gravatar_id":"","url":"https://api.github.com/users/resin-io-modules","html_url":"https://github.com/resin-io-modules","followers_url":"https://api.github.com/users/resin-io-modules/followers","following_url":"https://api.github.com/users/resin-io-modules/following{/other_user}","gists_url":"https://api.github.com/users/resin-io-modules/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io-modules/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io-modules/subscriptions","organizations_url":"https://api.github.com/users/resin-io-modules/orgs","repos_url":"https://api.github.com/users/resin-io-modules/repos","events_url":"https://api.github.com/users/resin-io-modules/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io-modules/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/resin-io-modules/resin-procbots","description":"Process bots used for automating the development and deployment CI pipeline","fork":false,"url":"https://api.github.com/repos/resin-io-modules/resin-procbots","forks_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/forks","keys_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/keys{/key_id}","collaborators_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/teams","hooks_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/hooks","issue_events_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/events{/number}","events_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/events","assignees_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/assignees{/user}","branches_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/branches{/branch}","tags_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/tags","blobs_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/refs{/sha}","trees_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/trees{/sha}","statuses_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/statuses/{sha}","languages_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/languages","stargazers_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/stargazers","contributors_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/contributors","subscribers_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/subscribers","subscription_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/subscription","commits_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/commits{/sha}","git_commits_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/git/commits{/sha}","comments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/comments{/number}","issue_comment_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/comments{/number}","contents_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/contents/{+path}","compare_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/compare/{base}...{head}","merges_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/merges","archive_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/downloads","issues_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues{/number}","pulls_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls{/number}","milestones_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/milestones{/number}","notifications_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/labels{/name}","releases_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/releases{/id}","deployments_url":"https://api.github.com/repos/resin-io-modules/resin-procbots/deployments","created_at":"2016-12-15T09:58:14Z","updated_at":"2017-08-10T14:23:54Z","pushed_at":"2017-08-11T17:30:24Z","git_url":"git://github.com/resin-io-modules/resin-procbots.git","ssh_url":"git@github.com:resin-io-modules/resin-procbots.git","clone_url":"https://github.com/resin-io-modules/resin-procbots.git","svn_url":"https://github.com/resin-io-modules/resin-procbots","homepage":"https://resin-io-modules.github.io/resin-procbots","size":3591,"stargazers_count":2,"watchers_count":2,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":77,"forks":3,"open_issues":77,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243"},"html":{"href":"https://github.com/resin-io-modules/resin-procbots/pull/243"},"issue":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/243"},"comments":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/issues/243/comments"},"review_comments":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243/comments"},"review_comment":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/pulls/243/commits"},"statuses":{"href":"https://api.github.com/repos/resin-io-modules/resin-procbots/statuses/1848dc51ad670d18f7bf1cd43120656fecfc417b"}}}}
{"actor":{"display_login":"hedss"}}