{"action":"created","comment":{"url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/comments/171610938","pull_request_review_id":100494154,"id":171610938,"diff_hunk":"@@ -0,0 +1,326 @@\n+package asynccmd\n+\n+import (\n+\t\"bytes\"\n+\t\"io\"\n+\t\"strings\"\n+\t\"sync\"\n+)\n+\n+// RedactStr ...\n+var RedactStr = \"[REDACTED]\"\n+\n+var newLine = []byte(\"\\n\")\n+\n+// Buffer ...\n+type Buffer struct {\n+\tBuff bytes.Buffer\n+\tsync.Mutex\n+\n+\tsecrets [][][]byte\n+\n+\tchunk []byte\n+\tstore [][]byte\n+}\n+\n+func newBuffer(secrets []string) *Buffer {\n+\treturn &Buffer{\n+\t\tBuff:    bytes.Buffer{},\n+\t\tsecrets: secretsByteList(secrets),\n+\t\tMutex:   sync.Mutex{},\n+\t}\n+}\n+\n+// Write implements io.Writer interface\n+// Splits p into lines, the lines are matched against the secrets,\n+// this determines which lines can be redcted and write into the buffer\n+// there are may lines which needs to be stored, since partial matching to a secret\n+// Since we do not know which is the last call of write you need to call Flush\n+// on buffer to write the remaining lines\n+func (b *Buffer) Write(p []byte) (int, error) {\n+\tb.Lock()\n+\tdefer b.Unlock()\n+\n+\t// previous bytes may not ended with newline\n+\tdata := append(b.chunk, p...)\n+\tb.chunk = []byte{}\n+\n+\tlastLines := b.lastLines(data)\n+\tif len(lastLines) == 0 {\n+\t\t// it is neccessary to return the count of incoming bytes\n+\t\treturn len(p), nil\n+\t}\n+\n+\tfor _, line := range lastLines {\n+\t\tlines := b.store\n+\t\tif lines == nil {\n+\t\t\tlines = [][]byte{}\n+\t\t}\n+\t\tlines = append(lines, line)\n+\n+\t\tmatchMap, partialMatchMap := b.matchSecrets(lines)\n+\n+\t\tvar linesToPrint [][]byte\n+\t\tlinesToPrint, b.store = b.matchLines(lines, partialMatchMap)\n+\t\tredactedLines := b.redact(linesToPrint, matchMap)\n+\n+\t\tredactedBytes := join(redactedLines)\n+\t\tif c, err := b.Buff.Write(redactedBytes); err != nil {\n+\t\t\treturn c, err\n+\t\t}\n+\t}\n+\n+\t// it is neccessary to return the count of incoming bytes\n+\treturn len(p), nil\n+}\n+\n+// Flush writes the remaining bytes\n+func (b *Buffer) Flush() error {\n+\tlines := b.store[:]\n+\t// chunk is the remaining part of the last Write call\n+\tif len(b.chunk) > 0 {\n+\t\t// lines are containing newline, but the chunk needs to be extendid with newline\n+\t\tchunk := append(b.chunk, newLine...)\n+\t\tlines = append(lines, chunk)\n+\t}\n+\n+\tmatchMap, _ := b.matchSecrets(lines)\n+\tredactedLines := b.redact(lines, matchMap)\n+\n+\tredactedBytes := join(redactedLines)\n+\tif _, err := b.Buff.Write(redactedBytes); err != nil {\n+\t\treturn err\n+\t}\n+\treturn nil\n+}\n+\n+// ReadLines iterally calls ReadString until it receives EOF\n+func (b *Buffer) ReadLines() ([]string, error) {\n+\tb.Lock()\n+\tdefer b.Unlock()\n+\n+\tlines := []string{}\n+\teof := false\n+\tfor !eof {\n+\t\t// every line's byte ends with newline\n+\t\tline, err := b.Buff.ReadString('\\n')\n+\t\tif err != nil {\n+\t\t\tif err == io.EOF {\n+\t\t\t\teof = true\n+\t\t\t} else {\n+\t\t\t\treturn nil, err\n+\t\t\t}\n+\t\t}\n+\t\t// nothing red\n+\t\tif len(line) == 0 {\n+\t\t\tcontinue\n+\t\t}\n+\t\tline = strings.TrimSuffix(line, \"\\n\")\n+\t\tlines = append(lines, line)\n+\t}\n+\treturn lines, nil\n+}\n+\n+// lastLines splits the buffer's remaining bytes + p bytes by 'func split'\n+// and updates the buffer's chunk (the remaining bytes)\n+func (b *Buffer) lastLines(p []byte) [][]byte {\n+\tp = append(b.chunk, p...)\n+\tlines, chunk := split(p)\n+\tb.chunk = chunk\n+\treturn lines\n+}\n+\n+// matchSecrets collects which secrets matches from which line index\n+// and which secrets matches partially from which line index\n+func (b *Buffer) matchSecrets(lines [][]byte) (map[int][]int, map[int][]int) {\n+\tmatchMap := map[int][]int{}        // matching line chunk's first line indexes by secret index\n+\tpartialMatchMap := map[int][]int{} // partially matching line chunk's first line indexes by secret index\n+\n+\tfor secretIdx, secret := range b.secrets {\n+\t\tsecretLine := secret[0] // every match should begin from the secret first line\n+\t\tlineIndexes := []int{}  // the indexes of lines which contains the secret's first line\n+\n+\t\tfor i, line := range lines {\n+\t\t\tif bytes.Contains(line, secretLine) {\n+\t\t\t\tlineIndexes = append(lineIndexes, i)\n+\t\t\t}\n+\t\t}\n+\n+\t\tif len(lineIndexes) == 0 {\n+\t\t\t// this secret can not be found in the lines\n+\t\t\tcontinue\n+\t\t}\n+\n+\t\tfor _, lineIdx := range lineIndexes {\n+\t\t\tif len(secret) == 1 {\n+\t\t\t\t// the single line secret found in the lines\n+\t\t\t\tindexes := matchMap[secretIdx]\n+\t\t\t\tif indexes == nil {\n+\t\t\t\t\tindexes = []int{}\n+\t\t\t\t}\n+\t\t\t\tmatchMap[secretIdx] = append(indexes, lineIdx)\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\t// lineIdx. line matches to a multi line secret's first line\n+\t\t\t// if lines has more line, every subsequent line must match to the secret's subsequent lines\n+\t\t\tpartialMatch := true\n+\t\t\tmatch := false\n+\n+\t\t\tfor i := lineIdx + 1; i < len(lines); i++ {\n+\t\t\t\tsecretLineIdx := i - lineIdx\n+\n+\t\t\t\tsecretLine = secret[secretLineIdx]\n+\t\t\t\tline := lines[i]\n+\n+\t\t\t\tif !bytes.Contains(line, secretLine) {\n+\t\t\t\t\tpartialMatch = false\n+\t\t\t\t\tbreak\n+\t\t\t\t}\n+\n+\t\t\t\tif secretLineIdx == len(secret)-1 {\n+\t\t\t\t\t// multi line secret found in the lines\n+\t\t\t\t\tmatch = true\n+\t\t\t\t\tbreak\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif match {\n+\t\t\t\t// multi line secret found in the lines\n+\t\t\t\tindexes := matchMap[secretIdx]\n+\t\t\t\tif indexes == nil {\n+\t\t\t\t\tindexes = []int{}\n+\t\t\t\t}\n+\t\t\t\tmatchMap[secretIdx] = append(indexes, lineIdx)\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\tif partialMatch {\n+\t\t\t\t// this secret partially can be found in the lines\n+\t\t\t\tindexes := partialMatchMap[secretIdx]\n+\t\t\t\tif indexes == nil {\n+\t\t\t\t\tindexes = []int{}\n+\t\t\t\t}\n+\t\t\t\tpartialMatchMap[secretIdx] = append(indexes, lineIdx)\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn matchMap, partialMatchMap\n+}\n+\n+// linesToKeepRange returns a range (first, last index) of lines needs to be observed\n+// since they contain partially matching secrets\n+func (b *Buffer) linesToKeepRange(partialMatchMap map[int][]int) (int, int) {\n+\tfirst := -1\n+\tlast := -1\n+\n+\tfor secretIdx, lineIndexes := range partialMatchMap {\n+\t\tsecret := b.secrets[secretIdx]\n+\t\tsecretLength := len(secret)\n+\n+\t\tfor _, lineIdx := range lineIndexes {\n+\t\t\tif first == -1 {\n+\t\t\t\tfirst = lineIdx\n+\t\t\t\tlast = first + secretLength\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\tif lineIdx+secretLength > last {\n+\t\t\t\tlast = lineIdx + secretLength\n+\t\t\t}\n+\n+\t\t\tif first > lineIdx {\n+\t\t\t\tfirst = lineIdx\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn first, last\n+}\n+\n+// matchLines return which lines can be printed and which should be keept for further observing\n+func (b *Buffer) matchLines(lines [][]byte, partialMatchMap map[int][]int) ([][]byte, [][]byte) {\n+\tfirst, last := b.linesToKeepRange(partialMatchMap)\n+\tif first == -1 {\n+\t\treturn lines[:], [][]byte{}\n+\t}\n+\n+\tif first == 0 {\n+\t\tif last > len(lines)-1 {\n+\t\t\treturn [][]byte{}, lines[0:len(lines)]","path":"tools/asynccmd/filterbuffer.go","position":251,"original_position":251,"commit_id":"c1ef86d63f3d776057bce2cb257d6c93e6972728","original_commit_id":"c1ef86d63f3d776057bce2cb257d6c93e6972728","user":{"login":"kdobmayer","id":22565526,"avatar_url":"https://avatars0.githubusercontent.com/u/22565526?v=4","gravatar_id":"","url":"https://api.github.com/users/kdobmayer","html_url":"https://github.com/kdobmayer","followers_url":"https://api.github.com/users/kdobmayer/followers","following_url":"https://api.github.com/users/kdobmayer/following{/other_user}","gists_url":"https://api.github.com/users/kdobmayer/gists{/gist_id}","starred_url":"https://api.github.com/users/kdobmayer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kdobmayer/subscriptions","organizations_url":"https://api.github.com/users/kdobmayer/orgs","repos_url":"https://api.github.com/users/kdobmayer/repos","events_url":"https://api.github.com/users/kdobmayer/events{/privacy}","received_events_url":"https://api.github.com/users/kdobmayer/received_events","type":"User","site_admin":false},"body":"no need for `0`: `lines[:last]`","created_at":"2018-03-01T16:17:26Z","updated_at":"2018-03-01T16:17:26Z","html_url":"https://github.com/bitrise-io/bitrise/pull/583#discussion_r171610938","pull_request_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/comments/171610938"},"html":{"href":"https://github.com/bitrise-io/bitrise/pull/583#discussion_r171610938"},"pull_request":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583"}}},"pull_request":{"url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583","id":171419767,"html_url":"https://github.com/bitrise-io/bitrise/pull/583","diff_url":"https://github.com/bitrise-io/bitrise/pull/583.diff","patch_url":"https://github.com/bitrise-io/bitrise/pull/583.patch","issue_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/583","number":583,"state":"open","locked":false,"title":"filter secrets from log lines","user":{"login":"godrei","id":12427060,"avatar_url":"https://avatars2.githubusercontent.com/u/12427060?v=4","gravatar_id":"","url":"https://api.github.com/users/godrei","html_url":"https://github.com/godrei","followers_url":"https://api.github.com/users/godrei/followers","following_url":"https://api.github.com/users/godrei/following{/other_user}","gists_url":"https://api.github.com/users/godrei/gists{/gist_id}","starred_url":"https://api.github.com/users/godrei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/godrei/subscriptions","organizations_url":"https://api.github.com/users/godrei/orgs","repos_url":"https://api.github.com/users/godrei/repos","events_url":"https://api.github.com/users/godrei/events{/privacy}","received_events_url":"https://api.github.com/users/godrei/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-02-26T16:12:49Z","updated_at":"2018-03-01T16:17:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c62b3b256458d3998c401b82512307cca7d61d29","assignee":null,"assignees":[],"requested_reviewers":[{"login":"viktorbenei","id":430618,"avatar_url":"https://avatars2.githubusercontent.com/u/430618?v=4","gravatar_id":"","url":"https://api.github.com/users/viktorbenei","html_url":"https://github.com/viktorbenei","followers_url":"https://api.github.com/users/viktorbenei/followers","following_url":"https://api.github.com/users/viktorbenei/following{/other_user}","gists_url":"https://api.github.com/users/viktorbenei/gists{/gist_id}","starred_url":"https://api.github.com/users/viktorbenei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/viktorbenei/subscriptions","organizations_url":"https://api.github.com/users/viktorbenei/orgs","repos_url":"https://api.github.com/users/viktorbenei/repos","events_url":"https://api.github.com/users/viktorbenei/events{/privacy}","received_events_url":"https://api.github.com/users/viktorbenei/received_events","type":"User","site_admin":false},{"login":"trapacska","id":1564933,"avatar_url":"https://avatars2.githubusercontent.com/u/1564933?v=4","gravatar_id":"","url":"https://api.github.com/users/trapacska","html_url":"https://github.com/trapacska","followers_url":"https://api.github.com/users/trapacska/followers","following_url":"https://api.github.com/users/trapacska/following{/other_user}","gists_url":"https://api.github.com/users/trapacska/gists{/gist_id}","starred_url":"https://api.github.com/users/trapacska/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/trapacska/subscriptions","organizations_url":"https://api.github.com/users/trapacska/orgs","repos_url":"https://api.github.com/users/trapacska/repos","events_url":"https://api.github.com/users/trapacska/events{/privacy}","received_events_url":"https://api.github.com/users/trapacska/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583/commits","review_comments_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583/comments","review_comment_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/583/comments","statuses_url":"https://api.github.com/repos/bitrise-io/bitrise/statuses/c1ef86d63f3d776057bce2cb257d6c93e6972728","head":{"label":"bitrise-io:log-filtering","ref":"log-filtering","sha":"c1ef86d63f3d776057bce2cb257d6c93e6972728","user":{"login":"bitrise-io","id":7174390,"avatar_url":"https://avatars0.githubusercontent.com/u/7174390?v=4","gravatar_id":"","url":"https://api.github.com/users/bitrise-io","html_url":"https://github.com/bitrise-io","followers_url":"https://api.github.com/users/bitrise-io/followers","following_url":"https://api.github.com/users/bitrise-io/following{/other_user}","gists_url":"https://api.github.com/users/bitrise-io/gists{/gist_id}","starred_url":"https://api.github.com/users/bitrise-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitrise-io/subscriptions","organizations_url":"https://api.github.com/users/bitrise-io/orgs","repos_url":"https://api.github.com/users/bitrise-io/repos","events_url":"https://api.github.com/users/bitrise-io/events{/privacy}","received_events_url":"https://api.github.com/users/bitrise-io/received_events","type":"Organization","site_admin":false},"repo":{"id":38150454,"name":"bitrise","full_name":"bitrise-io/bitrise","owner":{"login":"bitrise-io","id":7174390,"avatar_url":"https://avatars0.githubusercontent.com/u/7174390?v=4","gravatar_id":"","url":"https://api.github.com/users/bitrise-io","html_url":"https://github.com/bitrise-io","followers_url":"https://api.github.com/users/bitrise-io/followers","following_url":"https://api.github.com/users/bitrise-io/following{/other_user}","gists_url":"https://api.github.com/users/bitrise-io/gists{/gist_id}","starred_url":"https://api.github.com/users/bitrise-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitrise-io/subscriptions","organizations_url":"https://api.github.com/users/bitrise-io/orgs","repos_url":"https://api.github.com/users/bitrise-io/repos","events_url":"https://api.github.com/users/bitrise-io/events{/privacy}","received_events_url":"https://api.github.com/users/bitrise-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bitrise-io/bitrise","description":"Bitrise runner CLI - run your automations on your Mac or Linux machine -","fork":false,"url":"https://api.github.com/repos/bitrise-io/bitrise","forks_url":"https://api.github.com/repos/bitrise-io/bitrise/forks","keys_url":"https://api.github.com/repos/bitrise-io/bitrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bitrise-io/bitrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bitrise-io/bitrise/teams","hooks_url":"https://api.github.com/repos/bitrise-io/bitrise/hooks","issue_events_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/events{/number}","events_url":"https://api.github.com/repos/bitrise-io/bitrise/events","assignees_url":"https://api.github.com/repos/bitrise-io/bitrise/assignees{/user}","branches_url":"https://api.github.com/repos/bitrise-io/bitrise/branches{/branch}","tags_url":"https://api.github.com/repos/bitrise-io/bitrise/tags","blobs_url":"https://api.github.com/repos/bitrise-io/bitrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bitrise-io/bitrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bitrise-io/bitrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/bitrise-io/bitrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bitrise-io/bitrise/statuses/{sha}","languages_url":"https://api.github.com/repos/bitrise-io/bitrise/languages","stargazers_url":"https://api.github.com/repos/bitrise-io/bitrise/stargazers","contributors_url":"https://api.github.com/repos/bitrise-io/bitrise/contributors","subscribers_url":"https://api.github.com/repos/bitrise-io/bitrise/subscribers","subscription_url":"https://api.github.com/repos/bitrise-io/bitrise/subscription","commits_url":"https://api.github.com/repos/bitrise-io/bitrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/bitrise-io/bitrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/bitrise-io/bitrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/bitrise-io/bitrise/contents/{+path}","compare_url":"https://api.github.com/repos/bitrise-io/bitrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bitrise-io/bitrise/merges","archive_url":"https://api.github.com/repos/bitrise-io/bitrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bitrise-io/bitrise/downloads","issues_url":"https://api.github.com/repos/bitrise-io/bitrise/issues{/number}","pulls_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls{/number}","milestones_url":"https://api.github.com/repos/bitrise-io/bitrise/milestones{/number}","notifications_url":"https://api.github.com/repos/bitrise-io/bitrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bitrise-io/bitrise/labels{/name}","releases_url":"https://api.github.com/repos/bitrise-io/bitrise/releases{/id}","deployments_url":"https://api.github.com/repos/bitrise-io/bitrise/deployments","created_at":"2015-06-27T06:50:32Z","updated_at":"2018-02-25T21:39:52Z","pushed_at":"2018-02-28T15:16:10Z","git_url":"git://github.com/bitrise-io/bitrise.git","ssh_url":"git@github.com:bitrise-io/bitrise.git","clone_url":"https://github.com/bitrise-io/bitrise.git","svn_url":"https://github.com/bitrise-io/bitrise","homepage":"https://www.bitrise.io/cli","size":6819,"stargazers_count":272,"watchers_count":272,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":57,"mirror_url":null,"archived":false,"open_issues_count":21,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":57,"open_issues":21,"watchers":272,"default_branch":"master"}},"base":{"label":"bitrise-io:master","ref":"master","sha":"1be454aa705a5e36b36dda71df393429ae78ab7d","user":{"login":"bitrise-io","id":7174390,"avatar_url":"https://avatars0.githubusercontent.com/u/7174390?v=4","gravatar_id":"","url":"https://api.github.com/users/bitrise-io","html_url":"https://github.com/bitrise-io","followers_url":"https://api.github.com/users/bitrise-io/followers","following_url":"https://api.github.com/users/bitrise-io/following{/other_user}","gists_url":"https://api.github.com/users/bitrise-io/gists{/gist_id}","starred_url":"https://api.github.com/users/bitrise-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitrise-io/subscriptions","organizations_url":"https://api.github.com/users/bitrise-io/orgs","repos_url":"https://api.github.com/users/bitrise-io/repos","events_url":"https://api.github.com/users/bitrise-io/events{/privacy}","received_events_url":"https://api.github.com/users/bitrise-io/received_events","type":"Organization","site_admin":false},"repo":{"id":38150454,"name":"bitrise","full_name":"bitrise-io/bitrise","owner":{"login":"bitrise-io","id":7174390,"avatar_url":"https://avatars0.githubusercontent.com/u/7174390?v=4","gravatar_id":"","url":"https://api.github.com/users/bitrise-io","html_url":"https://github.com/bitrise-io","followers_url":"https://api.github.com/users/bitrise-io/followers","following_url":"https://api.github.com/users/bitrise-io/following{/other_user}","gists_url":"https://api.github.com/users/bitrise-io/gists{/gist_id}","starred_url":"https://api.github.com/users/bitrise-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitrise-io/subscriptions","organizations_url":"https://api.github.com/users/bitrise-io/orgs","repos_url":"https://api.github.com/users/bitrise-io/repos","events_url":"https://api.github.com/users/bitrise-io/events{/privacy}","received_events_url":"https://api.github.com/users/bitrise-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bitrise-io/bitrise","description":"Bitrise runner CLI - run your automations on your Mac or Linux machine -","fork":false,"url":"https://api.github.com/repos/bitrise-io/bitrise","forks_url":"https://api.github.com/repos/bitrise-io/bitrise/forks","keys_url":"https://api.github.com/repos/bitrise-io/bitrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bitrise-io/bitrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bitrise-io/bitrise/teams","hooks_url":"https://api.github.com/repos/bitrise-io/bitrise/hooks","issue_events_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/events{/number}","events_url":"https://api.github.com/repos/bitrise-io/bitrise/events","assignees_url":"https://api.github.com/repos/bitrise-io/bitrise/assignees{/user}","branches_url":"https://api.github.com/repos/bitrise-io/bitrise/branches{/branch}","tags_url":"https://api.github.com/repos/bitrise-io/bitrise/tags","blobs_url":"https://api.github.com/repos/bitrise-io/bitrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bitrise-io/bitrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bitrise-io/bitrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/bitrise-io/bitrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bitrise-io/bitrise/statuses/{sha}","languages_url":"https://api.github.com/repos/bitrise-io/bitrise/languages","stargazers_url":"https://api.github.com/repos/bitrise-io/bitrise/stargazers","contributors_url":"https://api.github.com/repos/bitrise-io/bitrise/contributors","subscribers_url":"https://api.github.com/repos/bitrise-io/bitrise/subscribers","subscription_url":"https://api.github.com/repos/bitrise-io/bitrise/subscription","commits_url":"https://api.github.com/repos/bitrise-io/bitrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/bitrise-io/bitrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/bitrise-io/bitrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/bitrise-io/bitrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/bitrise-io/bitrise/contents/{+path}","compare_url":"https://api.github.com/repos/bitrise-io/bitrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bitrise-io/bitrise/merges","archive_url":"https://api.github.com/repos/bitrise-io/bitrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bitrise-io/bitrise/downloads","issues_url":"https://api.github.com/repos/bitrise-io/bitrise/issues{/number}","pulls_url":"https://api.github.com/repos/bitrise-io/bitrise/pulls{/number}","milestones_url":"https://api.github.com/repos/bitrise-io/bitrise/milestones{/number}","notifications_url":"https://api.github.com/repos/bitrise-io/bitrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bitrise-io/bitrise/labels{/name}","releases_url":"https://api.github.com/repos/bitrise-io/bitrise/releases{/id}","deployments_url":"https://api.github.com/repos/bitrise-io/bitrise/deployments","created_at":"2015-06-27T06:50:32Z","updated_at":"2018-02-25T21:39:52Z","pushed_at":"2018-02-28T15:16:10Z","git_url":"git://github.com/bitrise-io/bitrise.git","ssh_url":"git@github.com:bitrise-io/bitrise.git","clone_url":"https://github.com/bitrise-io/bitrise.git","svn_url":"https://github.com/bitrise-io/bitrise","homepage":"https://www.bitrise.io/cli","size":6819,"stargazers_count":272,"watchers_count":272,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":57,"mirror_url":null,"archived":false,"open_issues_count":21,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":57,"open_issues":21,"watchers":272,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583"},"html":{"href":"https://github.com/bitrise-io/bitrise/pull/583"},"issue":{"href":"https://api.github.com/repos/bitrise-io/bitrise/issues/583"},"comments":{"href":"https://api.github.com/repos/bitrise-io/bitrise/issues/583/comments"},"review_comments":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583/comments"},"review_comment":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bitrise-io/bitrise/pulls/583/commits"},"statuses":{"href":"https://api.github.com/repos/bitrise-io/bitrise/statuses/c1ef86d63f3d776057bce2cb257d6c93e6972728"}},"author_association":"OWNER"}}
{"actor":{"display_login":"kdobmayer"}}