{"action":"created","comment":{"url":"https://api.github.com/repos/resin-io/docker-progress/pulls/comments/93408809","pull_request_review_id":13934248,"id":93408809,"diff_hunk":"@@ -148,20 +35,171 @@ onProgressHandler = (onProgressPromise, fallbackOnProgress) ->\n \t# real onProgress function when the promise resolves\n \treturn (evt) -> onProgress(evt)\n \n-getLongId = (shortId, layerIds) ->\n-\tif not shortId?\n-\t\tthrow new Error('Progress event missing layer id. Progress not correct.')\n-\tlongId = _.find(layerIds, (id) -> _.startsWith(id, shortId))\n-\tif not longId?\n-\t\tthrow new Error(\"Progress error: Unknown layer #{shortId} referenced by docker. Progress not correct.\")\n-\treturn longId\n+combinedProgressHandler = (renderer, states, index, callback) ->\n+\treturn (evt) ->\n+\t\t# update current reporter state\n+\t\tstates[index].percentage = evt.percentage\n+\t\t# update totals\n+\t\tpercentage = _.sumBy(states, 'percentage') // (states.length || 1)\n+\t\t# update event\n+\t\tevt.totalProgress = renderer(percentage)\n+\t\tevt.percentage = percentage\n+\t\tevt.progressIndex = index\n+\t\t# call callback with aggregate event\n+\t\tcallback(evt)\n+\n+class ProgressTracker\n+\tconstructor: (@coalesceBelow = 0) ->\n+\t\t@layers = {}\n+\n+\taddLayer: (id) ->\n+\t\t@layers[id] = { progress: null, coalesced: false }\n+\n+\tupdateLayer: (id, progress) ->\n+\t\treturn if not id?\n+\t\t@addLayer(id) if not @layers[id]\n+\t\t@patchProgressEvent(progress)\n+\t\t@layers[id].coalesced = not @layers[id].progress? and progress.total < @coalesceBelow\n+\t\t@layers[id].progress = (progress.current / progress.total) || 0 # prevent NaN when .total = 0\n+\n+\tfinishLayer: (id) ->\n+\t\t@updateLayer(id, { current: 1, total: 1 })\n+\n+\tgetProgress: ->\n+\t\tlayers = _.filter(@layers, coalesced: false)\n+\t\tlayerCount = layers.length || 1\n+\t\tprogress = _.sumBy(layers, 'progress')\n+\t\treturn Math.round(100 * progress / layerCount)\n+\n+\tpatchProgressEvent: (progress) ->\n+\t\t# some events arrive without .total\n+\t\tprogress.total ?= progress.current\n+\t\t# some events arrive with .current > .total\n+\t\tprogress.current = Math.min(progress.current, progress.total)\n+\n+class ProgressReporter\n+\tconstructor: (@renderProgress) -> #\n+\n+\t# Create a stream that transforms `docker.modem.followProgress` onProgress\n+\t# events to include total progress metrics.\n+\tpullProgress: (image, onProgress) ->\n+\t\tprogressRenderer = @renderProgress\n+\t\tdownloadProgressTracker = new ProgressTracker(100 * 1024) # 100 KB\n+\t\textractionProgressTracker = new ProgressTracker(1024 * 1024) # 1 MB\n+\t\tlastPercentage = 0\n+\t\tPromise.try ->\n+\t\t\treturn (evt) ->\n+\t\t\t\ttry\n+\t\t\t\t\t{ id, status } = evt\n+\n+\t\t\t\t\tif status is 'Pulling fs layer'\n+\t\t\t\t\t\tdownloadProgressTracker.addLayer(id)\n+\t\t\t\t\t\textractionProgressTracker.addLayer(id)\n+\t\t\t\t\telse if status is 'Downloading'\n+\t\t\t\t\t\tdownloadProgressTracker.updateLayer(id, evt.progressDetail)\n+\t\t\t\t\telse if status is 'Extracting'\n+\t\t\t\t\t\textractionProgressTracker.updateLayer(id, evt.progressDetail)\n+\t\t\t\t\telse if status is 'Download complete'\n+\t\t\t\t\t\tdownloadProgressTracker.finishLayer(id)\n+\t\t\t\t\telse if status is 'Pull complete'\n+\t\t\t\t\t\textractionProgressTracker.finishLayer(id)\n+\t\t\t\t\telse if status is 'Already exists'\n+\t\t\t\t\t\tdownloadProgressTracker.finishLayer(id)\n+\t\t\t\t\t\textractionProgressTracker.finishLayer(id)\n+\n+\t\t\t\t\tif status.match(/^Status: Image is up to date for /) or status.match(/^Status: Downloaded newer image for /)\n+\t\t\t\t\t\tdownloadedPercentage = 100\n+\t\t\t\t\t\textractedPercentage = 100\n+\t\t\t\t\telse\n+\t\t\t\t\t\tdownloadedPercentage = downloadProgressTracker.getProgress()\n+\t\t\t\t\t\textractedPercentage = extractionProgressTracker.getProgress()\n+\n+\t\t\t\t\tpercentage = (downloadedPercentage + extractedPercentage) // 2\n+\t\t\t\t\tpercentage = lastPercentage = Math.max(percentage, lastPercentage)\n+\n+\t\t\t\t\tonProgress _.merge evt, {\n+\t\t\t\t\t\tpercentage\n+\t\t\t\t\t\tdownloadedPercentage\n+\t\t\t\t\t\textractedPercentage\n+\t\t\t\t\t\ttotalProgress: progressRenderer(percentage)\n+\t\t\t\t\t}\n+\t\t\t\tcatch err\n+\t\t\t\t\tconsole.warn('Progress error:', err.message ? err)\n+\n+\t# Create a stream that transforms `docker.modem.followProgress` onProgress\n+\t# events to include total progress metrics.\n+\tpushProgress: (image, onProgress) ->\n+\t\tprogressRenderer = @renderProgress\n+\t\tprogressTracker = new ProgressTracker(100 * 1024) # 100 KB\n+\t\tlastPercentage = 0\n+\t\tPromise.try ->\n+\t\t\treturn (evt) ->\n+\t\t\t\ttry\n+\t\t\t\t\t{ id, status } = evt\n+\n+\t\t\t\t\tpushMatch = /Image (.*) already pushed/.exec(status)\n+\n+\t\t\t\t\tid ?= pushMatch?[1]\n+\t\t\t\t\tstatus ?= ''\n+\n+\t\t\t\t\tif status is 'Preparing'\n+\t\t\t\t\t\tprogressTracker.addLayer(id)\n+\t\t\t\t\telse if status is 'Pushing' and evt.progressDetail.current?\n+\t\t\t\t\t\tprogressTracker.updateLayer(id, evt.progressDetail)\n+\t\t\t\t\t# registry v2 statuses\n+\t\t\t\t\telse if _.includes(['Pushed', 'Layer already exists', 'Image already exists'], status) or /^Mounted from /.test(status)\n+\t\t\t\t\t\tprogressTracker.finishLayer(id)\n+\t\t\t\t\t# registry v1 statuses\n+\t\t\t\t\telse if pushMatch? or _.includes(['Already exists', 'Image successfully pushed'], status)\n+\t\t\t\t\t\tprogressTracker.finishLayer(id)\n+\n+\t\t\t\t\tpercentage = if status.match(/^latest: digest: /) or status.match(/^Pushing tag for rev /)\n+\t\t\t\t\t\t100\n+\t\t\t\t\telse\n+\t\t\t\t\t\tprogressTracker.getProgress()\n+\n+\t\t\t\t\tpercentage = lastPercentage = Math.max(percentage, lastPercentage)\n+\n+\t\t\t\t\tonProgress _.merge evt, {\n+\t\t\t\t\t\tid\n+\t\t\t\t\t\tpercentage\n+\t\t\t\t\t\ttotalProgress: progressRenderer(percentage)\n+\t\t\t\t\t}\n+\t\t\t\tcatch err\n+\t\t\t\t\tconsole.warn('Progress error:', err.message ? err)\n \n exports.DockerProgress = class DockerProgress\n \tconstructor: (dockerOpts) ->\n \t\tif !(this instanceof DockerProgress)\n \t\t\treturn new DockerProgress(dockerOpts)\n \n \t\t@docker = new Docker(dockerOpts)\n+\t\t@reporter = null\n+\n+\tgetProgressRenderer: (stepCount = DEFAULT_PROGRESS_BAR_STEP_COUNT) ->\n+\t\treturn (percentage) ->\n+\t\t\trenderProgress(percentage, stepCount)\n+\n+\tgetProgressReporter: ->\n+\t\treturn @reporter if @reporter?\n+\t\tdocker = @docker\n+\t\trenderer = @getProgressRenderer()\n+\t\t@reporter = docker.versionAsync().then (res) ->\n+\t\t\tversion = res['Version']\n+\t\t\tif version? and semver.lt(version, LEGACY_DOCKER_VERSION)\n+\t\t\t\tLegacyProgressReporter = require('./legacy').ProgressReporter\n+\t\t\t\treturn new LegacyProgressReporter(renderer, docker)\n+\t\t\telse\n+\t\t\t\treturn new ProgressReporter(renderer)\n+\n+\taggregateProgress: (count, onProgress) ->\n+\t\trenderer = @getProgressRenderer()\n+\t\tstates = []\n+\t\treporters = []\n+\t\tfor i in [0...count]","path":"index.coffee","position":null,"original_position":318,"commit_id":"f5eb2898e7ae2ebc1c7c44e5544175c46f5773e3","original_commit_id":"145d47fb63913a4c34252e5d56615ebe8ad56373","user":{"login":"Page-","id":360115,"avatar_url":"https://avatars.githubusercontent.com/u/360115?v=3","gravatar_id":"","url":"https://api.github.com/users/Page-","html_url":"https://github.com/Page-","followers_url":"https://api.github.com/users/Page-/followers","following_url":"https://api.github.com/users/Page-/following{/other_user}","gists_url":"https://api.github.com/users/Page-/gists{/gist_id}","starred_url":"https://api.github.com/users/Page-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Page-/subscriptions","organizations_url":"https://api.github.com/users/Page-/orgs","repos_url":"https://api.github.com/users/Page-/repos","events_url":"https://api.github.com/users/Page-/events{/privacy}","received_events_url":"https://api.github.com/users/Page-/received_events","type":"User","site_admin":false},"body":"Yeah, I saw that the behaviour would be correct, but it matched a scary pattern and I had to go check and it's nice to avoid people reading the code in future from also having to go check :)\r\n\r\nAs for moving `combinedProgressHandler` inside, I think it would make some sense since we basically just forward the entire state of this function into `combinedProgressHandler`, and in a way that is pretty closely tied to this function already","created_at":"2016-12-21T10:05:09Z","updated_at":"2016-12-21T10:05:09Z","html_url":"https://github.com/resin-io/docker-progress/pull/10#discussion_r93408809","pull_request_url":"https://api.github.com/repos/resin-io/docker-progress/pulls/10","_links":{"self":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/comments/93408809"},"html":{"href":"https://github.com/resin-io/docker-progress/pull/10#discussion_r93408809"},"pull_request":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/10"}}},"pull_request":{"url":"https://api.github.com/repos/resin-io/docker-progress/pulls/10","id":87688346,"html_url":"https://github.com/resin-io/docker-progress/pull/10","diff_url":"https://github.com/resin-io/docker-progress/pull/10.diff","patch_url":"https://github.com/resin-io/docker-progress/pull/10.patch","issue_url":"https://api.github.com/repos/resin-io/docker-progress/issues/10","number":10,"state":"open","locked":false,"title":"Compute extraction progress","user":{"login":"abresas","id":938774,"avatar_url":"https://avatars.githubusercontent.com/u/938774?v=3","gravatar_id":"","url":"https://api.github.com/users/abresas","html_url":"https://github.com/abresas","followers_url":"https://api.github.com/users/abresas/followers","following_url":"https://api.github.com/users/abresas/following{/other_user}","gists_url":"https://api.github.com/users/abresas/gists{/gist_id}","starred_url":"https://api.github.com/users/abresas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abresas/subscriptions","organizations_url":"https://api.github.com/users/abresas/orgs","repos_url":"https://api.github.com/users/abresas/repos","events_url":"https://api.github.com/users/abresas/events{/privacy}","received_events_url":"https://api.github.com/users/abresas/received_events","type":"User","site_admin":false},"body":"Closes #7 \n\nCompute `downloadedPercentage` and `extractedPercentage` separately, while keeping `percentage` as the \"total pull progress\".\n\n<!-- Reviewable:start -->\n\n---\n\nThis change is [<img src=\"https://reviewable.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.io/reviews/resin-io/docker-progress/10)\n\n<!-- Reviewable:end -->\n","created_at":"2016-10-03T09:45:16Z","updated_at":"2016-12-21T10:05:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"09ebca965294c73c3957a761d1a9981066d72797","assignee":{"login":"dfunckt","id":130359,"avatar_url":"https://avatars.githubusercontent.com/u/130359?v=3","gravatar_id":"","url":"https://api.github.com/users/dfunckt","html_url":"https://github.com/dfunckt","followers_url":"https://api.github.com/users/dfunckt/followers","following_url":"https://api.github.com/users/dfunckt/following{/other_user}","gists_url":"https://api.github.com/users/dfunckt/gists{/gist_id}","starred_url":"https://api.github.com/users/dfunckt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dfunckt/subscriptions","organizations_url":"https://api.github.com/users/dfunckt/orgs","repos_url":"https://api.github.com/users/dfunckt/repos","events_url":"https://api.github.com/users/dfunckt/events{/privacy}","received_events_url":"https://api.github.com/users/dfunckt/received_events","type":"User","site_admin":false},"assignees":[{"login":"dfunckt","id":130359,"avatar_url":"https://avatars.githubusercontent.com/u/130359?v=3","gravatar_id":"","url":"https://api.github.com/users/dfunckt","html_url":"https://github.com/dfunckt","followers_url":"https://api.github.com/users/dfunckt/followers","following_url":"https://api.github.com/users/dfunckt/following{/other_user}","gists_url":"https://api.github.com/users/dfunckt/gists{/gist_id}","starred_url":"https://api.github.com/users/dfunckt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dfunckt/subscriptions","organizations_url":"https://api.github.com/users/dfunckt/orgs","repos_url":"https://api.github.com/users/dfunckt/repos","events_url":"https://api.github.com/users/dfunckt/events{/privacy}","received_events_url":"https://api.github.com/users/dfunckt/received_events","type":"User","site_admin":false},{"login":"Page-","id":360115,"avatar_url":"https://avatars.githubusercontent.com/u/360115?v=3","gravatar_id":"","url":"https://api.github.com/users/Page-","html_url":"https://github.com/Page-","followers_url":"https://api.github.com/users/Page-/followers","following_url":"https://api.github.com/users/Page-/following{/other_user}","gists_url":"https://api.github.com/users/Page-/gists{/gist_id}","starred_url":"https://api.github.com/users/Page-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Page-/subscriptions","organizations_url":"https://api.github.com/users/Page-/orgs","repos_url":"https://api.github.com/users/Page-/repos","events_url":"https://api.github.com/users/Page-/events{/privacy}","received_events_url":"https://api.github.com/users/Page-/received_events","type":"User","site_admin":false},{"login":"petrosagg","id":939420,"avatar_url":"https://avatars.githubusercontent.com/u/939420?v=3","gravatar_id":"","url":"https://api.github.com/users/petrosagg","html_url":"https://github.com/petrosagg","followers_url":"https://api.github.com/users/petrosagg/followers","following_url":"https://api.github.com/users/petrosagg/following{/other_user}","gists_url":"https://api.github.com/users/petrosagg/gists{/gist_id}","starred_url":"https://api.github.com/users/petrosagg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petrosagg/subscriptions","organizations_url":"https://api.github.com/users/petrosagg/orgs","repos_url":"https://api.github.com/users/petrosagg/repos","events_url":"https://api.github.com/users/petrosagg/events{/privacy}","received_events_url":"https://api.github.com/users/petrosagg/received_events","type":"User","site_admin":false},{"login":"pcarranzav","id":2223590,"avatar_url":"https://avatars.githubusercontent.com/u/2223590?v=3","gravatar_id":"","url":"https://api.github.com/users/pcarranzav","html_url":"https://github.com/pcarranzav","followers_url":"https://api.github.com/users/pcarranzav/followers","following_url":"https://api.github.com/users/pcarranzav/following{/other_user}","gists_url":"https://api.github.com/users/pcarranzav/gists{/gist_id}","starred_url":"https://api.github.com/users/pcarranzav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pcarranzav/subscriptions","organizations_url":"https://api.github.com/users/pcarranzav/orgs","repos_url":"https://api.github.com/users/pcarranzav/repos","events_url":"https://api.github.com/users/pcarranzav/events{/privacy}","received_events_url":"https://api.github.com/users/pcarranzav/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/resin-io/docker-progress/pulls/10/commits","review_comments_url":"https://api.github.com/repos/resin-io/docker-progress/pulls/10/comments","review_comment_url":"https://api.github.com/repos/resin-io/docker-progress/pulls/comments{/number}","comments_url":"https://api.github.com/repos/resin-io/docker-progress/issues/10/comments","statuses_url":"https://api.github.com/repos/resin-io/docker-progress/statuses/f5eb2898e7ae2ebc1c7c44e5544175c46f5773e3","head":{"label":"resin-io:extract-size","ref":"extract-size","sha":"f5eb2898e7ae2ebc1c7c44e5544175c46f5773e3","user":{"login":"resin-io","id":6157842,"avatar_url":"https://avatars.githubusercontent.com/u/6157842?v=3","gravatar_id":"","url":"https://api.github.com/users/resin-io","html_url":"https://github.com/resin-io","followers_url":"https://api.github.com/users/resin-io/followers","following_url":"https://api.github.com/users/resin-io/following{/other_user}","gists_url":"https://api.github.com/users/resin-io/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io/subscriptions","organizations_url":"https://api.github.com/users/resin-io/orgs","repos_url":"https://api.github.com/users/resin-io/repos","events_url":"https://api.github.com/users/resin-io/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io/received_events","type":"Organization","site_admin":false},"repo":{"id":45246455,"name":"docker-progress","full_name":"resin-io/docker-progress","owner":{"login":"resin-io","id":6157842,"avatar_url":"https://avatars.githubusercontent.com/u/6157842?v=3","gravatar_id":"","url":"https://api.github.com/users/resin-io","html_url":"https://github.com/resin-io","followers_url":"https://api.github.com/users/resin-io/followers","following_url":"https://api.github.com/users/resin-io/following{/other_user}","gists_url":"https://api.github.com/users/resin-io/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io/subscriptions","organizations_url":"https://api.github.com/users/resin-io/orgs","repos_url":"https://api.github.com/users/resin-io/repos","events_url":"https://api.github.com/users/resin-io/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/resin-io/docker-progress","description":null,"fork":false,"url":"https://api.github.com/repos/resin-io/docker-progress","forks_url":"https://api.github.com/repos/resin-io/docker-progress/forks","keys_url":"https://api.github.com/repos/resin-io/docker-progress/keys{/key_id}","collaborators_url":"https://api.github.com/repos/resin-io/docker-progress/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/resin-io/docker-progress/teams","hooks_url":"https://api.github.com/repos/resin-io/docker-progress/hooks","issue_events_url":"https://api.github.com/repos/resin-io/docker-progress/issues/events{/number}","events_url":"https://api.github.com/repos/resin-io/docker-progress/events","assignees_url":"https://api.github.com/repos/resin-io/docker-progress/assignees{/user}","branches_url":"https://api.github.com/repos/resin-io/docker-progress/branches{/branch}","tags_url":"https://api.github.com/repos/resin-io/docker-progress/tags","blobs_url":"https://api.github.com/repos/resin-io/docker-progress/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/resin-io/docker-progress/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/resin-io/docker-progress/git/refs{/sha}","trees_url":"https://api.github.com/repos/resin-io/docker-progress/git/trees{/sha}","statuses_url":"https://api.github.com/repos/resin-io/docker-progress/statuses/{sha}","languages_url":"https://api.github.com/repos/resin-io/docker-progress/languages","stargazers_url":"https://api.github.com/repos/resin-io/docker-progress/stargazers","contributors_url":"https://api.github.com/repos/resin-io/docker-progress/contributors","subscribers_url":"https://api.github.com/repos/resin-io/docker-progress/subscribers","subscription_url":"https://api.github.com/repos/resin-io/docker-progress/subscription","commits_url":"https://api.github.com/repos/resin-io/docker-progress/commits{/sha}","git_commits_url":"https://api.github.com/repos/resin-io/docker-progress/git/commits{/sha}","comments_url":"https://api.github.com/repos/resin-io/docker-progress/comments{/number}","issue_comment_url":"https://api.github.com/repos/resin-io/docker-progress/issues/comments{/number}","contents_url":"https://api.github.com/repos/resin-io/docker-progress/contents/{+path}","compare_url":"https://api.github.com/repos/resin-io/docker-progress/compare/{base}...{head}","merges_url":"https://api.github.com/repos/resin-io/docker-progress/merges","archive_url":"https://api.github.com/repos/resin-io/docker-progress/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/resin-io/docker-progress/downloads","issues_url":"https://api.github.com/repos/resin-io/docker-progress/issues{/number}","pulls_url":"https://api.github.com/repos/resin-io/docker-progress/pulls{/number}","milestones_url":"https://api.github.com/repos/resin-io/docker-progress/milestones{/number}","notifications_url":"https://api.github.com/repos/resin-io/docker-progress/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/resin-io/docker-progress/labels{/name}","releases_url":"https://api.github.com/repos/resin-io/docker-progress/releases{/id}","deployments_url":"https://api.github.com/repos/resin-io/docker-progress/deployments","created_at":"2015-10-30T11:10:51Z","updated_at":"2016-11-13T20:17:41Z","pushed_at":"2016-12-21T09:53:56Z","git_url":"git://github.com/resin-io/docker-progress.git","ssh_url":"git@github.com:resin-io/docker-progress.git","clone_url":"https://github.com/resin-io/docker-progress.git","svn_url":"https://github.com/resin-io/docker-progress","homepage":null,"size":56,"stargazers_count":2,"watchers_count":2,"language":"CoffeeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":2,"default_branch":"master"}},"base":{"label":"resin-io:master","ref":"master","sha":"5520348c463778118747f5af08a076dd980157f6","user":{"login":"resin-io","id":6157842,"avatar_url":"https://avatars.githubusercontent.com/u/6157842?v=3","gravatar_id":"","url":"https://api.github.com/users/resin-io","html_url":"https://github.com/resin-io","followers_url":"https://api.github.com/users/resin-io/followers","following_url":"https://api.github.com/users/resin-io/following{/other_user}","gists_url":"https://api.github.com/users/resin-io/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io/subscriptions","organizations_url":"https://api.github.com/users/resin-io/orgs","repos_url":"https://api.github.com/users/resin-io/repos","events_url":"https://api.github.com/users/resin-io/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io/received_events","type":"Organization","site_admin":false},"repo":{"id":45246455,"name":"docker-progress","full_name":"resin-io/docker-progress","owner":{"login":"resin-io","id":6157842,"avatar_url":"https://avatars.githubusercontent.com/u/6157842?v=3","gravatar_id":"","url":"https://api.github.com/users/resin-io","html_url":"https://github.com/resin-io","followers_url":"https://api.github.com/users/resin-io/followers","following_url":"https://api.github.com/users/resin-io/following{/other_user}","gists_url":"https://api.github.com/users/resin-io/gists{/gist_id}","starred_url":"https://api.github.com/users/resin-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resin-io/subscriptions","organizations_url":"https://api.github.com/users/resin-io/orgs","repos_url":"https://api.github.com/users/resin-io/repos","events_url":"https://api.github.com/users/resin-io/events{/privacy}","received_events_url":"https://api.github.com/users/resin-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/resin-io/docker-progress","description":null,"fork":false,"url":"https://api.github.com/repos/resin-io/docker-progress","forks_url":"https://api.github.com/repos/resin-io/docker-progress/forks","keys_url":"https://api.github.com/repos/resin-io/docker-progress/keys{/key_id}","collaborators_url":"https://api.github.com/repos/resin-io/docker-progress/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/resin-io/docker-progress/teams","hooks_url":"https://api.github.com/repos/resin-io/docker-progress/hooks","issue_events_url":"https://api.github.com/repos/resin-io/docker-progress/issues/events{/number}","events_url":"https://api.github.com/repos/resin-io/docker-progress/events","assignees_url":"https://api.github.com/repos/resin-io/docker-progress/assignees{/user}","branches_url":"https://api.github.com/repos/resin-io/docker-progress/branches{/branch}","tags_url":"https://api.github.com/repos/resin-io/docker-progress/tags","blobs_url":"https://api.github.com/repos/resin-io/docker-progress/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/resin-io/docker-progress/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/resin-io/docker-progress/git/refs{/sha}","trees_url":"https://api.github.com/repos/resin-io/docker-progress/git/trees{/sha}","statuses_url":"https://api.github.com/repos/resin-io/docker-progress/statuses/{sha}","languages_url":"https://api.github.com/repos/resin-io/docker-progress/languages","stargazers_url":"https://api.github.com/repos/resin-io/docker-progress/stargazers","contributors_url":"https://api.github.com/repos/resin-io/docker-progress/contributors","subscribers_url":"https://api.github.com/repos/resin-io/docker-progress/subscribers","subscription_url":"https://api.github.com/repos/resin-io/docker-progress/subscription","commits_url":"https://api.github.com/repos/resin-io/docker-progress/commits{/sha}","git_commits_url":"https://api.github.com/repos/resin-io/docker-progress/git/commits{/sha}","comments_url":"https://api.github.com/repos/resin-io/docker-progress/comments{/number}","issue_comment_url":"https://api.github.com/repos/resin-io/docker-progress/issues/comments{/number}","contents_url":"https://api.github.com/repos/resin-io/docker-progress/contents/{+path}","compare_url":"https://api.github.com/repos/resin-io/docker-progress/compare/{base}...{head}","merges_url":"https://api.github.com/repos/resin-io/docker-progress/merges","archive_url":"https://api.github.com/repos/resin-io/docker-progress/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/resin-io/docker-progress/downloads","issues_url":"https://api.github.com/repos/resin-io/docker-progress/issues{/number}","pulls_url":"https://api.github.com/repos/resin-io/docker-progress/pulls{/number}","milestones_url":"https://api.github.com/repos/resin-io/docker-progress/milestones{/number}","notifications_url":"https://api.github.com/repos/resin-io/docker-progress/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/resin-io/docker-progress/labels{/name}","releases_url":"https://api.github.com/repos/resin-io/docker-progress/releases{/id}","deployments_url":"https://api.github.com/repos/resin-io/docker-progress/deployments","created_at":"2015-10-30T11:10:51Z","updated_at":"2016-11-13T20:17:41Z","pushed_at":"2016-12-21T09:53:56Z","git_url":"git://github.com/resin-io/docker-progress.git","ssh_url":"git@github.com:resin-io/docker-progress.git","clone_url":"https://github.com/resin-io/docker-progress.git","svn_url":"https://github.com/resin-io/docker-progress","homepage":null,"size":56,"stargazers_count":2,"watchers_count":2,"language":"CoffeeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/10"},"html":{"href":"https://github.com/resin-io/docker-progress/pull/10"},"issue":{"href":"https://api.github.com/repos/resin-io/docker-progress/issues/10"},"comments":{"href":"https://api.github.com/repos/resin-io/docker-progress/issues/10/comments"},"review_comments":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/10/comments"},"review_comment":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/resin-io/docker-progress/pulls/10/commits"},"statuses":{"href":"https://api.github.com/repos/resin-io/docker-progress/statuses/f5eb2898e7ae2ebc1c7c44e5544175c46f5773e3"}}}}
{"actor":{"display_login":"Page-"}}