{"action":"created","comment":{"url":"https://api.github.com/repos/docker/machine/pulls/comments/45017188","id":45017188,"diff_hunk":"@@ -260,39 +259,122 @@ func (b *B2dUtils) CopyIsoToMachineDir(isoURL, machineName string) error {\n \t\t}\n \t}\n \n-\t// By default just copy the existing \"cached\" iso to\n-\t// the machine's directory...\n+\t// By default just copy the existing \"cached\" iso to the machine's directory...\n \tif isoURL == \"\" {\n-\t\tif err := b.copyDefaultIsoToMachine(machineIsoPath); err != nil {\n-\t\t\treturn err\n-\t\t}\n-\t} else {\n-\t\t//if ISO is specified, check if it matches a github releases url or fallback\n-\t\t//to a direct download\n-\t\tif downloadURL, err := b.GetLatestBoot2DockerReleaseURL(isoURL); err == nil {\n-\t\t\tlog.Infof(\"Downloading %s from %s...\", b.isoFilename, downloadURL)\n-\t\t\tif err := b.DownloadISO(machineDir, b.isoFilename, downloadURL); err != nil {\n-\t\t\t\treturn err\n-\t\t\t}\n-\t\t} else {\n-\t\t\treturn err\n-\t\t}\n+\t\treturn b.copyDefaultISOToMachine(machineIsoPath)\n \t}\n \n-\treturn nil\n+\t// if ISO is specified, check if it matches a github releases url or fallback to a direct download\n+\tdownloadURL, err := b.GetLatestBoot2DockerReleaseURL(isoURL)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tlog.Infof(\"Downloading %s from %s...\", b.isoFilename, downloadURL)\n+\treturn b.DownloadISO(machineDir, b.isoFilename, downloadURL)\n }\n \n-func (b *B2dUtils) copyDefaultIsoToMachine(machineIsoPath string) error {\n-\tif _, err := os.Stat(b.commonIsoPath); os.IsNotExist(err) {\n-\t\tlog.Info(\"No default boot2docker iso found locally, downloading the latest release...\")\n-\t\tif err := b.DownloadLatestBoot2Docker(\"\"); err != nil {\n+func (b *B2dUtils) copyDefaultISOToMachine(machineIsoPath string) error {\n+\t// just in case the cache dir has been manually deleted,\n+\t// check for it and recreate it if it's gone\n+\tif _, err := os.Stat(b.imgCachePath); os.IsNotExist(err) {\n+\t\tlog.Infof(\"Image cache directory does not exist, creating it at %s...\", b.imgCachePath)\n+\t\tif err := os.Mkdir(b.imgCachePath, 0700); err != nil {\n \t\t\treturn err\n \t\t}\n \t}\n \n-\tif err := CopyFile(b.commonIsoPath, machineIsoPath); err != nil {\n+\tapiURL := b.defaultURL\n+\texists := pathExists(b.commonIsoPath)\n+\tlatest := b.isLatestISO(apiURL)\n+\n+\tif exists && latest {\n+\t\tlog.Infof(\"Latest Boot2Docker ISO found locally, copying it to %s...\", machineIsoPath)\n+\t\treturn CopyFile(b.commonIsoPath, machineIsoPath)\n+\t}\n+\n+\tif !exists {\n+\t\tlog.Info(\"No default Boot2Docker ISO found locally, downloading the latest release...\")\n+\t} else if !latest {\n+\t\tlog.Info(\"Default Boot2Docker ISO is out-of-date, downloading the latest release...\")\n+\t}\n+\tif err := b.DownloadLatestBoot2Docker(apiURL); err != nil {\n \t\treturn err\n \t}\n \n-\treturn nil\n+\tlog.Infof(\"Copying %s to %s...\", b.commonIsoPath, machineIsoPath)\n+\treturn CopyFile(b.commonIsoPath, machineIsoPath)\n+}\n+\n+// isoVer scans isopath and returns its version tag.\n+func (b *B2dUtils) isoVer(isopath string) (string, error) {\n+\tiso, err := os.Open(isopath)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\tdefer iso.Close()\n+\n+\tisoMetadata := make([]byte, b.volumeIDLength)\n+\t_, err = iso.ReadAt(isoMetadata, b.volumeIDOffset)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\tverRegex := regexp.MustCompile(`v\\d+\\.\\d+\\.\\d+`)\n+\tver := string(verRegex.Find(isoMetadata))\n+\tlog.Debug(\"local Boot2Docker ISO version: \", ver)\n+\treturn ver, nil\n+}\n+\n+// isLatestISO checks the latest release version tag from apiURL and\n+// reports whether the local ISO cache is the latest version.\n+//\n+// It returns false if failing to get the local ISO version,\n+// and true if failing to fetch the latest release version tag.\n+func (b *B2dUtils) isLatestISO(apiURL string) bool {\n+\tlocalVer, err := b.isoVer(b.commonIsoPath)\n+\tif err != nil {\n+\t\tlog.Warn(\"Unable to get the local Boot2Docker ISO version: \", err)\n+\t\treturn false\n+\t}\n+\n+\tlatestVer, err := b.getReleaseTag(apiURL)\n+\tif err != nil {\n+\t\tlog.Warn(\"Unable to get the latest Boot2Docker ISO release version: \", err)\n+\t\treturn true\n+\t}\n+\n+\treturn localVer == latestVer\n+}\n+\n+// getReleaseTag gets the latest release version tag from apiURL.\n+// It assumes that the JSON response of apiURL has \"tag_name\" attribute.\n+func (b *B2dUtils) getReleaseTag(apiURL string) (string, error) {\n+\tclient := getClient()\n+\treq, err := b.getReleasesRequest(apiURL)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\trsp, err := client.Do(req)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\tdefer rsp.Body.Close()\n+\n+\tvar t struct {\n+\t\tTagName string `json:\"tag_name\"`\n+\t}\n+\tif err := json.NewDecoder(rsp.Body).Decode(&t); err != nil {\n+\t\treturn \"\", err\n+\t}\n+\tif t.TagName == \"\" {\n+\t\treturn \"\", errGitHubAPIResponse\n+\t}\n+\treturn t.TagName, nil\n+}\n+\n+// pathExists reports whether a file or directory specified by path exists.\n+func pathExists(path string) bool {","path":"libmachine/mcnutils/b2d.go","position":282,"original_position":282,"commit_id":"9cd51c279448b4fbdf025ba596d1ad242ec58046","original_commit_id":"9cd51c279448b4fbdf025ba596d1ad242ec58046","user":{"login":"nathanleclaire","id":1476820,"avatar_url":"https://avatars.githubusercontent.com/u/1476820?v=3","gravatar_id":"","url":"https://api.github.com/users/nathanleclaire","html_url":"https://github.com/nathanleclaire","followers_url":"https://api.github.com/users/nathanleclaire/followers","following_url":"https://api.github.com/users/nathanleclaire/following{/other_user}","gists_url":"https://api.github.com/users/nathanleclaire/gists{/gist_id}","starred_url":"https://api.github.com/users/nathanleclaire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nathanleclaire/subscriptions","organizations_url":"https://api.github.com/users/nathanleclaire/orgs","repos_url":"https://api.github.com/users/nathanleclaire/repos","events_url":"https://api.github.com/users/nathanleclaire/events{/privacy}","received_events_url":"https://api.github.com/users/nathanleclaire/received_events","type":"User","site_admin":false},"body":"For instance, this could become a method on aj interface and embedded into the `B2DUtils` struct:\r\n\r\n```go\r\ntype PathChecker interface {\r\n    PathExists(string) bool\r\n}\r\n\r\ntype StatPathChecker struct {}\r\n\r\nfunc (spc *StatPathChecker) PathExists(path string) bool {\r\n    _, err := os.Stat(path)\r\n    return os.IsNotExist(err)\r\n}\r\n\r\ntype B2DUtils struct {\r\n    StatPathChecker\r\n    ...\r\n}\r\n```","created_at":"2015-11-17T02:57:20Z","updated_at":"2015-11-17T02:57:20Z","html_url":"https://github.com/docker/machine/pull/2298#discussion_r45017188","pull_request_url":"https://api.github.com/repos/docker/machine/pulls/2298","_links":{"self":{"href":"https://api.github.com/repos/docker/machine/pulls/comments/45017188"},"html":{"href":"https://github.com/docker/machine/pull/2298#discussion_r45017188"},"pull_request":{"href":"https://api.github.com/repos/docker/machine/pulls/2298"}}},"pull_request":{"url":"https://api.github.com/repos/docker/machine/pulls/2298","id":50725939,"html_url":"https://github.com/docker/machine/pull/2298","diff_url":"https://github.com/docker/machine/pull/2298.diff","patch_url":"https://github.com/docker/machine/pull/2298.patch","issue_url":"https://api.github.com/repos/docker/machine/issues/2298","number":2298,"state":"open","locked":false,"title":"Upgrade the boot2docker.iso cache if possible when creating a VirtualBox machine","user":{"login":"skatsuta","id":5638269,"avatar_url":"https://avatars.githubusercontent.com/u/5638269?v=3","gravatar_id":"","url":"https://api.github.com/users/skatsuta","html_url":"https://github.com/skatsuta","followers_url":"https://api.github.com/users/skatsuta/followers","following_url":"https://api.github.com/users/skatsuta/following{/other_user}","gists_url":"https://api.github.com/users/skatsuta/gists{/gist_id}","starred_url":"https://api.github.com/users/skatsuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skatsuta/subscriptions","organizations_url":"https://api.github.com/users/skatsuta/orgs","repos_url":"https://api.github.com/users/skatsuta/repos","events_url":"https://api.github.com/users/skatsuta/events{/privacy}","received_events_url":"https://api.github.com/users/skatsuta/received_events","type":"User","site_admin":false},"body":"close #1790 \r\n\r\nThis PR will\r\n\r\n- check the version of the local ISO cache and the latest release tag, then upgrade the ISO if possible when creating a VirtualBox machine from boot2docker.iso.\r\n- add many unit tests for `B2dUtils`'s methods \r\n\r\nSigned-off-by: Soshi Katsuta <soshi.katsuta@gmail.com>","created_at":"2015-11-14T15:50:50Z","updated_at":"2015-11-17T02:57:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"71384dc09d8d161874139c01f086e9c1f70b935f","assignee":{"login":"nathanleclaire","id":1476820,"avatar_url":"https://avatars.githubusercontent.com/u/1476820?v=3","gravatar_id":"","url":"https://api.github.com/users/nathanleclaire","html_url":"https://github.com/nathanleclaire","followers_url":"https://api.github.com/users/nathanleclaire/followers","following_url":"https://api.github.com/users/nathanleclaire/following{/other_user}","gists_url":"https://api.github.com/users/nathanleclaire/gists{/gist_id}","starred_url":"https://api.github.com/users/nathanleclaire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nathanleclaire/subscriptions","organizations_url":"https://api.github.com/users/nathanleclaire/orgs","repos_url":"https://api.github.com/users/nathanleclaire/repos","events_url":"https://api.github.com/users/nathanleclaire/events{/privacy}","received_events_url":"https://api.github.com/users/nathanleclaire/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/docker/machine/milestones/7","html_url":"https://github.com/docker/machine/milestones/0.5.2","labels_url":"https://api.github.com/repos/docker/machine/milestones/7/labels","id":1373606,"number":7,"title":"0.5.2","description":"","creator":{"login":"dmp42","id":332946,"avatar_url":"https://avatars.githubusercontent.com/u/332946?v=3","gravatar_id":"","url":"https://api.github.com/users/dmp42","html_url":"https://github.com/dmp42","followers_url":"https://api.github.com/users/dmp42/followers","following_url":"https://api.github.com/users/dmp42/following{/other_user}","gists_url":"https://api.github.com/users/dmp42/gists{/gist_id}","starred_url":"https://api.github.com/users/dmp42/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmp42/subscriptions","organizations_url":"https://api.github.com/users/dmp42/orgs","repos_url":"https://api.github.com/users/dmp42/repos","events_url":"https://api.github.com/users/dmp42/events{/privacy}","received_events_url":"https://api.github.com/users/dmp42/received_events","type":"User","site_admin":false},"open_issues":41,"closed_issues":2,"state":"open","created_at":"2015-10-24T04:11:58Z","updated_at":"2015-11-17T02:41:18Z","due_on":"2015-11-30T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/docker/machine/pulls/2298/commits","review_comments_url":"https://api.github.com/repos/docker/machine/pulls/2298/comments","review_comment_url":"https://api.github.com/repos/docker/machine/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/machine/issues/2298/comments","statuses_url":"https://api.github.com/repos/docker/machine/statuses/9cd51c279448b4fbdf025ba596d1ad242ec58046","head":{"label":"skatsuta:create-update-iso","ref":"create-update-iso","sha":"9cd51c279448b4fbdf025ba596d1ad242ec58046","user":{"login":"skatsuta","id":5638269,"avatar_url":"https://avatars.githubusercontent.com/u/5638269?v=3","gravatar_id":"","url":"https://api.github.com/users/skatsuta","html_url":"https://github.com/skatsuta","followers_url":"https://api.github.com/users/skatsuta/followers","following_url":"https://api.github.com/users/skatsuta/following{/other_user}","gists_url":"https://api.github.com/users/skatsuta/gists{/gist_id}","starred_url":"https://api.github.com/users/skatsuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skatsuta/subscriptions","organizations_url":"https://api.github.com/users/skatsuta/orgs","repos_url":"https://api.github.com/users/skatsuta/repos","events_url":"https://api.github.com/users/skatsuta/events{/privacy}","received_events_url":"https://api.github.com/users/skatsuta/received_events","type":"User","site_admin":false},"repo":{"id":39942729,"name":"machine","full_name":"skatsuta/machine","owner":{"login":"skatsuta","id":5638269,"avatar_url":"https://avatars.githubusercontent.com/u/5638269?v=3","gravatar_id":"","url":"https://api.github.com/users/skatsuta","html_url":"https://github.com/skatsuta","followers_url":"https://api.github.com/users/skatsuta/followers","following_url":"https://api.github.com/users/skatsuta/following{/other_user}","gists_url":"https://api.github.com/users/skatsuta/gists{/gist_id}","starred_url":"https://api.github.com/users/skatsuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/skatsuta/subscriptions","organizations_url":"https://api.github.com/users/skatsuta/orgs","repos_url":"https://api.github.com/users/skatsuta/repos","events_url":"https://api.github.com/users/skatsuta/events{/privacy}","received_events_url":"https://api.github.com/users/skatsuta/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/skatsuta/machine","description":"Machine management for a container-centric world","fork":true,"url":"https://api.github.com/repos/skatsuta/machine","forks_url":"https://api.github.com/repos/skatsuta/machine/forks","keys_url":"https://api.github.com/repos/skatsuta/machine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/skatsuta/machine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/skatsuta/machine/teams","hooks_url":"https://api.github.com/repos/skatsuta/machine/hooks","issue_events_url":"https://api.github.com/repos/skatsuta/machine/issues/events{/number}","events_url":"https://api.github.com/repos/skatsuta/machine/events","assignees_url":"https://api.github.com/repos/skatsuta/machine/assignees{/user}","branches_url":"https://api.github.com/repos/skatsuta/machine/branches{/branch}","tags_url":"https://api.github.com/repos/skatsuta/machine/tags","blobs_url":"https://api.github.com/repos/skatsuta/machine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/skatsuta/machine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/skatsuta/machine/git/refs{/sha}","trees_url":"https://api.github.com/repos/skatsuta/machine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/skatsuta/machine/statuses/{sha}","languages_url":"https://api.github.com/repos/skatsuta/machine/languages","stargazers_url":"https://api.github.com/repos/skatsuta/machine/stargazers","contributors_url":"https://api.github.com/repos/skatsuta/machine/contributors","subscribers_url":"https://api.github.com/repos/skatsuta/machine/subscribers","subscription_url":"https://api.github.com/repos/skatsuta/machine/subscription","commits_url":"https://api.github.com/repos/skatsuta/machine/commits{/sha}","git_commits_url":"https://api.github.com/repos/skatsuta/machine/git/commits{/sha}","comments_url":"https://api.github.com/repos/skatsuta/machine/comments{/number}","issue_comment_url":"https://api.github.com/repos/skatsuta/machine/issues/comments{/number}","contents_url":"https://api.github.com/repos/skatsuta/machine/contents/{+path}","compare_url":"https://api.github.com/repos/skatsuta/machine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/skatsuta/machine/merges","archive_url":"https://api.github.com/repos/skatsuta/machine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/skatsuta/machine/downloads","issues_url":"https://api.github.com/repos/skatsuta/machine/issues{/number}","pulls_url":"https://api.github.com/repos/skatsuta/machine/pulls{/number}","milestones_url":"https://api.github.com/repos/skatsuta/machine/milestones{/number}","notifications_url":"https://api.github.com/repos/skatsuta/machine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/skatsuta/machine/labels{/name}","releases_url":"https://api.github.com/repos/skatsuta/machine/releases{/id}","created_at":"2015-07-30T09:34:12Z","updated_at":"2015-07-30T09:34:12Z","pushed_at":"2015-11-17T02:04:33Z","git_url":"git://github.com/skatsuta/machine.git","ssh_url":"git@github.com:skatsuta/machine.git","clone_url":"https://github.com/skatsuta/machine.git","svn_url":"https://github.com/skatsuta/machine","homepage":"https://docs.docker.com/machine/","size":10358,"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":"docker:master","ref":"master","sha":"7e8e38e1485187c0064e054029bb1cc68c87d39a","user":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"repo":{"id":27494663,"name":"machine","full_name":"docker/machine","owner":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/docker/machine","description":"Machine management for a container-centric world","fork":false,"url":"https://api.github.com/repos/docker/machine","forks_url":"https://api.github.com/repos/docker/machine/forks","keys_url":"https://api.github.com/repos/docker/machine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/machine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/machine/teams","hooks_url":"https://api.github.com/repos/docker/machine/hooks","issue_events_url":"https://api.github.com/repos/docker/machine/issues/events{/number}","events_url":"https://api.github.com/repos/docker/machine/events","assignees_url":"https://api.github.com/repos/docker/machine/assignees{/user}","branches_url":"https://api.github.com/repos/docker/machine/branches{/branch}","tags_url":"https://api.github.com/repos/docker/machine/tags","blobs_url":"https://api.github.com/repos/docker/machine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/machine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/machine/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/machine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/machine/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/machine/languages","stargazers_url":"https://api.github.com/repos/docker/machine/stargazers","contributors_url":"https://api.github.com/repos/docker/machine/contributors","subscribers_url":"https://api.github.com/repos/docker/machine/subscribers","subscription_url":"https://api.github.com/repos/docker/machine/subscription","commits_url":"https://api.github.com/repos/docker/machine/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/machine/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/machine/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/machine/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/machine/contents/{+path}","compare_url":"https://api.github.com/repos/docker/machine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/machine/merges","archive_url":"https://api.github.com/repos/docker/machine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/machine/downloads","issues_url":"https://api.github.com/repos/docker/machine/issues{/number}","pulls_url":"https://api.github.com/repos/docker/machine/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/machine/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/machine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/machine/labels{/name}","releases_url":"https://api.github.com/repos/docker/machine/releases{/id}","created_at":"2014-12-03T15:52:06Z","updated_at":"2015-11-16T17:44:42Z","pushed_at":"2015-11-17T02:38:43Z","git_url":"git://github.com/docker/machine.git","ssh_url":"git@github.com:docker/machine.git","clone_url":"https://github.com/docker/machine.git","svn_url":"https://github.com/docker/machine","homepage":"https://docs.docker.com/machine/","size":30263,"stargazers_count":2681,"watchers_count":2681,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":599,"mirror_url":null,"open_issues_count":407,"forks":599,"open_issues":407,"watchers":2681,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/machine/pulls/2298"},"html":{"href":"https://github.com/docker/machine/pull/2298"},"issue":{"href":"https://api.github.com/repos/docker/machine/issues/2298"},"comments":{"href":"https://api.github.com/repos/docker/machine/issues/2298/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/machine/pulls/2298/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/machine/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/machine/pulls/2298/commits"},"statuses":{"href":"https://api.github.com/repos/docker/machine/statuses/9cd51c279448b4fbdf025ba596d1ad242ec58046"}}}}